dsh-plugin-t-expert 0.3.72 → 0.3.88
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/THIRD-PARTY-NOTICES +1 -1
- package/data/experts/engineering/engineering-deepseek-harness-project-expert.md +5 -5
- package/lib/client.js +704 -518
- package/lib/command.js +7 -0
- package/lib/index.js +2 -4
- package/lib/remote.js +33 -33
- package/lib/schedule.js +6 -3
- package/lib/skill.js +11 -12
- package/lib/teams/command.js +6 -2
- package/lib/teams/index.js +2 -2
- package/lib/teams/members.js +2 -2
- package/lib/teams/quality-gates.js +8 -2
- package/lib/teams/scheduler.js +207 -14
- package/lib/teams/tools.js +12 -0
- package/package.json +1 -3
- package/skills/dsh-harness-languages/SKILL.md +0 -175
- package/skills/dsh-harness-project/SKILL.md +0 -236
package/lib/client.js
CHANGED
|
@@ -43,7 +43,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
43
43
|
var import_react9 = __toESM(require("react"), 1);
|
|
44
44
|
|
|
45
45
|
// inlined team-engine client bundle
|
|
46
|
-
var client_bundle_default = 'window.__ModuleLoader__.load({\n id: "dsh-plugin-t-expert",\n factory: (require) => {\n var module = { exports: {} };\n var exports = module.exports;\n Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });\n let react_jsx_runtime = require("react/jsx-runtime");\n let react = require("react");\n let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");\n /** Compact `provider/model` route, or just the model when the provider is absent. */\n function memberRouteLabel(member) {\n if (member === void 0) return "";\n const provider = member.provider?.trim() ?? "";\n const model = member.model?.trim() ?? "";\n if (provider !== "" && model !== "") return `${provider}/${model}`;\n return model;\n }\n /**\n * Compact route shown on a running task. Prefer the task\'s own snapshot\n * field; fall back to the assignee member when older hosts omit it.\n */\n function taskModelLabel(task, members) {\n const direct = task.model?.trim() ?? "";\n if (direct !== "") return direct;\n return memberRouteLabel(members.find((candidate) => candidate.name === task.assignee));\n }\n /** Short model id for tight DAG/chip surfaces (`openai/gpt-5.6-sol` \u2192 `gpt-5.6-sol`). */\n function compactModelLabel(route) {\n const trimmed = route.trim();\n if (trimmed === "") return "";\n const slash = trimmed.lastIndexOf("/");\n return slash === -1 ? trimmed : trimmed.slice(slash + 1);\n }\n /** Whether the captain chat should keep showing the in-progress banner. */\n function teamIsActive(team) {\n if (team.halted === true || team.phase === "staged") return false;\n if (team.members.some((member) => member.activity === "working" || member.status === "working")) return true;\n if (team.tasks.some((task) => task.status === "pending" || task.status === "claimed" || task.status === "in_progress")) return true;\n return team.members.length > 0 && team.tasks.length === 0;\n }\n /** Use a fill-width grid when the task graph has no real dependency edges. */\n function usesParallelTaskGrid(tasks) {\n if (tasks.length === 0) return false;\n const taskIds = new Set(tasks.map((task) => task.id));\n return tasks.every((task) => task.dependencies.every((dependency) => !taskIds.has(dependency)));\n }\n /**\n * Whether an expanded activity panel still belongs to the current session.\n *\n * The panel is mounted in the root-scoped shell overlay, so React does not\n * remount it when the conversation route changes. Ownership keeps an expanded\n * panel from leaking onto the new-session screen (or another conversation)\n * while its local open state is being reset.\n */\n function activityPanelExpandedForSession(open, owner, current) {\n return open && owner !== void 0 && owner === current;\n }\n /**\n * Auto-expand only for live teams that appear after the current session\'s\n * initial restore pass. Replayed cards, archived teams, and live teams restored\n * while reopening a conversation must remain behind the collapsed badge.\n */\n function activityPanelShouldAutoExpand({ alreadyAutoOpened, pageSettled, restoreComplete, previousLiveTeamIds, currentLiveTeamIds }) {\n return !alreadyAutoOpened && pageSettled && restoreComplete && currentLiveTeamIds.some((teamId) => !previousLiveTeamIds.has(teamId));\n }\n /**\n * Resolve the task whose dependency chain should be highlighted.\n *\n * A pinned task is an explicit user choice. Keyboard focus takes precedence\n * over delayed pointer intent so an older hover timer cannot steal the active\n * chain from someone navigating the task map with the keyboard.\n */\n function dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId) {\n return pinnedTaskId ?? keyboardTaskId ?? hoverTaskId;\n }\n /** Group tasks by their precomputed dependency depth. */\n function taskStages(tasks) {\n const byDepth = /* @__PURE__ */ new Map();\n for (const task of tasks) {\n const depth = Number.isFinite(task.depth) ? Math.max(0, Math.floor(task.depth)) : 0;\n const stage = byDepth.get(depth) ?? [];\n stage.push(task);\n byDepth.set(depth, stage);\n }\n return [...byDepth.entries()].sort(([left], [right]) => left - right).map(([depth, stageTasks]) => ({\n depth,\n tasks: stageTasks.slice().sort((left, right) => left.id.localeCompare(right.id, "en", { numeric: true }))\n }));\n }\n /**\n * Lay tasks out as the reference panel\'s compact left-to-right DAG.\n *\n * Columns are dependency-depth stages. Rows are stable task-id order within\n * each stage. Edges use cubic curves so fan-in remains readable without\n * turning every task into a large card.\n */\n function compactDagLayout(tasks) {\n const stages = taskStages(tasks);\n const positions = /* @__PURE__ */ new Map();\n const nodes = [];\n for (const [column, stage] of stages.entries()) for (const [row, task] of stage.tasks.entries()) {\n const x = column * 118;\n const y = row * 38;\n positions.set(task.id, {\n x,\n y\n });\n nodes.push({\n task,\n x,\n y\n });\n }\n const edges = [];\n for (const task of tasks) {\n const target = positions.get(task.id);\n if (target === void 0) continue;\n for (const dependency of task.dependencies) {\n const source = positions.get(dependency);\n if (source === void 0) continue;\n const x1 = source.x + 92;\n const y1 = source.y + 30 / 2;\n const x2 = target.x;\n const y2 = target.y + 30 / 2;\n edges.push({\n from: dependency,\n to: task.id,\n path: `M${x1} ${y1}C${x1 + 14} ${y1},${x2 - 14} ${y2},${x2} ${y2}`\n });\n }\n }\n const rows = Math.max(1, ...stages.map((stage) => stage.tasks.length));\n return {\n width: stages.length === 0 ? 0 : stages.length * 92 + (stages.length - 1) * 26,\n height: stages.length === 0 ? 0 : rows * 30 + (rows - 1) * 8,\n nodes,\n edges\n };\n }\n /**\n * Return the complete upstream/downstream chain around one task.\n *\n * Traversal uses both dependency directions and remains cycle-safe, so the UI\n * can highlight every handoff related to the focused task even if malformed\n * durable data contains a cycle.\n */\n function relatedTaskIds(taskId, tasks) {\n const byId = new Map(tasks.map((task) => [task.id, task]));\n if (!byId.has(taskId)) return /* @__PURE__ */ new Set();\n const dependents = /* @__PURE__ */ new Map();\n for (const task of tasks) for (const dependency of task.dependencies) {\n const targets = dependents.get(dependency) ?? [];\n targets.push(task.id);\n dependents.set(dependency, targets);\n }\n const related = /* @__PURE__ */ new Set();\n const upstreamSeen = /* @__PURE__ */ new Set();\n const downstreamSeen = /* @__PURE__ */ new Set();\n const visitUpstream = (id) => {\n if (upstreamSeen.has(id)) return;\n upstreamSeen.add(id);\n related.add(id);\n for (const dependency of byId.get(id)?.dependencies ?? []) visitUpstream(dependency);\n };\n const visitDownstream = (id) => {\n if (downstreamSeen.has(id)) return;\n downstreamSeen.add(id);\n related.add(id);\n for (const dependent of dependents.get(id) ?? []) visitDownstream(dependent);\n };\n visitUpstream(taskId);\n visitDownstream(taskId);\n return related;\n }\n\n\n /** Shared, demand-driven state for the T Team browser monitor. */\n const targets = /* @__PURE__ */ new Map();\n const targetListeners = /* @__PURE__ */ new Set();\n const snapshotListeners = /* @__PURE__ */ new Set();\n let targetSnapshot = [];\n let activitySnapshots = {\n teams: [],\n archivedTeams: []\n };\n function targetKey(sessionId, teamId) {\n return `${sessionId}\\u0000${teamId}`;\n }\n function publishTargets() {\n targetSnapshot = [...targets.values()].filter((target) => target.active).map(({ key, sessionId, teamId }) => ({\n key,\n sessionId,\n teamId\n }));\n for (const listener of targetListeners) listener();\n }\n /** Subscribe to the active monitor-target list (React external-store shape). */\n function subscribeActivityMonitorTargets(listener) {\n targetListeners.add(listener);\n return () => {\n targetListeners.delete(listener);\n };\n }\n /** Read the stable active-target snapshot. */\n function getActivityMonitorTargetsSnapshot() {\n return targetSnapshot;\n }\n /**\n * Register one successful T Team card as a monitoring demand.\n *\n * The returned cleanup is reference-counted so multiple cards and React\n * StrictMode remounts cannot stop another card\'s monitor.\n */\n function monitorAgentTeam(sessionId, teamId) {\n const owner = sessionId.trim();\n const id = teamId.trim();\n if (owner === "" || id === "") return () => {};\n const key = targetKey(owner, id);\n const existing = targets.get(key);\n if (existing === void 0) {\n targets.set(key, {\n key,\n sessionId: owner,\n teamId: id,\n refs: 1,\n active: true\n });\n publishTargets();\n } else {\n existing.refs += 1;\n if (!existing.active) {\n existing.active = true;\n publishTargets();\n }\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const current = targets.get(key);\n if (current === void 0) return;\n current.refs -= 1;\n if (current.refs <= 0) {\n targets.delete(key);\n if (current.active) publishTargets();\n }\n };\n }\n /** Stop polling targets whose final archived snapshot has been captured. */\n function settleActivityMonitorTargets(keys) {\n let changed = false;\n for (const key of keys) {\n const target = targets.get(key);\n if (target?.active !== true) continue;\n target.active = false;\n changed = true;\n }\n if (changed) publishTargets();\n }\n /** Subscribe to the shared live/archive snapshot. */\n function subscribeActivitySnapshots(listener) {\n snapshotListeners.add(listener);\n return () => {\n snapshotListeners.delete(listener);\n };\n }\n /** Read the stable shared live/archive snapshot. */\n function getActivitySnapshotsSnapshot() {\n return activitySnapshots;\n }\n /** Publish one or both successful state-route responses. */\n function updateActivitySnapshots(update) {\n const next = {\n teams: update.teams ?? activitySnapshots.teams,\n archivedTeams: update.archivedTeams ?? activitySnapshots.archivedTeams\n };\n if (next.teams === activitySnapshots.teams && next.archivedTeams === activitySnapshots.archivedTeams) return;\n activitySnapshots = next;\n for (const listener of snapshotListeners) listener();\n }\n /** Poll cadence for the live host snapshot route. */\n const ACTIVITY_POLL_MS = 1e3;\n /**\n * Low-frequency probe cadence while a cardless discovery session still owns\n * no team. The probe keeps the panel able to pick up a team created later in\n * that session (e.g. a run_code-wrapped t_team_create) without turning\n * every ordinary session into a one-second filesystem scan.\n */\n const ACTIVITY_PROBE_MS = 5e3;\n /** Host route serving live and archived team snapshots. */\n const ACTIVITY_STATE_URL = "/plugins/t-team/state";\n const ACTIVITY_HALT_URL = "/plugins/t-team/halt";\n /**\n * Start the single polling loop for the current session\'s requested targets.\n *\n * With neither targets nor a discovery session this is deliberately inert.\n * Explicit card targets poll at the live cadence from the start. A discovery\n * session performs an immediate live+archive restore pass, then \u2014 while it\n * still owns no team \u2014 probes on a low-frequency cadence, so a team created\n * later in that session (e.g. a run_code-wrapped t_team_create) is\n * discovered without a manual reload, without turning every ordinary session\n * into a one-second filesystem scan. The moment a team for the discovery\n * session appears, the controller upgrades to the live one-second cadence for\n * the rest of its lifetime. The caller \u2014 the session view, which stops the\n * controller when the session is no longer current \u2014 bounds the lifetime, and\n * archive state is refreshed when a target or a previously discovered live\n * team disappears.\n */\n function startActivityPolling(monitorTargets, runtime = {}) {\n const discoverySessionId = runtime.discoverySessionId?.trim();\n if (monitorTargets.length === 0 && (discoverySessionId === void 0 || discoverySessionId === "")) return {\n firstTick: Promise.resolve(),\n stop: () => {}\n };\n const fetchState = runtime.fetchState ?? ((url, init) => fetch(url, init));\n const schedule = runtime.schedule ?? ((callback, intervalMs) => setInterval(callback, intervalMs));\n const cancel = runtime.cancel ?? ((timer) => {\n clearInterval(timer);\n });\n const publishSnapshots = runtime.publishSnapshots ?? updateActivitySnapshots;\n const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;\n let cancelled = false;\n let inFlight = false;\n let hot = monitorTargets.length > 0;\n let discoveryComplete = false;\n let discoveredLiveKeys = /* @__PURE__ */ new Set();\n let controller;\n let timer;\n const intervalMs = () => hot ? ACTIVITY_POLL_MS : ACTIVITY_PROBE_MS;\n const reschedule = () => {\n cancel(timer);\n timer = schedule(() => {\n tick();\n }, intervalMs());\n };\n const tick = async () => {\n if (inFlight || cancelled) return;\n inFlight = true;\n controller = new AbortController();\n try {\n const liveResponse = await fetchState(ACTIVITY_STATE_URL, {\n cache: "no-store",\n signal: controller.signal\n });\n if (!liveResponse.ok) return;\n const body = await liveResponse.json();\n if (cancelled || !Array.isArray(body.teams)) return;\n const liveTeams = body.teams;\n publishSnapshots({ teams: liveTeams });\n const previousDiscoveredKeys = discoveredLiveKeys;\n discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));\n if (!hot && discoveredLiveKeys.size > 0) {\n hot = true;\n reschedule();\n }\n const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));\n const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));\n const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;\n if (missing.length === 0 && !needsDiscoveryArchive && !discoveredTeamArchived) return;\n const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {\n cache: "no-store",\n signal: controller.signal\n });\n if (!archivedResponse.ok) return;\n const archivedBody = await archivedResponse.json();\n if (cancelled || !Array.isArray(archivedBody.teams)) return;\n publishSnapshots({ archivedTeams: archivedBody.teams });\n discoveryComplete = true;\n settleTargets(new Set(missing.map((target) => target.key)));\n } catch (error) {\n if (error?.name === "AbortError") return;\n } finally {\n inFlight = false;\n }\n };\n const firstTick = tick();\n if (timer === void 0) timer = schedule(() => {\n tick();\n }, intervalMs());\n return {\n firstTick,\n stop: () => {\n if (cancelled) return;\n cancelled = true;\n controller?.abort();\n cancel(timer);\n }\n };\n }\n\n\n /**\n * Shared whale artwork lookup for the activity panel and the conversation\n * card: role keywords map to the packaged role images; the captain always\n * uses the lead whale.\n * @module t-team/client/artwork\n */\n /** Artwork route prefix served by the plugin host half. */\n const ART_BASE = "/plugins/t-team/assets/";\n /** V2 whale role artwork per role keyword. */\n const ROLE_ART = [\n [/data|analys|metric|performance|\u6570\u636E|\u5206\u6790|\u6307\u6807|\u6027\u80FD/, "member-data-v2.png"],\n [/resear|investig|explor|study|\u7814\u7A76|\u8C03\u67E5|\u63A2\u7D22|\u8C03\u7814/, "member-researcher-v2.png"],\n [/\\bqa\\b|test|verif|quality|\u6D4B\u8BD5|\u8D28\u91CF|\u9A8C\u8BC1/, "member-qa-v2.png"],\n [/engineer|dev\\b|server|backend|\\bapi\\b|runtime|watcher|contract|\u5DE5\u7A0B|\u540E\u7AEF|\u670D\u52A1|\u63A5\u53E3|\u5F00\u53D1|\u4EE3\u7801|\u7F16\u7A0B/, "member-engineer-v2.png"],\n [/design|\\bui\\b|\\bux\\b|front|theme|accessib|\u8BBE\u8BA1|\u524D\u7AEF|\u4E3B\u9898|\u65E0\u969C\u788D/, "member-designer-v2.png"],\n [/secur|audit|risk|threat|review|\u5B89\u5168|\u5BA1\u8BA1|\u5BA1\u67E5|\u98CE\u9669/, "member-security-v2.png"],\n [/docs|writer|product|spec|\u64B0\u5199|\u6587\u6848|\u5199\u4F5C|\u6587\u6863|\u89C4\u8303/, "member-docs-v2.png"],\n [/release|\\bbuild\\b|deploy|\\bops\\b|\\bci\\b|ship|coordin|\u53D1\u5E03|\u6784\u5EFA|\u90E8\u7F72|\u8FD0\u7EF4|\u534F\u8C03/, "member-operator-v2.png"]\n ];\n /** Captain artwork (always the lead whale). */\n const LEAD_ART = `${ART_BASE}team-lead-v2.png`;\n /** Status action artwork per member activity. */\n const ACTION_ART = {\n working: `${ART_BASE}action-working-v2.png`,\n idle: `${ART_BASE}action-sleeping-v2.png`,\n unknown: `${ART_BASE}action-thinking-v2.png`\n };\n /**\n * Member artwork URL, or null when no role matches (initial-letter fallback).\n * @param name - the member\'s display name.\n * @param role - the member\'s role text.\n * @returns the artwork URL, or null when unmatched.\n */\n function memberArtUrl(name, role) {\n const identity = `${name} ${role}`.toLowerCase();\n for (const [pattern, art] of ROLE_ART) if (pattern.test(identity)) return `${ART_BASE}${art}`;\n return null;\n }\n\n\n const css$1 = ".kPAopq_root{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:10px;flex-direction:column;gap:8px;width:100%;min-width:0;padding:10px 12px;display:flex}.kPAopq_head{align-items:center;gap:8px;min-width:0;display:flex}.kPAopq_leadAvatar{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0;flex:none;width:30px;height:30px}.kPAopq_teamName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.kPAopq_memberCount{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;margin-left:auto;font-size:11px;line-height:16px}.kPAopq_panelButton{border:1px solid var(--dsw-alias-line-strong);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;flex:none;padding:2px 8px;font-size:10.5px;font-weight:600;line-height:16px;transition:border-color .12s,color .12s}.kPAopq_panelButton:hover{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.kPAopq_panelButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_members{flex-wrap:wrap;gap:6px;min-width:0;display:flex}.kPAopq_member{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);max-width:160px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:5px;padding:3px 8px 3px 3px;font-size:11px;font-weight:500;line-height:16px;transition:border-color .12s,background-color .12s;display:inline-flex}.kPAopq_member:hover{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-bg-fill-neutral)}.kPAopq_member:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d482e);background:0 0;border:0;border-radius:0;width:24px;height:24px}.kPAopq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:20px;height:20px;color:var(--dsw-alias-label-on-fill);border-radius:50%;justify-content:center;align-items:center;font-size:10px;font-weight:600;line-height:20px;display:inline-flex}.kPAopq_memberName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";\n const tagId$1 = "dsh-plugin-t-expert/TTeamCard.module.css";\n if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {\n const tag = document.createElement("style");\n tag.dataset.plugin = "dsh-plugin-t-expert";\n tag.dataset.pluginCss = tagId$1;\n tag.textContent = css$1;\n document.head.appendChild(tag);\n }\n var TTeamCard_module_css_default = {\n "head": "kPAopq_head",\n "leadAvatar": "kPAopq_leadAvatar",\n "member": "kPAopq_member",\n "memberArt": "kPAopq_memberArt",\n "memberCount": "kPAopq_memberCount",\n "memberInitial": "kPAopq_memberInitial",\n "memberName": "kPAopq_memberName",\n "members": "kPAopq_members",\n "panelButton": "kPAopq_panelButton",\n "root": "kPAopq_root",\n "teamName": "kPAopq_teamName"\n };\n\n\n /**\n * T Team conversation card: the lightweight in-conversation summary for\n * one team \u2014 the captain\'s whale avatar and name, the member roster as\n * clickable whale avatars (opening the member\'s subagent transcript), and\n * an "activity panel" button that re-activates the top-right floater.\n *\n * The floater and this card share the `t-team:open-panel` window event\n * so the card can summon the panel even after it was closed (or when an old\n * session is re-opened for review).\n * @module t-team/client/card\n */\n /** Window event name the floater listens for to open itself. */\n const OPEN_PANEL_EVENT = "t-team:open-panel";\n /** Re-activate the top-right activity panel, carrying this team\'s summary\n * so the panel can show it even when the team no longer exists on disk\n * (historical session review). */\n function openActivityPanel(data) {\n window.dispatchEvent(new CustomEvent(OPEN_PANEL_EVENT, { detail: {\n teamId: data.teamId,\n captainSessionId: data.captainSessionId,\n teamName: data.teamName,\n members: data.members\n } }));\n }\n /** Render one durable team as a compact conversation card. */\n function TTeamCard({ node, openMember, sessionId, t }) {\n const data = node.data;\n const owner = data.captainSessionId || sessionId;\n const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n (0, react.useEffect)(() => {\n return monitorAgentTeam(owner, data.teamId);\n }, [data.teamId, owner]);\n const snapshot = teams.find((team) => team.teamId === data.teamId && (owner === "" || team.captainSessionId === owner)) ?? archivedTeams.find((team) => team.teamId === data.teamId && (owner === "" || team.captainSessionId === owner));\n const resolved = (0, react.useMemo)(() => ({\n ...data,\n captainSessionId: snapshot?.captainSessionId ?? owner,\n teamName: snapshot?.name ?? data.teamName,\n members: snapshot?.members.map((member) => ({\n id: member.id,\n name: member.name,\n role: member.role\n })) ?? data.members\n }), [\n data,\n owner,\n snapshot\n ]);\n return (0, react_jsx_runtime.jsxs)("section", {\n className: TTeamCard_module_css_default.root,\n "data-t-team-card": true,\n "data-team-id": resolved.teamId,\n children: [(0, react_jsx_runtime.jsxs)("header", {\n className: TTeamCard_module_css_default.head,\n children: [\n (0, react_jsx_runtime.jsx)("img", {\n className: TTeamCard_module_css_default.leadAvatar,\n src: LEAD_ART,\n alt: "",\n "aria-hidden": true\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.teamName,\n title: resolved.teamName,\n children: resolved.teamName\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.memberCount,\n children: t("card.memberCount", { count: resolved.members.length })\n }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: TTeamCard_module_css_default.panelButton,\n onClick: () => {\n openActivityPanel(resolved);\n },\n "aria-label": t("action.openActivityPanel"),\n title: t("action.openActivityPanel"),\n children: t("activity.panelButton")\n })\n ]\n }), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {\n className: TTeamCard_module_css_default.members,\n children: resolved.members.map((member) => (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: TTeamCard_module_css_default.member,\n onClick: () => {\n if (member.id !== "") openMember(owner, member.id);\n },\n title: member.role === "" ? member.name : `${member.name} \xB7 ${member.role}`,\n children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {\n className: TTeamCard_module_css_default.memberArt,\n src: memberArtUrl(member.name, member.role) ?? "",\n alt: "",\n "aria-hidden": true\n }) : (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.memberInitial,\n children: member.name.trim().slice(0, 1).toUpperCase() || "?"\n }), (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.memberName,\n children: member.name\n })]\n }, member.id))\n })]\n });\n }\n\n\n const css = "html{--t-team-panel-shift:420px}html[data-t-team-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--t-team-panel-shift)}.aYQbCq_badge,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-line-strong);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_tTeamPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_tTeamPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent)}@keyframes aYQbCq_tTeamPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_tTeamPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:5;touch-action:none;pointer-events:auto;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:14px;top:44px;bottom:14px;left:0}.aYQbCq_resizeHandle[data-resize-edge=left]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\\"\\";opacity:.45;border-radius:999px;width:3px;height:48px;transition:background-color .12s,opacity .12s;position:absolute;top:50%;left:4px;transform:translateY(-50%)}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:14px;bottom:0;left:20px;right:20px}.aYQbCq_resizeHandle[data-resize-edge=bottom]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\\"\\";opacity:.45;border-radius:999px;width:48px;height:3px;transition:background-color .12s,opacity .12s;position:absolute;bottom:4px;left:50%;transform:translate(-50%)}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:28px;height:28px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:2px solid var(--dsw-alias-label-tertiary);border-bottom:2px solid var(--dsw-alias-label-tertiary);content:\\"\\";opacity:.58;width:10px;height:10px;transition:border-color .12s,opacity .12s;position:absolute;bottom:6px;right:6px}.aYQbCq_resizeHandle:hover:after,.aYQbCq_panel[data-resizing] .aYQbCq_resizeHandle:after{background-color:var(--dsw-alias-bg-fill-business);border-color:var(--dsw-alias-bg-fill-business);opacity:.95}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex;container:aYQbCq_agent-team/inline-size}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_teamStopButton{border:1px solid var(--dsw-alias-line-normal);width:26px;height:26px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border-radius:7px;flex:none;place-items:center;padding:0;transition:border-color .15s,background .15s,color .15s;display:grid}.aYQbCq_teamStopButton:hover{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 42%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-danger) 7%, transparent);color:var(--dsw-alias-state-danger)}.aYQbCq_teamStopButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_stopModalActions{justify-content:flex-end;gap:8px;display:flex}.aYQbCq_stopModalActions button{border:1px solid var(--dsw-alias-line-normal,#e7e9ee);background:var(--dsw-alias-bg-fill-neutral,#eef0f4);min-height:34px;color:var(--dsw-alias-label-primary,#1c1c1e);cursor:pointer;font:inherit;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:6px 13px;font-size:12px;font-weight:600;display:inline-flex}.aYQbCq_stopModalActions button[data-danger]{border-color:var(--dsw-alias-state-danger,#e5484d);background:var(--dsw-alias-state-danger,#e5484d);color:var(--dsw-alias-label-on-fill,#fff)}.aYQbCq_stopModalActions button:disabled{cursor:wait;opacity:.58}.aYQbCq_stopModalError{background:color-mix(in srgb, var(--dsw-alias-state-danger,#e5484d) 8%, transparent);color:var(--dsw-alias-state-danger,#e5484d);border-radius:8px;align-items:flex-start;gap:7px;margin:0;padding:9px 10px;font-size:12px;line-height:18px;display:flex}.aYQbCq_stopModalError svg{flex:none;margin-top:1px}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_taskDetailModel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;line-height:14px;overflow:hidden}.aYQbCq_memberModel{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-fill-neutral);min-width:0;max-width:132px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:0 auto;align-items:center;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:15px;display:inline-flex;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-bg-fill-business)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_tTeamDot}@keyframes aYQbCq_tTeamDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-line-strong);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=discarded]{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.aYQbCq_progressSummary[data-state=discarded] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-label-tertiary)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));content:\\"\\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\\"\\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-module);background:var(--dsw-alias-state-business-primary);content:\\"\\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_tTeamUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_tTeamUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:34px;height:34px;color:var(--dsw-alias-label-on-fill);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-module)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_tTeamFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_tTeamBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_tTeamThink}@keyframes aYQbCq_tTeamFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_tTeamBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_tTeamThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-bg-fill-neutral);max-width:100%;min-height:16px;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex;overflow:hidden}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-line-strong);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-line-strong);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_planEditor{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, var(--dsw-alias-state-business-primary));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent);border-radius:10px;flex-direction:column;gap:12px;margin:0 10px 12px;padding:12px;display:flex}.aYQbCq_planHeader>span{justify-content:space-between;align-items:center;gap:8px;display:flex}.aYQbCq_planHeader>span>span{flex-direction:column;gap:2px;min-width:0;display:flex}.aYQbCq_planHeader strong{color:var(--dsw-alias-label-primary);font-size:12px}.aYQbCq_planHeader small{color:var(--dsw-alias-label-secondary);font-size:9px;font-weight:500;line-height:13px}.aYQbCq_planHeader em{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill);border-radius:999px;flex:none;padding:1px 7px;font-size:9px;font-style:normal;line-height:16px}.aYQbCq_planHeader p{color:var(--dsw-alias-label-secondary);margin:5px 0 0;font-size:10px;line-height:15px}.aYQbCq_planFlow{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;padding:0;list-style:none;display:grid}.aYQbCq_planFlow li{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:5px;font-size:9px;font-weight:600;line-height:14px;display:flex;position:relative}.aYQbCq_planFlow li:not(:last-child):after{background:var(--dsw-alias-line-normal);content:\\"\\";flex:1;min-width:8px;height:1px;margin-right:5px}.aYQbCq_planFlow li>span{border:1px solid var(--dsw-alias-line-normal);border-radius:50%;flex:none;place-items:center;width:18px;height:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;display:grid}.aYQbCq_planFlow li[data-active]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_planFlow li[data-active]>span{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent)}.aYQbCq_planSection{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:8px;overflow:hidden}.aYQbCq_planSectionToggle,.aYQbCq_planCardHeader{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0}.aYQbCq_planSectionToggle{justify-content:space-between;align-items:center;gap:8px;min-height:42px;padding:7px 9px;display:flex}.aYQbCq_planSectionToggle:hover,.aYQbCq_planCardHeader:hover{background:color-mix(in srgb, var(--dsw-alias-bg-fill-neutral) 46%, transparent)}.aYQbCq_planSectionToggle>span{align-items:baseline;gap:7px;min-width:0;display:flex}.aYQbCq_planSectionToggle strong{font-size:10.5px}.aYQbCq_planSectionToggle small{color:var(--dsw-alias-label-tertiary);font-size:9px}.aYQbCq_planList{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:0;display:flex}.aYQbCq_planEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;padding:12px;font-size:10px}.aYQbCq_planCard{background:0 0;border:0;border-radius:0;min-width:0;margin:0;padding:0;display:block;position:relative}.aYQbCq_planCard+.aYQbCq_planCard{border-top:1px solid var(--dsw-alias-line-normal)}.aYQbCq_planCard[data-open=true]{background:color-mix(in srgb, var(--dsw-alias-bg-base) 62%, transparent)}.aYQbCq_planCardHeader{grid-template-columns:minmax(80px,.9fr) minmax(72px,1.15fr) auto 12px;align-items:center;gap:7px;min-height:40px;padding:6px 9px;display:grid}.aYQbCq_planCardIdentity{flex-direction:column;gap:1px;min-width:0;display:flex}.aYQbCq_planCardIdentity strong,.aYQbCq_planTaskSummary{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:650;line-height:14px;overflow:hidden}.aYQbCq_planCardIdentity>span,.aYQbCq_planCardMeta{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planTaskId{background:var(--dsw-alias-bg-fill-neutral);width:max-content;color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8.5px;font-weight:700;line-height:14px}.aYQbCq_planDirty{background:color-mix(in srgb, var(--dsw-alias-state-warning) 13%, transparent);color:var(--dsw-alias-state-warning);border-radius:999px;justify-self:end;padding:1px 5px;font-size:8px;font-style:normal;font-weight:650;line-height:14px}.aYQbCq_planChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.2,.7,.2,1)}.aYQbCq_planChevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_planCardBody{flex-direction:column;gap:8px;padding:0 9px 9px;display:flex}.aYQbCq_planCardBody fieldset{border:0;flex-direction:column;gap:7px;min-width:0;margin:0;padding:0;display:flex}.aYQbCq_planCardBody label,.aYQbCq_planNewTask label{min-width:0;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;gap:4px;font-size:9px;display:flex}.aYQbCq_planCardBody label small{color:var(--dsw-alias-label-tertiary);font-size:8px;line-height:11px}.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-base);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:6px;outline:none;font-size:10.5px;line-height:16px;transition:border-color .16s,box-shadow .16s}.aYQbCq_planCard input,.aYQbCq_planCard select,.aYQbCq_planNewTask input{min-height:32px;padding:6px 8px}.aYQbCq_planCard textarea{resize:vertical;min-height:58px;padding:7px 8px}.aYQbCq_planCard input:focus-visible,.aYQbCq_planCard textarea:focus-visible,.aYQbCq_planCard select:focus-visible,.aYQbCq_planNewTask input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent)}.aYQbCq_planGrid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px;display:grid}.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr);gap:5px;display:grid}.aYQbCq_planModelMenu{width:100%;display:flex}.aYQbCq_planModelTrigger{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:7px;justify-content:space-between;align-items:center;gap:8px;padding:7px 9px;transition:border-color .16s,background-color .16s,transform .12s;display:flex}.aYQbCq_planModelTrigger:hover:not(:disabled){border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.aYQbCq_planModelTrigger:active:not(:disabled){transform:translateY(1px)}.aYQbCq_planModelTrigger:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:2px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);outline-offset:1px}.aYQbCq_planModelTrigger:disabled{cursor:wait;opacity:.64}.aYQbCq_planModelTriggerCopy{align-items:baseline;gap:6px;min-width:0;display:flex}.aYQbCq_planModelTriggerCopy strong,.aYQbCq_planModelTriggerCopy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_planModelTriggerCopy strong{color:var(--dsw-alias-label-primary);font-size:10px;font-weight:650;line-height:15px}.aYQbCq_planModelTriggerCopy span{color:var(--dsw-alias-label-tertiary);font-size:9px;line-height:14px}.aYQbCq_planModelMenuRow{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;min-width:0;display:grid}.aYQbCq_planModelMenuRow>span:first-child{color:var(--dsw-alias-label-primary)}.aYQbCq_planModelMenuRow strong{color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-weight:450;overflow:hidden}.aYQbCq_planModelMenuBack{align-items:center;gap:7px;display:inline-flex}.aYQbCq_planModelMenuBack svg{transform:rotate(180deg)}.aYQbCq_planModelEffortRow{flex-direction:column;align-items:flex-start;min-width:0;display:flex}.aYQbCq_planModelEffortRow small{width:100%;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_planModelHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planModelNotice{background:color-mix(in srgb, var(--dsw-alias-state-warning) 9%, transparent);color:var(--dsw-alias-label-secondary);border-radius:6px;grid-column:1/-1;justify-content:space-between;align-items:center;gap:8px;padding:6px 7px;font-size:8.5px;line-height:12px;display:flex}.aYQbCq_planModelNotice button{color:var(--dsw-alias-state-business-primary);cursor:pointer;font:inherit;background:0 0;border:0;flex:none;padding:2px 6px;font-weight:650}.aYQbCq_planActions,.aYQbCq_planApproveRow,.aYQbCq_planNewTask,.aYQbCq_planConfirm,.aYQbCq_planApproveActions,.aYQbCq_planSecondaryActions{align-items:center;gap:7px;display:flex}.aYQbCq_planReviewActions{grid-template-columns:minmax(0,1fr);gap:6px;width:100%;display:grid}.aYQbCq_planSecondaryActions{grid-template-columns:minmax(0,1fr) auto;display:grid}.aYQbCq_planActions{justify-content:flex-end}.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-fill-neutral);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;flex:none;padding:5px 10px;font-size:9.5px;font-weight:600;transition:background .16s,border-color .16s,transform .16s}.aYQbCq_planActions button:hover:not(:disabled),.aYQbCq_planNewTask button:hover:not(:disabled),.aYQbCq_planApproveRow button:hover:not(:disabled),.aYQbCq_planConfirm button:hover:not(:disabled){border-color:var(--dsw-alias-label-tertiary)}.aYQbCq_planActions button:active:not(:disabled),.aYQbCq_planNewTask button:active:not(:disabled),.aYQbCq_planApproveRow button:active:not(:disabled),.aYQbCq_planConfirm button:active:not(:disabled){transform:scale(.98)}.aYQbCq_planActions button[data-danger],.aYQbCq_planConfirm button[data-danger]{color:var(--dsw-alias-state-danger)}.aYQbCq_planFeedback{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;align-items:center;gap:5px;font-size:9px;line-height:13px;animation:.18s ease-out aYQbCq_plan-feedback-in;display:inline-flex}.aYQbCq_planFeedback[data-tone=success]{color:var(--dsw-alias-state-success)}.aYQbCq_planFeedback[data-tone=error]{color:var(--dsw-alias-state-danger)}.aYQbCq_planFeedback>span{border:1px solid;border-radius:50%;flex:none;place-items:center;width:15px;height:15px;display:grid}.aYQbCq_planFeedback svg{width:11px;height:11px}@keyframes aYQbCq_plan-feedback-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.aYQbCq_planConfirm{border:1px solid color-mix(in srgb, var(--dsw-alias-state-danger) 30%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-danger) 7%, transparent);border-radius:7px;flex-wrap:wrap;justify-content:flex-end;padding:7px}.aYQbCq_planConfirm>span{min-width:140px;color:var(--dsw-alias-label-secondary);flex:1;font-size:9px;line-height:13px}.aYQbCq_planNewTask{align-items:flex-end}.aYQbCq_planNewTask label{gap:4px}.aYQbCq_planNewTask label>span{line-height:13px}.aYQbCq_planApproveRow{z-index:1;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, transparent);min-height:50px;box-shadow:0 -5px 16px color-mix(in srgb, var(--dsw-alias-bg-base) 35%, transparent);backdrop-filter:blur(8px);border-radius:8px;flex-direction:column;justify-content:flex-end;align-items:stretch;margin:0 -4px -4px;padding:8px;position:sticky;bottom:0}.aYQbCq_planApproveRow[data-armed=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, var(--dsw-alias-line-normal))}.aYQbCq_planApproveRow[data-discard=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 45%, var(--dsw-alias-line-normal))}.aYQbCq_planApproveCopy{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.aYQbCq_planApproveCopy strong{color:var(--dsw-alias-label-primary);font-size:9.5px;line-height:13px}.aYQbCq_planApproveCopy small{color:var(--dsw-alias-label-tertiary);font-size:8.5px;line-height:12px}.aYQbCq_planApproveRow button{background:var(--dsw-alias-state-business-primary);min-height:32px;color:var(--dsw-alias-label-on-fill);padding-inline:13px}.aYQbCq_planReviewActions>button[data-plan-approve]{width:100%}.aYQbCq_planApproveActions>button:first-child{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button,.aYQbCq_planApproveActions>button[data-danger]{border-color:var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button[data-danger],.aYQbCq_planApproveActions>button[data-danger]{color:var(--dsw-alias-state-danger)}.aYQbCq_planSectionToggle:focus-visible,.aYQbCq_planCardHeader:focus-visible,.aYQbCq_planActions button:focus-visible,.aYQbCq_planNewTask button:focus-visible,.aYQbCq_planApproveRow button:focus-visible,.aYQbCq_planConfirm button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.aYQbCq_planActions button:disabled,.aYQbCq_planNewTask button:disabled,.aYQbCq_planApproveRow button:disabled{cursor:default;opacity:.55}.aYQbCq_historicPill{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archiveLabel{color:var(--dsw-alias-label-tertiary);padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after,.aYQbCq_planChevron,.aYQbCq_planFeedback,.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button,.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{transition:none;animation:none}}@media (width<=960px){html[data-t-team-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}.aYQbCq_planFlow li{gap:4px;font-size:8px}.aYQbCq_planFlow li:not(:last-child):after{margin-right:3px}.aYQbCq_planCardHeader{grid-template-columns:auto minmax(0,1fr) auto}.aYQbCq_planCardHeader .aYQbCq_planCardMeta{display:none}.aYQbCq_planGrid,.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr)}.aYQbCq_planNewTask,.aYQbCq_planApproveRow{flex-direction:column;align-items:stretch}.aYQbCq_planNewTask button,.aYQbCq_planApproveRow>button,.aYQbCq_planApproveActions,.aYQbCq_planReviewActions{width:100%}.aYQbCq_planApproveActions button,.aYQbCq_planReviewActions button,.aYQbCq_planSecondaryActions button{flex:1}}@container aYQbCq_agent-team (width<=360px){.aYQbCq_planEditor{margin-inline:0;padding-inline:10px}.aYQbCq_planHeader>span{align-items:flex-start}.aYQbCq_planFlow li{gap:3px;font-size:7.5px}.aYQbCq_planFlow li:not(:last-child):after{min-width:4px;margin-right:2px}.aYQbCq_planSecondaryActions,.aYQbCq_planApproveActions{grid-template-columns:minmax(0,1fr);width:100%;display:grid}.aYQbCq_planSecondaryActions button,.aYQbCq_planApproveActions button{width:100%}}";\n const tagId = "dsh-plugin-t-expert/ActivityPanel.module.css";\n if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {\n const tag = document.createElement("style");\n tag.dataset.plugin = "dsh-plugin-t-expert";\n tag.dataset.pluginCss = tagId;\n tag.textContent = css;\n document.head.appendChild(tag);\n }\n var ActivityPanel_module_css_default = {\n "agent-team": "aYQbCq_agent-team",\n "tTeamBreathe": "aYQbCq_tTeamBreathe",\n "tTeamDot": "aYQbCq_tTeamDot",\n "tTeamFloat": "aYQbCq_tTeamFloat",\n "tTeamPanelIn": "aYQbCq_tTeamPanelIn",\n "tTeamPulse": "aYQbCq_tTeamPulse",\n "tTeamThink": "aYQbCq_tTeamThink",\n "tTeamUnreadPulse": "aYQbCq_tTeamUnreadPulse",\n "archiveLabel": "aYQbCq_archiveLabel",\n "assignmentChip": "aYQbCq_assignmentChip",\n "assignmentLabel": "aYQbCq_assignmentLabel",\n "assignmentLine": "aYQbCq_assignmentLine",\n "assignmentTasks": "aYQbCq_assignmentTasks",\n "badge": "aYQbCq_badge",\n "badgeCount": "aYQbCq_badgeCount",\n "badgeDot": "aYQbCq_badgeDot",\n "captainAvatar": "aYQbCq_captainAvatar",\n "captainInfo": "aYQbCq_captainInfo",\n "captainLine": "aYQbCq_captainLine",\n "captainName": "aYQbCq_captainName",\n "captainNode": "aYQbCq_captainNode",\n "captainRole": "aYQbCq_captainRole",\n "captainState": "aYQbCq_captainState",\n "captainSummary": "aYQbCq_captainSummary",\n "chevron": "aYQbCq_chevron",\n "dagCanvas": "aYQbCq_dagCanvas",\n "dagEdges": "aYQbCq_dagEdges",\n "dagNode": "aYQbCq_dagNode",\n "dagNodeDot": "aYQbCq_dagNodeDot",\n "dagNodeHead": "aYQbCq_dagNodeHead",\n "dagNodeLabel": "aYQbCq_dagNodeLabel",\n "dagRunningState": "aYQbCq_dagRunningState",\n "dagViewport": "aYQbCq_dagViewport",\n "delegationSection": "aYQbCq_delegationSection",\n "delegationTree": "aYQbCq_delegationTree",\n "dependencySection": "aYQbCq_dependencySection",\n "emptyHint": "aYQbCq_emptyHint",\n "historicPill": "aYQbCq_historicPill",\n "iconButton": "aYQbCq_iconButton",\n "leadAvatar": "aYQbCq_leadAvatar",\n "memberArt": "aYQbCq_memberArt",\n "memberAvatar": "aYQbCq_memberAvatar",\n "memberBlock": "aYQbCq_memberBlock",\n "memberBranch": "aYQbCq_memberBranch",\n "memberCount": "aYQbCq_memberCount",\n "memberInfo": "aYQbCq_memberInfo",\n "memberInitial": "aYQbCq_memberInitial",\n "memberLine": "aYQbCq_memberLine",\n "memberModel": "aYQbCq_memberModel",\n "memberName": "aYQbCq_memberName",\n "memberRole": "aYQbCq_memberRole",\n "memberRow": "aYQbCq_memberRow",\n "memberState": "aYQbCq_memberState",\n "memberStatusLine": "aYQbCq_memberStatusLine",\n "members": "aYQbCq_members",\n "membersToggle": "aYQbCq_membersToggle",\n "panel": "aYQbCq_panel",\n "panelControls": "aYQbCq_panelControls",\n "panelDot": "aYQbCq_panelDot",\n "panelHead": "aYQbCq_panelHead",\n "panelTitle": "aYQbCq_panelTitle",\n "plan-feedback-in": "aYQbCq_plan-feedback-in",\n "planActions": "aYQbCq_planActions",\n "planApproveActions": "aYQbCq_planApproveActions",\n "planApproveCopy": "aYQbCq_planApproveCopy",\n "planApproveRow": "aYQbCq_planApproveRow",\n "planCard": "aYQbCq_planCard",\n "planCardBody": "aYQbCq_planCardBody",\n "planCardHeader": "aYQbCq_planCardHeader",\n "planCardIdentity": "aYQbCq_planCardIdentity",\n "planCardMeta": "aYQbCq_planCardMeta",\n "planChevron": "aYQbCq_planChevron",\n "planConfirm": "aYQbCq_planConfirm",\n "planDirty": "aYQbCq_planDirty",\n "planEditor": "aYQbCq_planEditor",\n "planEmpty": "aYQbCq_planEmpty",\n "planFeedback": "aYQbCq_planFeedback",\n "planFlow": "aYQbCq_planFlow",\n "planGrid": "aYQbCq_planGrid",\n "planHeader": "aYQbCq_planHeader",\n "planList": "aYQbCq_planList",\n "planModelEffortRow": "aYQbCq_planModelEffortRow",\n "planModelHint": "aYQbCq_planModelHint",\n "planModelMenu": "aYQbCq_planModelMenu",\n "planModelMenuBack": "aYQbCq_planModelMenuBack",\n "planModelMenuRow": "aYQbCq_planModelMenuRow",\n "planModelNotice": "aYQbCq_planModelNotice",\n "planModelPicker": "aYQbCq_planModelPicker",\n "planModelTrigger": "aYQbCq_planModelTrigger",\n "planModelTriggerCopy": "aYQbCq_planModelTriggerCopy",\n "planNewTask": "aYQbCq_planNewTask",\n "planReviewActions": "aYQbCq_planReviewActions",\n "planSecondaryActions": "aYQbCq_planSecondaryActions",\n "planSection": "aYQbCq_planSection",\n "planSectionToggle": "aYQbCq_planSectionToggle",\n "planTaskId": "aYQbCq_planTaskId",\n "planTaskSummary": "aYQbCq_planTaskSummary",\n "progressEmpty": "aYQbCq_progressEmpty",\n "progressLegend": "aYQbCq_progressLegend",\n "progressOverview": "aYQbCq_progressOverview",\n "progressSegments": "aYQbCq_progressSegments",\n "progressSummary": "aYQbCq_progressSummary",\n "progressSummaryDot": "aYQbCq_progressSummaryDot",\n "progressTitle": "aYQbCq_progressTitle",\n "resizeHandle": "aYQbCq_resizeHandle",\n "sectionHead": "aYQbCq_sectionHead",\n "sectionHint": "aYQbCq_sectionHint",\n "sectionTitle": "aYQbCq_sectionTitle",\n "sectionToggleTitle": "aYQbCq_sectionToggleTitle",\n "stageLabel": "aYQbCq_stageLabel",\n "stateArt": "aYQbCq_stateArt",\n "stopModalActions": "aYQbCq_stopModalActions",\n "stopModalError": "aYQbCq_stopModalError",\n "taskDetail": "aYQbCq_taskDetail",\n "taskDetailBadge": "aYQbCq_taskDetailBadge",\n "taskDetailHead": "aYQbCq_taskDetailHead",\n "taskDetailId": "aYQbCq_taskDetailId",\n "taskDetailLine": "aYQbCq_taskDetailLine",\n "taskDetailMeta": "aYQbCq_taskDetailMeta",\n "taskDetailModel": "aYQbCq_taskDetailModel",\n "taskDetailSubject": "aYQbCq_taskDetailSubject",\n "taskEmpty": "aYQbCq_taskEmpty",\n "taskId": "aYQbCq_taskId",\n "team": "aYQbCq_team",\n "teamHead": "aYQbCq_teamHead",\n "teamName": "aYQbCq_teamName",\n "teamStats": "aYQbCq_teamStats",\n "teamStopButton": "aYQbCq_teamStopButton",\n "teams": "aYQbCq_teams",\n "unreadPill": "aYQbCq_unreadPill",\n "workGlyph": "aYQbCq_workGlyph"\n };\n\n\n /**\n * Editable pre-run roster and DAG review for staged T Team plans.\n *\n * This leaf owns only transient form/disclosure state. Durable truth remains\n * on the host and returns through the ordinary activity polling snapshot.\n * @module t-team/client/staging-plan\n */\n const PLAN_URL = "/plugins/t-team/plan";\n function useDismissSuccess(feedback, setFeedback) {\n (0, react.useEffect)(() => {\n if (feedback?.tone !== "success") return;\n const timeout = window.setTimeout(() => {\n setFeedback(void 0);\n }, 3500);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [feedback, setFeedback]);\n }\n async function mutatePlan(payload) {\n const response = await fetch(PLAN_URL, {\n method: "POST",\n cache: "no-store",\n headers: { "content-type": "application/json" },\n body: JSON.stringify(payload)\n });\n if (response.ok) return;\n let message = `HTTP ${response.status}`;\n try {\n const body = await response.json();\n if (typeof body.error === "string" && body.error.trim() !== "") message = body.error;\n } catch {}\n throw new Error(message);\n }\n function errorMessage(error) {\n return error instanceof Error ? error.message : String(error);\n }\n function DisclosureChevron({ open }) {\n return (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.planChevron,\n "data-open": open,\n width: "12",\n height: "12",\n viewBox: "0 0 12 12",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.5",\n strokeLinecap: "round",\n "aria-hidden": true,\n children: (0, react_jsx_runtime.jsx)("path", { d: "M4 2.5 7.5 6 4 9.5" })\n });\n }\n function Feedback({ value }) {\n if (value === void 0) return null;\n return (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planFeedback,\n "data-tone": value.tone,\n role: value.tone === "error" ? "alert" : "status",\n "aria-live": value.tone === "error" ? "assertive" : "polite",\n children: [(0, react_jsx_runtime.jsx)("span", {\n "aria-hidden": true,\n children: value.tone === "success" ? (0, react_jsx_runtime.jsx)("svg", {\n viewBox: "0 0 12 12",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.8",\n children: (0, react_jsx_runtime.jsx)("path", { d: "m2.5 6.2 2.2 2.2 4.8-5" })\n }) : (0, react_jsx_runtime.jsx)("svg", {\n viewBox: "0 0 12 12",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.8",\n children: (0, react_jsx_runtime.jsx)("path", { d: "M6 2.3v4.1M6 8.8v.1" })\n })\n }), value.message]\n });\n }\n function routeKey(provider, model) {\n return JSON.stringify([provider, model]);\n }\n const MODEL_MENU_OPEN_MODELS = "open:models";\n const MODEL_MENU_OPEN_EFFORT = "open:effort";\n const MODEL_MENU_BACK = "navigate:back";\n const MODEL_MENU_RETRY = "action:retry";\n const MODEL_MENU_DEFAULT_EFFORT = "effort:default";\n function modelMenuId(provider, model) {\n return `model:${routeKey(provider, model)}`;\n }\n function effortMenuId(effort) {\n return `effort:${effort}`;\n }\n /**\n * Thin staged-plan adapter over the official model directory. It deliberately\n * reads only catalog metadata: choosing a member route must not change the\n * captain session\'s composer model.\n */\n function StagedModelPicker({ directory, provider, model, reasoningEffort, busy, onChange, t }) {\n const state = (0, react.useSyncExternalStore)(directory.store.subscribe, directory.store.getSnapshot);\n const [open, setOpen] = (0, react.useState)(false);\n const [pane, setPane] = (0, react.useState)("root");\n const catalogRoutes = state.groups.flatMap((group) => group.models.map((candidate) => ({\n key: routeKey(group.id, candidate.id),\n provider: group.id,\n providerName: group.name,\n model: candidate\n })));\n const selectedKey = routeKey(provider, model);\n const selected = catalogRoutes.find((candidate) => candidate.key === selectedKey);\n const efforts = selected?.model.reasoning?.efforts ?? [];\n const currentMissing = provider !== "" && model !== "" && selected === void 0;\n const defaultEffort = selected?.model.reasoning?.defaultEffort;\n const effectiveEffort = reasoningEffort === "" || reasoningEffort === "default" ? defaultEffort : reasoningEffort;\n const selectedEffort = efforts.find((effort) => effort.id === effectiveEffort);\n const modelLabel = selected?.model.name ?? (model === "" ? t("plan.model.choose") : model);\n const effortLabel = selectedEffort?.name ?? (effectiveEffort === void 0 ? t("plan.model.providerDefault") : effectiveEffort);\n const unavailable = state.status === "error" || state.failures.length > 0;\n const close = () => {\n setOpen(false);\n setPane("root");\n };\n const rootItems = [{\n id: MODEL_MENU_OPEN_MODELS,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuRow,\n children: [\n (0, react_jsx_runtime.jsx)("span", { children: t("plan.member.model") }),\n (0, react_jsx_runtime.jsx)("strong", { children: modelLabel }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false })\n ]\n }),\n disabled: state.status === "loading" && catalogRoutes.length === 0\n }, {\n id: MODEL_MENU_OPEN_EFFORT,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuRow,\n children: [\n (0, react_jsx_runtime.jsx)("span", { children: t("plan.member.reasoning") }),\n (0, react_jsx_runtime.jsx)("strong", { children: effortLabel }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false })\n ]\n }),\n disabled: selected?.model.reasoning === void 0\n }];\n const modelItems = [{\n id: MODEL_MENU_BACK,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuBack,\n children: [(0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false }), t("plan.model.back")]\n })\n }, {\n type: "separator",\n id: "models:separator"\n }];\n if (catalogRoutes.length === 0) modelItems.push({\n id: "models:empty",\n label: state.status === "loading" ? t("plan.model.loading") : t("plan.model.empty"),\n disabled: true\n });\n else for (const group of state.groups) {\n modelItems.push({\n type: "label",\n id: `provider:${group.id}`,\n text: group.name\n });\n for (const candidate of group.models) modelItems.push({\n id: modelMenuId(group.id, candidate.id),\n label: candidate.name\n });\n }\n const effortItems = [\n {\n id: MODEL_MENU_BACK,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuBack,\n children: [(0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false }), t("plan.model.back")]\n })\n },\n {\n type: "separator",\n id: "effort:separator"\n },\n {\n id: MODEL_MENU_DEFAULT_EFFORT,\n label: defaultEffort === void 0 ? t("plan.model.providerDefault") : t("plan.model.modelDefault", { effort: efforts.find((effort) => effort.id === defaultEffort)?.name ?? defaultEffort })\n },\n ...efforts.map((effort) => ({\n id: effortMenuId(effort.id),\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelEffortRow,\n children: [(0, react_jsx_runtime.jsx)("span", { children: effort.name }), effort.description !== void 0 && (0, react_jsx_runtime.jsx)("small", { children: effort.description })]\n })\n }))\n ];\n const items = pane === "models" ? modelItems : pane === "effort" ? effortItems : rootItems;\n const selectedId = pane === "models" ? modelMenuId(provider, model) : pane === "effort" ? reasoningEffort === "" || reasoningEffort === "default" ? MODEL_MENU_DEFAULT_EFFORT : effortMenuId(reasoningEffort) : void 0;\n const choose = (id) => {\n if (id === MODEL_MENU_OPEN_MODELS) {\n setPane("models");\n return;\n }\n if (id === MODEL_MENU_OPEN_EFFORT) {\n setPane("effort");\n return;\n }\n if (id === MODEL_MENU_BACK) {\n setPane("root");\n return;\n }\n if (id === MODEL_MENU_RETRY) {\n directory.load().catch(() => void 0);\n return;\n }\n const nextModel = catalogRoutes.find((candidate) => modelMenuId(candidate.provider, candidate.model.id) === id);\n if (nextModel !== void 0) {\n close();\n if (nextModel.provider === provider && nextModel.model.id === model) return;\n onChange({\n provider: nextModel.provider,\n model: nextModel.model.id,\n reasoningEffort: "default"\n });\n return;\n }\n if (id === MODEL_MENU_DEFAULT_EFFORT) {\n close();\n if (effectiveEffort === defaultEffort) return;\n onChange({\n provider,\n model,\n reasoningEffort: "default"\n });\n return;\n }\n const nextEffort = efforts.find((effort) => effortMenuId(effort.id) === id);\n if (nextEffort === void 0) return;\n close();\n if (nextEffort.id === reasoningEffort) return;\n onChange({\n provider,\n model,\n reasoningEffort: nextEffort.id\n });\n };\n return (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.planModelPicker,\n "data-model-directory-status": state.status,\n children: [\n (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {\n open,\n portal: true,\n align: "end",\n compact: true,\n className: ActivityPanel_module_css_default.planModelMenu,\n items,\n footer: unavailable ? [{\n id: MODEL_MENU_RETRY,\n label: t("plan.model.retry")\n }] : void 0,\n selectedId,\n onSelect: choose,\n onClose: close,\n anchor: (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planModelTrigger,\n "data-plan-model-trigger": true,\n "aria-label": t("plan.model.triggerAria", {\n model: modelLabel,\n effort: effortLabel\n }),\n "aria-haspopup": "menu",\n "aria-expanded": open,\n disabled: busy,\n onClick: () => {\n if (open) close();\n else {\n setPane("root");\n setOpen(true);\n directory.load().catch(() => void 0);\n }\n },\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelTriggerCopy,\n children: [(0, react_jsx_runtime.jsx)("strong", { children: state.status === "loading" && catalogRoutes.length === 0 ? t("plan.model.loading") : modelLabel }), (0, react_jsx_runtime.jsx)("span", { children: effortLabel })]\n }), (0, react_jsx_runtime.jsx)(DisclosureChevron, { open })]\n })\n }),\n (0, react_jsx_runtime.jsx)("small", {\n className: ActivityPanel_module_css_default.planModelHint,\n children: currentMissing ? t("plan.model.currentUnavailable", {\n provider,\n model\n }) : selected?.model.description ?? t("plan.model.route", {\n provider,\n model\n })\n }),\n unavailable && (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelNotice,\n role: state.status === "error" ? "alert" : "status",\n children: [(0, react_jsx_runtime.jsx)("span", { children: state.error ?? t("plan.model.partialFailure", { count: state.failures.length }) }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n disabled: busy || state.status === "loading",\n onClick: () => {\n directory.load().catch(() => void 0);\n },\n children: t("plan.model.retry")\n })]\n })\n ]\n });\n }\n function StagedMemberEditor({ team, member, modelDirectory, onPendingChange, t }) {\n const bodyId = (0, react.useId)();\n const [open, setOpen] = (0, react.useState)(false);\n const [role, setRole] = (0, react.useState)(member.role);\n const [provider, setProvider] = (0, react.useState)(member.provider ?? "");\n const [model, setModel] = (0, react.useState)(member.model ?? "");\n const [reasoningEffort, setReasoningEffort] = (0, react.useState)(member.reasoningEffort ?? "");\n const [executionPrompt, setExecutionPrompt] = (0, react.useState)(member.executionPrompt ?? "");\n const remoteSignature = JSON.stringify([\n member.role,\n member.provider ?? "",\n member.model ?? "",\n member.reasoningEffort ?? "",\n member.executionPrompt ?? ""\n ]);\n const [savedSignature, setSavedSignature] = (0, react.useState)(remoteSignature);\n const [busy, setBusy] = (0, react.useState)(false);\n const [feedback, setFeedback] = (0, react.useState)();\n useDismissSuccess(feedback, setFeedback);\n const dirty = JSON.stringify([\n role,\n provider,\n model,\n reasoningEffort,\n executionPrompt\n ]) !== savedSignature;\n (0, react.useEffect)(() => {\n onPendingChange(`member:${member.name}`, dirty || busy);\n return () => {\n onPendingChange(`member:${member.name}`, false);\n };\n }, [\n busy,\n dirty,\n member.name,\n onPendingChange\n ]);\n (0, react.useEffect)(() => {\n setRole(member.role);\n setProvider(member.provider ?? "");\n setModel(member.model ?? "");\n setReasoningEffort(member.reasoningEffort ?? "");\n setExecutionPrompt(member.executionPrompt ?? "");\n setSavedSignature(remoteSignature);\n }, [\n member.role,\n member.provider,\n member.model,\n member.reasoningEffort,\n member.executionPrompt,\n remoteSignature\n ]);\n const markEdited = () => {\n setFeedback(void 0);\n };\n const persist = async (selection = {\n provider,\n model,\n reasoningEffort\n }) => {\n const nextSignature = JSON.stringify([\n role,\n selection.provider,\n selection.model,\n selection.reasoningEffort,\n executionPrompt\n ]);\n setProvider(selection.provider);\n setModel(selection.model);\n setReasoningEffort(selection.reasoningEffort);\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "update_member",\n memberName: member.name,\n role,\n provider: selection.provider,\n model: selection.model,\n reasoningEffort: selection.reasoningEffort,\n executionPrompt\n });\n setSavedSignature(nextSignature);\n setFeedback({\n tone: "success",\n message: t("plan.saved")\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n } finally {\n setBusy(false);\n }\n };\n const save = async (event) => {\n event.preventDefault();\n await persist();\n };\n const route = `${provider}/${model}`.replace(/^\\//u, "");\n return (0, react_jsx_runtime.jsxs)("article", {\n className: ActivityPanel_module_css_default.planCard,\n "data-plan-member": member.name,\n "data-open": open,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planCardHeader,\n "aria-expanded": open,\n "aria-controls": bodyId,\n onClick: () => {\n setOpen((current) => !current);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planCardIdentity,\n children: [(0, react_jsx_runtime.jsx)("strong", { children: member.name }), (0, react_jsx_runtime.jsx)("span", { children: role || t("plan.member.roleFallback") })]\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.planCardMeta,\n title: route,\n children: route\n }),\n dirty && (0, react_jsx_runtime.jsx)("em", {\n className: ActivityPanel_module_css_default.planDirty,\n children: t("plan.unsaved")\n }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open })\n ]\n }), open && (0, react_jsx_runtime.jsxs)("form", {\n id: bodyId,\n className: ActivityPanel_module_css_default.planCardBody,\n onSubmit: (event) => {\n save(event);\n },\n children: [(0, react_jsx_runtime.jsxs)("fieldset", {\n disabled: busy,\n children: [\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.member.role"), (0, react_jsx_runtime.jsx)("input", {\n name: "role",\n value: role,\n onChange: (event) => {\n setRole(event.currentTarget.value);\n markEdited();\n }\n })] }),\n (0, react_jsx_runtime.jsx)(StagedModelPicker, {\n directory: modelDirectory,\n provider,\n model,\n reasoningEffort,\n busy,\n onChange: (selection) => {\n persist(selection);\n },\n t\n }),\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.member.prompt"), (0, react_jsx_runtime.jsx)("textarea", {\n name: "executionPrompt",\n value: executionPrompt,\n onChange: (event) => {\n setExecutionPrompt(event.currentTarget.value);\n markEdited();\n },\n rows: 3\n })] })\n ]\n }), (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planActions,\n children: [(0, react_jsx_runtime.jsx)(Feedback, { value: feedback }), (0, react_jsx_runtime.jsx)("button", {\n type: "submit",\n disabled: busy || !dirty || provider.trim() === "" || model.trim() === "",\n children: busy ? t("plan.saving") : t("plan.save")\n })]\n })]\n })]\n });\n }\n function StagedTaskEditor({ team, task, onPendingChange, t }) {\n const bodyId = (0, react.useId)();\n const taskDependencies = task.dependencies.join(", ");\n const [open, setOpen] = (0, react.useState)(false);\n const [subject, setSubject] = (0, react.useState)(task.subject);\n const [description, setDescription] = (0, react.useState)(task.description ?? "");\n const [assignee, setAssignee] = (0, react.useState)(task.assignee);\n const [dependencies, setDependencies] = (0, react.useState)(taskDependencies);\n const remoteSignature = JSON.stringify([\n task.subject,\n task.description ?? "",\n task.assignee,\n taskDependencies\n ]);\n const [savedSignature, setSavedSignature] = (0, react.useState)(remoteSignature);\n const [busy, setBusy] = (0, react.useState)(false);\n const [confirmingRemove, setConfirmingRemove] = (0, react.useState)(false);\n const [feedback, setFeedback] = (0, react.useState)();\n useDismissSuccess(feedback, setFeedback);\n const signature = JSON.stringify([\n subject,\n description,\n assignee,\n dependencies\n ]);\n const dirty = signature !== savedSignature;\n (0, react.useEffect)(() => {\n onPendingChange(`task:${task.id}`, dirty || busy);\n return () => {\n onPendingChange(`task:${task.id}`, false);\n };\n }, [\n busy,\n dirty,\n onPendingChange,\n task.id\n ]);\n (0, react.useEffect)(() => {\n setSubject(task.subject);\n setDescription(task.description ?? "");\n setAssignee(task.assignee);\n setDependencies(taskDependencies);\n setSavedSignature(remoteSignature);\n }, [\n task.subject,\n task.description,\n task.assignee,\n taskDependencies,\n remoteSignature\n ]);\n const markEdited = () => {\n setFeedback(void 0);\n setConfirmingRemove(false);\n };\n const save = async (event) => {\n event.preventDefault();\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "update_task",\n taskId: task.id,\n subject,\n description,\n assignee,\n dependencies: dependencies.split(",").map((item) => item.trim()).filter(Boolean)\n });\n setSavedSignature(signature);\n setFeedback({\n tone: "success",\n message: t("plan.saved")\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n } finally {\n setBusy(false);\n }\n };\n const remove = async () => {\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "remove_task",\n taskId: task.id\n });\n setFeedback({\n tone: "success",\n message: t("plan.removed")\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n }\n };\n const dependencySummary = task.dependencies.length === 0 ? t("plan.dependencies.none") : t("plan.dependencies.count", { count: task.dependencies.length });\n return (0, react_jsx_runtime.jsxs)("article", {\n className: ActivityPanel_module_css_default.planCard,\n "data-plan-task": task.id,\n "data-open": open,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planCardHeader,\n "aria-expanded": open,\n "aria-controls": bodyId,\n onClick: () => {\n setOpen((current) => !current);\n },\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.planTaskId,\n children: task.id\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.planTaskSummary,\n title: subject,\n children: subject\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planCardMeta,\n children: [\n assignee || t("plan.task.unassigned"),\n " \xB7 ",\n dependencySummary\n ]\n }),\n dirty && (0, react_jsx_runtime.jsx)("em", {\n className: ActivityPanel_module_css_default.planDirty,\n children: t("plan.unsaved")\n }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open })\n ]\n }), open && (0, react_jsx_runtime.jsxs)("form", {\n id: bodyId,\n className: ActivityPanel_module_css_default.planCardBody,\n onSubmit: (event) => {\n save(event);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("fieldset", {\n disabled: busy,\n children: [\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.task.subject"), (0, react_jsx_runtime.jsx)("input", {\n name: "subject",\n required: true,\n value: subject,\n onChange: (event) => {\n setSubject(event.currentTarget.value);\n markEdited();\n }\n })] }),\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.task.description"), (0, react_jsx_runtime.jsx)("textarea", {\n name: "description",\n value: description,\n onChange: (event) => {\n setDescription(event.currentTarget.value);\n markEdited();\n },\n rows: 3\n })] }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planGrid,\n children: [(0, react_jsx_runtime.jsxs)("label", { children: [t("plan.task.assignee"), (0, react_jsx_runtime.jsxs)("select", {\n name: "assignee",\n value: assignee,\n onChange: (event) => {\n setAssignee(event.currentTarget.value);\n markEdited();\n },\n children: [(0, react_jsx_runtime.jsx)("option", {\n value: "",\n children: t("plan.task.unassigned")\n }), team.members.map((member) => (0, react_jsx_runtime.jsx)("option", {\n value: member.name,\n children: member.name\n }, member.name))]\n })] }), (0, react_jsx_runtime.jsxs)("label", { children: [\n t("plan.task.dependencies"),\n (0, react_jsx_runtime.jsx)("input", {\n name: "dependencies",\n value: dependencies,\n onChange: (event) => {\n setDependencies(event.currentTarget.value);\n markEdited();\n }\n }),\n (0, react_jsx_runtime.jsx)("small", { children: t("plan.task.dependenciesHint") })\n ] })]\n })\n ]\n }),\n confirmingRemove && (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planConfirm,\n role: "alert",\n children: [\n (0, react_jsx_runtime.jsx)("span", { children: t("plan.removeWarning", { task: task.id }) }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n onClick: () => {\n setConfirmingRemove(false);\n },\n children: t("plan.cancel")\n }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-danger": true,\n "data-confirming": true,\n onClick: () => {\n remove();\n },\n children: t("plan.removeConfirm")\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planActions,\n children: [\n (0, react_jsx_runtime.jsx)(Feedback, { value: feedback }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-danger": true,\n onClick: () => {\n setConfirmingRemove(true);\n setFeedback(void 0);\n },\n disabled: busy || confirmingRemove,\n children: t("plan.remove")\n }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "submit",\n disabled: busy || !dirty || subject.trim() === "",\n children: busy ? t("plan.saving") : t("plan.save")\n })\n ]\n })\n ]\n })]\n });\n }\n function StagingPlanEditor({ team, modelDirectory, onContinuePlanning, onDiscarded, t }) {\n const membersId = (0, react.useId)();\n const tasksId = (0, react.useId)();\n const [membersOpen, setMembersOpen] = (0, react.useState)(true);\n const [tasksOpen, setTasksOpen] = (0, react.useState)(true);\n const [newTask, setNewTask] = (0, react.useState)("");\n const [busy, setBusy] = (0, react.useState)(false);\n const [discardArmed, setDiscardArmed] = (0, react.useState)(false);\n const [pendingEditors, setPendingEditors] = (0, react.useState)(/* @__PURE__ */ new Set());\n const [feedback, setFeedback] = (0, react.useState)();\n useDismissSuccess(feedback, setFeedback);\n const dependencyLinks = team.tasks.reduce((total, task) => total + task.dependencies.length, 0);\n const runnable = team.members.length > 0 && team.tasks.length > 0;\n const hasPendingEdits = pendingEditors.size > 0 || newTask.trim() !== "";\n const waitingForFeedback = team.planReviewState === "awaiting_feedback";\n (0, react.useEffect)(() => {\n modelDirectory.load().catch(() => void 0);\n }, [modelDirectory]);\n const onPendingChange = (0, react.useCallback)((key, pending) => {\n setPendingEditors((current) => {\n if (pending === current.has(key)) return current;\n const next = new Set(current);\n if (pending) next.add(key);\n else next.delete(key);\n return next;\n });\n }, []);\n const addTask = async (event) => {\n event.preventDefault();\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "add_task",\n subject: newTask,\n dependencies: []\n });\n setNewTask("");\n setFeedback({\n tone: "success",\n message: t("plan.taskAdded")\n });\n setTasksOpen(true);\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n } finally {\n setBusy(false);\n }\n };\n const approve = async () => {\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "approve"\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n }\n };\n const continueInChat = async () => {\n if (waitingForFeedback) {\n onContinuePlanning();\n return;\n }\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "continue"\n });\n onContinuePlanning();\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n }\n };\n const discard = async () => {\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "discard"\n });\n onDiscarded();\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n setDiscardArmed(false);\n }\n };\n return (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.planEditor,\n "data-staging-editor": true,\n children: [\n (0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.planHeader,\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("plan.title") }), (0, react_jsx_runtime.jsx)("small", { children: t("plan.readySummary", {\n members: team.members.length,\n tasks: team.tasks.length,\n links: dependencyLinks\n }) })] }), (0, react_jsx_runtime.jsx)("em", { children: t("plan.badge") })] }), (0, react_jsx_runtime.jsx)("p", { children: t("plan.description") })]\n }),\n (0, react_jsx_runtime.jsxs)("ol", {\n className: ActivityPanel_module_css_default.planFlow,\n "aria-label": t("plan.flow.aria"),\n children: [\n (0, react_jsx_runtime.jsxs)("li", {\n "data-active": true,\n children: [(0, react_jsx_runtime.jsx)("span", { children: "1" }), t("plan.flow.review")]\n }),\n (0, react_jsx_runtime.jsxs)("li", { children: [(0, react_jsx_runtime.jsx)("span", { children: "2" }), t("plan.flow.spawn")] }),\n (0, react_jsx_runtime.jsxs)("li", { children: [(0, react_jsx_runtime.jsx)("span", { children: "3" }), t("plan.flow.run")] })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.planSection,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planSectionToggle,\n "aria-expanded": membersOpen,\n "aria-controls": membersId,\n onClick: () => {\n setMembersOpen((current) => !current);\n },\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("plan.members.title") }), (0, react_jsx_runtime.jsx)("small", { children: t("plan.members.count", { count: team.members.length }) })] }), (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: membersOpen })]\n }), membersOpen && (0, react_jsx_runtime.jsx)("div", {\n id: membersId,\n className: ActivityPanel_module_css_default.planList,\n children: team.members.length === 0 ? (0, react_jsx_runtime.jsx)("p", {\n className: ActivityPanel_module_css_default.planEmpty,\n children: t("plan.members.empty")\n }) : team.members.map((member) => (0, react_jsx_runtime.jsx)(StagedMemberEditor, {\n team,\n member,\n modelDirectory,\n onPendingChange,\n t\n }, member.name))\n })]\n }),\n (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.planSection,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planSectionToggle,\n "aria-expanded": tasksOpen,\n "aria-controls": tasksId,\n onClick: () => {\n setTasksOpen((current) => !current);\n },\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("plan.tasks.title") }), (0, react_jsx_runtime.jsx)("small", { children: t("plan.tasks.count", {\n count: team.tasks.length,\n links: dependencyLinks\n }) })] }), (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: tasksOpen })]\n }), tasksOpen && (0, react_jsx_runtime.jsx)("div", {\n id: tasksId,\n className: ActivityPanel_module_css_default.planList,\n children: team.tasks.length === 0 ? (0, react_jsx_runtime.jsx)("p", {\n className: ActivityPanel_module_css_default.planEmpty,\n children: t("plan.tasks.empty")\n }) : team.tasks.map((task) => (0, react_jsx_runtime.jsx)(StagedTaskEditor, {\n team,\n task,\n onPendingChange,\n t\n }, task.id))\n })]\n }),\n (0, react_jsx_runtime.jsxs)("form", {\n className: ActivityPanel_module_css_default.planNewTask,\n onSubmit: (event) => {\n addTask(event);\n },\n children: [(0, react_jsx_runtime.jsxs)("label", { children: [(0, react_jsx_runtime.jsx)("span", { children: t("plan.newTaskLabel") }), (0, react_jsx_runtime.jsx)("input", {\n name: "newTask",\n value: newTask,\n onChange: (event) => {\n setNewTask(event.currentTarget.value);\n setFeedback(void 0);\n },\n placeholder: t("plan.newTask"),\n disabled: busy\n })] }), (0, react_jsx_runtime.jsx)("button", {\n type: "submit",\n disabled: busy || newTask.trim() === "",\n children: busy ? t("plan.adding") : t("plan.addTask")\n })]\n }),\n (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.planApproveRow,\n "data-armed": discardArmed || void 0,\n "data-discard": discardArmed || void 0,\n "data-review-state": waitingForFeedback ? "awaiting-feedback" : "awaiting-review",\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planApproveCopy,\n children: [(0, react_jsx_runtime.jsx)("strong", { children: discardArmed ? t("plan.discardConfirmTitle") : waitingForFeedback ? t("plan.feedbackTitle") : t("plan.approveTitle") }), (0, react_jsx_runtime.jsx)("small", { children: discardArmed ? t("plan.discardWarning") : waitingForFeedback ? t("plan.feedbackHint") : hasPendingEdits ? t("plan.pendingEdits") : t("plan.approveHint", {\n members: team.members.length,\n tasks: team.tasks.length\n }) })]\n }),\n (0, react_jsx_runtime.jsx)(Feedback, { value: feedback }),\n discardArmed ? (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planApproveActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n disabled: busy,\n onClick: () => {\n setDiscardArmed(false);\n },\n children: t("plan.cancel")\n }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-discard": true,\n "data-danger": true,\n "data-confirming": true,\n disabled: busy,\n onClick: () => {\n discard();\n },\n children: busy ? t("plan.discarding") : t("plan.discardConfirm")\n })]\n }) : (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planReviewActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-approve": true,\n disabled: busy || !runnable || hasPendingEdits,\n onClick: () => {\n approve();\n },\n children: t("plan.approve")\n }), (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planSecondaryActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-continue": true,\n disabled: busy,\n onClick: () => {\n continueInChat();\n },\n children: t(waitingForFeedback ? "plan.returnToChat" : "plan.continue")\n }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-discard": true,\n "data-danger": true,\n disabled: busy,\n onClick: () => {\n setDiscardArmed(true);\n setFeedback(void 0);\n },\n children: t("plan.discard")\n })]\n })]\n })\n ]\n })\n ]\n });\n }\n\n\n /** Pure persisted geometry rules for the T Team shell-overlay panel. */\n const PANEL_LAYOUT_STORAGE_KEY = "t-team:activity-panel:v1";\n const DEFAULT_PANEL_LAYOUT = Object.freeze({\n mode: "docked",\n x: 0,\n y: 64,\n width: 388,\n height: 640,\n heightMode: "auto"\n });\n function clamp(value, minimum, maximum) {\n return Math.min(Math.max(value, minimum), maximum);\n }\n function finite(value) {\n return typeof value === "number" && Number.isFinite(value);\n }\n /** Decode one versioned localStorage value, rejecting partial/corrupt state. */\n function parsePanelLayout(value) {\n if (value === null) return DEFAULT_PANEL_LAYOUT;\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== "object" || parsed === null) return DEFAULT_PANEL_LAYOUT;\n const record = parsed;\n if (record.mode !== "docked" && record.mode !== "floating" || !finite(record.x) || !finite(record.y) || !finite(record.width) || !finite(record.height)) return DEFAULT_PANEL_LAYOUT;\n return {\n mode: record.mode,\n x: record.x,\n y: record.y,\n width: record.width,\n height: record.height,\n heightMode: record.mode === "floating" && record.heightMode === "manual" ? "manual" : "auto"\n };\n } catch {\n return DEFAULT_PANEL_LAYOUT;\n }\n }\n /** Whether the panel should become a simple inset overlay with no gestures. */\n function compactPanelForBounds(bounds) {\n return bounds.width <= 960;\n }\n /** Docked and compact panels always fit content; floating panels may be user-sized. */\n function panelUsesAutoHeight(layout, bounds) {\n return compactPanelForBounds(bounds) || layout.mode === "docked" || layout.heightMode === "auto";\n }\n /** CSS max-height ceiling that keeps an auto-height panel inside its shell. */\n function panelMaximumHeight(layout, bounds) {\n const bottomInset = compactPanelForBounds(bounds) || layout.mode === "floating" ? 12 : 48;\n return Math.max(1, bounds.height - layout.y - bottomInset);\n }\n /** Resolve persisted state into a visible rectangle inside the current shell. */\n function resolvePanelGeometry(layout, bounds) {\n const boundsWidth = Math.max(1, bounds.width);\n const boundsHeight = Math.max(1, bounds.height);\n if (compactPanelForBounds(bounds)) return {\n ...layout,\n x: 12,\n y: 12,\n width: Math.max(1, boundsWidth - 24),\n height: Math.max(1, boundsHeight - 24)\n };\n const maximumWidth = Math.max(1, Math.min(640, boundsWidth - 24));\n const minimumWidth = Math.min(320, maximumWidth);\n const width = clamp(layout.width, minimumWidth, maximumWidth);\n const maximumHeight = Math.max(1, boundsHeight - 24);\n const minimumHeight = Math.min(360, maximumHeight);\n if (layout.mode === "docked") {\n const y = clamp(64, 12, Math.max(12, boundsHeight - minimumHeight - 12));\n const availableHeight = Math.max(1, boundsHeight - y - 48);\n const height = clamp(availableHeight, Math.min(minimumHeight, availableHeight), maximumHeight);\n const anchorRight = clamp(bounds.anchorRight, 0, boundsWidth);\n const maximumX = Math.max(12, boundsWidth - width - 12);\n return {\n mode: "docked",\n x: clamp(anchorRight - 18 - width, 12, maximumX),\n y,\n width,\n height,\n heightMode: layout.heightMode\n };\n }\n const height = clamp(layout.height, minimumHeight, maximumHeight);\n return {\n mode: "floating",\n x: clamp(layout.x, 12, Math.max(12, boundsWidth - width - 12)),\n y: clamp(layout.y, 12, Math.max(12, boundsHeight - height - 12)),\n width,\n height,\n heightMode: layout.heightMode\n };\n }\n /** Undock without a visual jump by adopting the panel\'s resolved rectangle. */\n function floatPanelLayout(geometry, bounds) {\n return resolvePanelGeometry({\n ...geometry,\n mode: "floating"\n }, bounds);\n }\n /** Return to the right dock, preserving width and restoring content-fit height. */\n function dockPanelLayout(layout, bounds) {\n return resolvePanelGeometry({\n ...layout,\n mode: "docked",\n heightMode: "auto"\n }, bounds);\n }\n /** Translate a floating panel and clamp it back into the visible shell. */\n function movePanelLayout(start, dx, dy, bounds) {\n return resolvePanelGeometry({\n ...start,\n mode: "floating",\n x: start.x + dx,\n y: start.y + dy\n }, bounds);\n }\n /** Resize while keeping the edge opposite the active handle stationary. */\n function resizePanelLayout(start, edge, dx, dy, bounds) {\n if (start.mode === "docked") {\n if (edge !== "left") return resolvePanelGeometry(start, bounds);\n return resolvePanelGeometry({\n ...start,\n width: start.width - dx\n }, bounds);\n }\n const resolved = resolvePanelGeometry(start, bounds);\n const minimumWidth = Math.min(320, resolved.x + resolved.width - 12);\n const minimumHeight = Math.min(360, bounds.height - resolved.y - 12);\n if (edge === "left") {\n const right = resolved.x + resolved.width;\n const maximumWidth = Math.max(1, Math.min(640, right - 12));\n const width = clamp(resolved.width - dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return {\n ...resolved,\n x: right - width,\n width\n };\n }\n const maximumHeight = Math.max(1, bounds.height - resolved.y - 12);\n const height = clamp(resolved.height + dy, Math.min(minimumHeight, maximumHeight), maximumHeight);\n if (edge === "bottom") return {\n ...resolved,\n height,\n heightMode: "manual"\n };\n const maximumWidth = Math.max(1, Math.min(640, bounds.width - resolved.x - 12));\n const width = clamp(resolved.width + dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return {\n ...resolved,\n width,\n height,\n heightMode: "manual"\n };\n }\n\n\n /**\n * T Team activity panel: the top-right floater monitoring every team.\n *\n * Modeled on the Claude Code desktop SessionActivityPanel: a shell-overlay\n * panel that docks at the conversation\'s top-right edge by default, can be\n * dragged into a floating window, resized, and folded into an activity badge.\n * On wide viewports the docked panel makes the conversation column yield\n * space; narrow viewports keep a simple inset overlay. It\n * polls the host `/plugins/t-team/state` route for\n * server-side snapshots (durable files + live subagent activity), with a\n * collapsed badge that auto-expands once when activity appears. Archived\n * teams stay available for the owning conversation after live work ends.\n *\n * The floater mounts in ui-layout\'s additive `shell.overlay`; it is not a\n * conversation node \u2014 the in-conversation panel was removed in favor of this\n * always-available monitor.\n * @module t-team/client/activity\n */\n /** Grace before the panel collapses once no team remains. */\n const AUTOCLOSE_GRACE_MS = 2e3;\n /**\n * Page-settle window after mount: activity restored on page load only shows\n * the collapsed badge, so the panel never yanks the conversation column\n * right after load. New activity after this window auto-expands as usual.\n */\n const AUTO_OPEN_SETTLE_MS = 4e3;\n /** Root marker shared with the panel CSS while the shell overlay is expanded. */\n const PANEL_OPEN_ATTRIBUTE = "data-t-team-panel-open";\n /** Shared width concession consumed by the conversation root CSS. */\n const PANEL_SHIFT_PROPERTY = "--t-team-panel-shift";\n const PANEL_CONVERSATION_GAP = 14;\n const MOVE_THRESHOLD = 4;\n const CAPTAIN_ASSIGNEE = "captain";\n function initialPanelLayout() {\n if (typeof window === "undefined") return DEFAULT_PANEL_LAYOUT;\n return parsePanelLayout(window.localStorage.getItem(PANEL_LAYOUT_STORAGE_KEY));\n }\n function initialPanelBounds() {\n if (typeof window === "undefined") return {\n width: 1440,\n height: 900,\n anchorRight: 1440\n };\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n anchorRight: window.innerWidth\n };\n }\n /** Initial-letter fallback for unmatched roles. */\n function memberInitial(name) {\n return name.trim().slice(0, 1).toUpperCase() || "?";\n }\n function stableHash(value) {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) hash = (hash << 5) - hash + value.charCodeAt(index) | 0;\n return Math.abs(hash);\n }\n const ACCENTS = [\n "var(--dsw-alias-state-business-primary)",\n "var(--dsw-alias-state-success)",\n "var(--dsw-alias-state-danger)",\n "var(--dsw-alias-state-warning)",\n "var(--dsw-alias-label-tertiary)"\n ];\n function accentOf(id) {\n return ACCENTS[stableHash(id) % ACCENTS.length] ?? ACCENTS[0];\n }\n /** Badge text follows the raw task status (finer than the 4 visual states):\n * claimed/pending/failed/cancelled keep their own labels and colors. */\n const TASK_STATUS_LABEL = {\n pending: "task.status.pending",\n claimed: "task.status.claimed",\n in_progress: "task.status.inProgress",\n completed: "task.status.completed",\n failed: "task.status.failed",\n cancelled: "task.status.cancelled"\n };\n function taskStatusLabel(status, t) {\n const key = TASK_STATUS_LABEL[status];\n return key === void 0 ? status : t(key);\n }\n function formatTaskIds(ids, t) {\n return ids.join(t("format.listSeparator"));\n }\n function taskTitle(task, model) {\n const extras = [\n task.kind,\n task.round === void 0 ? void 0 : `r${task.round}`,\n task.verdict,\n model === "" ? void 0 : model\n ].filter((item) => item !== void 0);\n return extras.length === 0 ? `${task.id} \xB7 ${task.subject}` : `${task.id} \xB7 ${task.subject} \xB7 ${extras.join(" \xB7 ")}`;\n }\n /** Badge/bar coloring key: visual state, widened for terminal statuses. */\n function taskTone(state, status) {\n if (status === "failed") return "failed";\n if (status === "cancelled") return "cancelled";\n return state;\n }\n function Chevron({ open }) {\n return (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.chevron,\n "data-open": open,\n width: "9",\n height: "9",\n viewBox: "0 0 10 10",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.5",\n strokeLinecap: "round",\n "aria-hidden": true,\n children: (0, react_jsx_runtime.jsx)("path", { d: "M3.5 2l3 3-3 3" })\n });\n }\n function WorkGlyph({ active }) {\n return (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.workGlyph,\n "data-active": active,\n width: "11",\n height: "11",\n viewBox: "0 0 11 11",\n fill: "currentColor",\n "aria-hidden": true,\n children: [\n [0, 0],\n [4.2, 0],\n [8.4, 0],\n [0, 4.2],\n [4.2, 4.2],\n [8.4, 4.2]\n ].map(([x, y], index) => (0, react_jsx_runtime.jsx)("rect", {\n x,\n y,\n width: "2.6",\n height: "2.6",\n rx: ".6",\n style: { animationDelay: `${index * .15}s` }\n }, `${x}:${y}`))\n });\n }\n /** Collapsed badge: an always-visible corner pill while any team exists. */\n function CollapsedBadge({ count, busy, onClick, t }) {\n return (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.badge,\n "data-t-team-collapsed": true,\n "data-busy": busy,\n onClick,\n "aria-label": t("activity.badgeAria", { count }),\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.badgeDot,\n "data-busy": busy,\n "aria-hidden": true\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.badgeCount,\n children: count\n })]\n });\n }\n function memberStateLabel(member, tasks, historic, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n if (member.activity === "working") return t("member.state.working");\n if (owned.some((task) => task.status === "failed")) return t("member.state.failed");\n if (owned.some((task) => task.state === "blocked")) return t("member.state.waiting");\n if (owned.length > 0 && owned.every((task) => task.status === "completed")) return t("member.state.delivered");\n if (member.status === "removed") return t(historic ? "member.state.left" : "member.state.removed");\n if (owned.length > 0) return t("member.state.pending");\n return t("member.state.unassigned");\n }\n function memberStatusText(member, tasks, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n const current = owned.find((task) => task.id === member.currentTask);\n const blocked = owned.find((task) => task.state === "blocked");\n if (member.activity === "working" && current !== void 0) {\n const model = taskModelLabel(current, [member]);\n return model === "" ? t("member.status.executing", { taskId: current.id }) : t("member.status.executingModel", {\n taskId: current.id,\n model\n });\n }\n if (member.activity === "working") return t("member.status.working");\n if (blocked !== void 0) {\n const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== "completed");\n if (dependency !== void 0) return t("member.status.waitingOn", {\n taskId: dependency.id,\n assignee: dependency.assignee || t("task.assignee.unclaimed")\n });\n return t("member.status.waitingPrerequisite");\n }\n if (member.total === 0) return t("member.status.waitingAssignment");\n if (member.done === member.total) return t("member.status.delivered");\n return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");\n }\n function compactTaskLabel(subject) {\n const withoutVerb = subject.replace(/^\u5F00\u53D1\\s*/u, "").replace(/^\\d+[-_.\u3001\\s]*/u, "");\n const head = withoutVerb.split(/[\uFF08(\xB7\uFF1A:]/u)[0]?.trim() ?? withoutVerb;\n return head.length > 18 ? `${head.slice(0, 17)}\u2026` : head;\n }\n function taskSummary(team, t, discarded = false) {\n const completed = team.tasks.filter((task) => task.status === "completed");\n const cancelled = team.tasks.filter((task) => task.status === "cancelled");\n const running = team.tasks.filter((task) => task.state === "running");\n const blocked = team.tasks.filter((task) => task.state === "blocked");\n const ready = team.tasks.filter((task) => task.state === "open" && task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled");\n const failed = team.tasks.filter((task) => task.status === "failed");\n if (discarded) return t("task.summary.discarded", { count: team.tasks.length });\n if (team.tasks.length === 0) return t("task.summary.waitingBreakdown");\n if (team.phase === "staged") return t("task.summary.staged", { count: team.tasks.length });\n if (completed.length === team.tasks.length) return t("task.summary.allDelivered", { count: completed.length });\n if (completed.length + cancelled.length + failed.length === team.tasks.length) return t("task.summary.ended", {\n completed: completed.length,\n cancelled: cancelled.length,\n failed: failed.length\n });\n if (failed.length > 0 && running.length === 0 && ready.length === 0 && blocked.length === 0) return t("task.summary.failedSettled", { count: failed.length });\n if (blocked.length > 0 && running.length > 0) return t("task.summary.blockedAndRunning", {\n tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),\n more: blocked.length > 3 ? t("task.summary.more", { count: blocked.length - 3 }) : ""\n });\n if (running.length > 0) return t("task.summary.running", { tasks: formatTaskIds(running.map((task) => task.id), t) });\n if (ready.length > 0) return t("task.summary.ready", { tasks: formatTaskIds(ready.map((task) => task.id), t) });\n if (blocked.length > 0) return t("task.summary.blocked", { tasks: formatTaskIds(blocked.map((task) => task.id), t) });\n return t("task.summary.waitingSchedule");\n }\n function ProgressOverview({ team, t, discarded = false }) {\n const running = discarded ? 0 : team.tasks.filter((task) => task.state === "running").length;\n const blocked = discarded ? 0 : team.tasks.filter((task) => task.state === "blocked").length;\n const completed = discarded ? 0 : team.tasks.filter((task) => task.status === "completed").length;\n const settled = !discarded && team.tasks.length > 0 && team.tasks.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled");\n const summaryTone = discarded ? "discarded" : blocked > 0 ? "warning" : settled ? "completed" : "running";\n return (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.progressOverview,\n "aria-label": t("progress.aria"),\n "data-progress-summary": true,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.progressTitle,\n children: t("progress.title")\n }),\n team.tasks.length > 0 ? (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.progressSegments,\n "aria-hidden": true,\n children: team.tasks.map((task) => (0, react_jsx_runtime.jsx)("span", { "data-state": discarded ? "cancelled" : taskTone(task.state, task.status) }, task.id))\n }) : (0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressEmpty }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.progressLegend,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n "data-state": "running",\n children: t("progress.running", { count: running })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-state": "blocked",\n children: t("progress.blocked", { count: blocked })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-state": "completed",\n children: t("progress.delivered", { count: completed })\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.progressSummary,\n "data-state": summaryTone,\n children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team, t, discarded) })]\n })\n ]\n });\n }\n function DependencyMap({ tasks, members, t, discarded = false }) {\n const [open, setOpen] = (0, react.useState)(true);\n const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);\n const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);\n const [pinnedTaskId, setPinnedTaskId] = (0, react.useState)(null);\n const hoverTimer = (0, react.useRef)(null);\n const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);\n const layout = (0, react.useMemo)(() => compactDagLayout(tasks), [tasks]);\n const parallel = (0, react.useMemo)(() => usesParallelTaskGrid(tasks), [tasks]);\n const related = (0, react.useMemo)(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);\n const scheduleHover = (id) => {\n if (hoverTimer.current !== null) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (id === null) {\n setHoverTaskId(null);\n return;\n }\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n setHoverTaskId(id);\n }, 180);\n };\n (0, react.useEffect)(() => () => {\n if (hoverTimer.current !== null) clearTimeout(hoverTimer.current);\n }, []);\n (0, react.useEffect)(() => {\n const onKeyDown = (event) => {\n if (event.key === "Escape") setPinnedTaskId(null);\n };\n window.addEventListener("keydown", onKeyDown);\n return () => {\n window.removeEventListener("keydown", onKeyDown);\n };\n }, []);\n if (tasks.length === 0) return null;\n const fallbackTask = tasks.find((task) => task.state === "blocked") ?? tasks.find((task) => task.state === "running") ?? tasks[0];\n const detailTask = tasks.find((task) => task.id === focusedTaskId) ?? fallbackTask;\n const detailModel = taskModelLabel(detailTask, members);\n const waitingOn = detailTask.dependencies.filter((dependency) => tasks.find((task) => task.id === dependency)?.status !== "completed");\n const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));\n return (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.dependencySection,\n "aria-label": t("dependency.aria"),\n "data-dependency-map": true,\n children: [(0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.sectionHead,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.sectionToggleTitle,\n onClick: () => {\n setOpen((current) => !current);\n },\n "aria-expanded": open,\n children: [\n (0, react_jsx_runtime.jsx)(Chevron, { open }),\n (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),\n " ",\n t(parallel ? "dependency.parallel" : "dependency.title")\n ]\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.sectionHint,\n children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })\n })]\n }), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.dagViewport,\n children: (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.dagCanvas,\n "data-layout": parallel ? "parallel" : "dependency",\n style: parallel ? void 0 : {\n width: layout.width,\n height: layout.height\n },\n children: [!parallel && (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.dagEdges,\n width: layout.width,\n height: layout.height,\n "aria-hidden": true,\n children: layout.edges.map((edge) => {\n const active = related !== null && related.has(edge.from) && related.has(edge.to);\n return (0, react_jsx_runtime.jsx)("path", {\n d: edge.path,\n "data-active": active,\n "data-dimmed": related !== null && !active\n }, `${edge.from}:${edge.to}`);\n })\n }), layout.nodes.map(({ task, x, y }) => {\n const model = taskModelLabel(task, members);\n const shortModel = compactModelLabel(model);\n return (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.dagNode,\n style: parallel ? { height: 30 } : {\n left: x,\n top: y,\n width: 92,\n height: 30\n },\n "data-task-id": task.id,\n "data-state": discarded ? "cancelled" : taskTone(task.state, task.status),\n "data-task-model": model || void 0,\n "data-focused": related?.has(task.id) ?? false,\n "data-dimmed": related !== null && !related.has(task.id),\n "aria-pressed": pinnedTaskId === task.id,\n title: taskTitle(task, model),\n onClick: () => {\n setPinnedTaskId((current) => current === task.id ? null : task.id);\n },\n onMouseEnter: () => {\n scheduleHover(task.id);\n },\n onMouseLeave: () => {\n scheduleHover(null);\n },\n onFocus: () => {\n setKeyboardTaskId(task.id);\n },\n onBlur: () => {\n setKeyboardTaskId(null);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.dagNodeHead,\n children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.dagNodeDot }), task.id]\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.dagNodeLabel,\n children: task.state === "running" && shortModel !== "" ? shortModel : compactTaskLabel(task.subject)\n }),\n task.state === "running" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.dagRunningState,\n "aria-label": t("task.runningAria"),\n children: (0, react_jsx_runtime.jsx)(WorkGlyph, { active: true })\n })\n ]\n }, task.id);\n })]\n })\n }), (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.taskDetail,\n "data-task-detail": detailTask.id,\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.taskDetailHead,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailId,\n children: detailTask.id\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailSubject,\n title: detailTask.subject,\n children: detailTask.subject.replace(/^\u5F00\u53D1\\s*/u, "")\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailBadge,\n "data-state": discarded ? "cancelled" : taskTone(detailTask.state, detailTask.status),\n children: discarded ? t("task.status.notRun") : taskStatusLabel(detailTask.status, t)\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.taskDetailLine,\n children: [\n detailTask.assignee || t("task.assignee.unclaimed"),\n " \xB7 ",\n discarded ? t("task.detail.notRun") : detailTask.status === "completed" ? t("task.detail.completed") : detailTask.dependencies.length === 0 ? t("task.detail.noPrerequisite") : waitingOn.length === 0 ? t("task.detail.ready") : t("task.detail.waitingOn", { tasks: formatTaskIds(waitingOn, t) })\n ]\n }),\n detailModel !== "" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailModel,\n "data-task-model": detailModel,\n children: t("task.model", { model: detailModel })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailMeta,\n children: dependents.length === 0 ? t("task.detail.noDownstream") : t("task.detail.unlocks", { tasks: formatTaskIds(dependents.map((task) => task.id), t) })\n })\n ]\n })] })]\n });\n }\n function TeamSection({ team, modelDirectory, onContinuePlanning, onDiscarded, onNavigate, t, historic = false }) {\n const [membersOpen, setMembersOpen] = (0, react.useState)(true);\n const [stopOpen, setStopOpen] = (0, react.useState)(false);\n const [stopping, setStopping] = (0, react.useState)(false);\n const [stopError, setStopError] = (0, react.useState)("");\n const discarded = historic && team.phase === "staged";\n const stopped = !historic && team.halted === true;\n const busyCount = team.members.filter((member) => member.activity === "working").length;\n const assignedCount = team.tasks.filter((task) => task.assignee !== "" && task.assignee !== CAPTAIN_ASSIGNEE).length;\n const captainOwned = team.tasks.filter((task) => task.assignee === CAPTAIN_ASSIGNEE && task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled");\n const captainBusy = captainOwned.length > 0;\n const captainTaskIds = formatTaskIds(captainOwned.map((task) => task.id), t);\n const completedCount = team.tasks.filter((task) => task.status === "completed").length;\n const allCompleted = team.tasks.length > 0 && completedCount === team.tasks.length;\n const allSettled = team.tasks.length > 0 && team.tasks.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled");\n const unfinishedCount = team.tasks.filter((task) => task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled").length;\n const canStop = !historic && team.phase === "running" && team.halted !== true && teamIsActive(team);\n const stopTeam = async () => {\n if (stopping) return;\n setStopping(true);\n setStopError("");\n try {\n const response = await fetch(ACTIVITY_HALT_URL, {\n method: "POST",\n cache: "no-store",\n headers: { "content-type": "application/json" },\n body: JSON.stringify({\n sessionId: team.captainSessionId,\n teamId: team.teamId\n })\n });\n if (!response.ok) {\n let message = t("team.stopRequestFailed");\n try {\n const body = await response.json();\n if (typeof body.error === "string" && body.error.trim() !== "") message = body.error;\n } catch {}\n throw new Error(message);\n }\n setStopOpen(false);\n } catch (error) {\n setStopError(t("team.stopFailed", { message: error instanceof Error ? error.message : String(error) }));\n } finally {\n setStopping(false);\n }\n };\n return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.team,\n "data-team-id": team.teamId,\n children: [\n (0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.teamHead,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.teamName,\n title: team.name,\n children: team.name\n }),\n historic && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.historicPill,\n children: t(discarded ? "team.discarded" : "team.ended")\n }),\n stopped && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.historicPill,\n children: t("team.stopped")\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.teamStats,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n "data-stat": "members",\n children: t("team.stats.members", { count: team.members.length })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-stat": "tasks",\n children: t("team.stats.completed", {\n completed: completedCount,\n total: team.tasks.length\n })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-stat": "messages",\n children: t("team.stats.messages", { count: team.messageCount })\n })\n ]\n }),\n canStop && (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.teamStopButton,\n "aria-label": t("team.stop"),\n title: t("team.stop"),\n onClick: () => {\n setStopError("");\n setStopOpen(true);\n },\n children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconStopFill16, {})\n })\n ]\n }),\n team.phase === "staged" && !historic && modelDirectory !== void 0 && onContinuePlanning !== void 0 && onDiscarded !== void 0 && (0, react_jsx_runtime.jsx)(StagingPlanEditor, {\n team,\n modelDirectory,\n onContinuePlanning,\n onDiscarded,\n t\n }),\n (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.delegationSection,\n "aria-label": t("delegation.aria"),\n "data-delegation-map": true,\n children: [\n (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.captainNode,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainAvatar,\n children: (0, react_jsx_runtime.jsx)("img", {\n className: ActivityPanel_module_css_default.leadAvatar,\n src: LEAD_ART,\n alt: "",\n "aria-hidden": true\n })\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.captainInfo,\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.captainLine,\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainName,\n children: t("captain.name")\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainRole,\n children: t("captain.role")\n })]\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainSummary,\n children: discarded ? t("captain.summary.discarded", {\n tasks: team.tasks.length,\n members: team.members.length\n }) : captainBusy ? t("captain.summary.withTakeover", {\n tasks: assignedCount,\n captainTasks: captainTaskIds\n }) : team.phase === "staged" ? t(team.planReviewState === "awaiting_feedback" ? "captain.summary.awaitingFeedback" : "captain.summary.staged", {\n tasks: team.tasks.length,\n members: team.members.length\n }) : t("captain.summary", {\n tasks: assignedCount,\n members: team.members.length\n })\n })]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.captainState,\n "data-busy": captainBusy || busyCount > 0,\n children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: captainBusy || busyCount > 0 }), discarded ? t("captain.state.discarded") : captainBusy ? t("captain.state.takeover", { tasks: captainTaskIds }) : team.phase === "staged" ? t(team.planReviewState === "awaiting_feedback" ? "captain.state.awaitingFeedback" : "captain.state.staged") : busyCount > 0 ? t("captain.state.working", { count: busyCount }) : t(allCompleted ? "captain.state.collected" : allSettled ? "captain.state.settled" : "captain.state.waiting")]\n })\n ]\n }),\n (0, react_jsx_runtime.jsx)(ProgressOverview, {\n team,\n t,\n discarded\n }),\n (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.membersToggle,\n onClick: () => {\n setMembersOpen((current) => !current);\n },\n "aria-expanded": membersOpen,\n "data-members-toggle": true,\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }), t("members.toggle", { count: team.members.length })] }), (0, react_jsx_runtime.jsx)("span", { children: t(membersOpen ? "members.collapse" : "members.expand") })]\n }),\n membersOpen && (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.delegationTree,\n children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.emptyHint,\n children: t("members.empty")\n }), team.members.map((member) => {\n const owned = team.tasks.filter((task) => task.assignee === member.name);\n const memberModel = memberRouteLabel(member);\n return (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.memberBlock,\n "data-activity": member.activity,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberBranch,\n "aria-hidden": true,\n children: (0, react_jsx_runtime.jsx)("span", {})\n }),\n (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.memberRow,\n "data-activity": member.activity,\n onClick: () => {\n if (member.id !== "") onNavigate(team.captainSessionId, member.id);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberAvatar,\n "data-unread": member.unread > 0,\n children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {\n className: ActivityPanel_module_css_default.memberArt,\n src: memberArtUrl(member.name, member.role) ?? "",\n alt: "",\n "aria-hidden": true\n }) : (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberInitial,\n style: { background: accentOf(member.id) },\n children: memberInitial(member.name)\n }), (0, react_jsx_runtime.jsx)("img", {\n className: ActivityPanel_module_css_default.stateArt,\n "data-activity": member.activity,\n src: ACTION_ART[member.activity],\n alt: "",\n "aria-hidden": true\n })]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberInfo,\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberLine,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberName,\n children: member.name\n }),\n member.role !== "" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberRole,\n children: member.role\n }),\n memberModel !== "" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberModel,\n role: "img",\n "data-member-model": memberModel,\n title: memberModel,\n "aria-label": memberModel,\n children: compactModelLabel(memberModel)\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberState,\n "data-activity": member.activity,\n children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), discarded ? t("member.state.notCreated") : stopped ? t("member.state.stopped") : team.phase === "staged" ? t("member.state.staged") : memberStateLabel(member, team.tasks, historic, t)]\n })\n ]\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberStatusLine,\n children: discarded ? t("member.status.discarded") : stopped ? t("member.status.stopped") : team.phase === "staged" ? t("member.status.staged") : historic && owned.length > 0 && owned.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled") ? t("member.status.settled") : memberStatusText(member, team.tasks, t)\n })]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberCount,\n children: [\n member.done,\n "/",\n member.total\n ]\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.assignmentLine,\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.assignmentLabel,\n children: t(discarded ? "assignment.discarded" : team.phase === "staged" ? "assignment.staged" : "assignment.label")\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.assignmentTasks,\n children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskEmpty,\n children: t("assignment.empty")\n }) : owned.map((task) => {\n const model = taskModelLabel(task, team.members);\n const shortModel = compactModelLabel(model);\n return (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.assignmentChip,\n "data-state": discarded ? "cancelled" : taskTone(task.state, task.status),\n "data-task-model": model || void 0,\n title: taskTitle(task, model),\n children: task.state === "running" && shortModel !== "" ? `${task.id} \xB7 ${shortModel}` : task.id\n }, task.id);\n })\n })]\n })\n ]\n }, member.id || member.name);\n })]\n })\n ]\n }),\n (0, react_jsx_runtime.jsx)(DependencyMap, {\n tasks: team.tasks,\n members: team.members,\n t,\n discarded\n })\n ]\n }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {\n open: stopOpen,\n onClose: () => {\n if (!stopping) setStopOpen(false);\n },\n title: t("team.stopTitle", { team: team.name }),\n closeLabel: t("plan.cancel"),\n description: t("team.stopDescription", {\n tasks: unfinishedCount,\n members: busyCount\n }),\n footer: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.stopModalActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n disabled: stopping,\n onClick: () => {\n setStopOpen(false);\n },\n children: t("team.stopCancel")\n }), (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n "data-danger": true,\n disabled: stopping,\n onClick: () => {\n stopTeam();\n },\n children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconStopFill16, {}), stopping ? t("team.stopping") : t("team.stopConfirm")]\n })]\n }),\n children: stopError !== "" && (0, react_jsx_runtime.jsxs)("p", {\n className: ActivityPanel_module_css_default.stopModalError,\n role: "alert",\n children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, {}), stopError]\n })\n })] });\n }\n /** Legacy conversation cards may outlive their host archive. Project their\n * durable roster through the same rebuilt panel instead of a second UI. */\n function historicCardTeam(data, owner) {\n return {\n workspace: "",\n teamId: data.teamId,\n name: data.teamName,\n captainSessionId: data.captainSessionId || owner,\n phase: "running",\n members: data.members.map((member) => ({\n ...member,\n status: "removed",\n activity: "idle",\n progress: 0,\n done: 0,\n total: 0,\n currentTask: "",\n unread: 0\n })),\n tasks: [],\n messageCount: 0,\n captainInbox: []\n };\n }\n function ActivityPanel({ sessionsList, modelDirectories, openMember, t, conversationVisible = true }) {\n const navigateToSession = (parentId, childId) => {\n setOpen(false);\n setWasActive(false);\n openMember(parentId, childId);\n };\n const [open, setOpen] = (0, react.useState)(false);\n const [openOwner, setOpenOwner] = (0, react.useState)();\n const [autoOpened, setAutoOpened] = (0, react.useState)(false);\n const [wasActive, setWasActive] = (0, react.useState)(false);\n const [historic, setHistoric] = (0, react.useState)(/* @__PURE__ */ new Map());\n const [layout, setLayout] = (0, react.useState)(initialPanelLayout);\n const [bounds, setBounds] = (0, react.useState)(initialPanelBounds);\n const [interaction, setInteraction] = (0, react.useState)(null);\n const panelRef = (0, react.useRef)(null);\n const boundsRef = (0, react.useRef)(bounds);\n const gestureRef = (0, react.useRef)(null);\n const frameRef = (0, react.useRef)(null);\n const pendingLayoutRef = (0, react.useRef)(null);\n const current = (0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot).current;\n const autoOpenTrackerRef = (0, react.useRef)({\n sessionId: current,\n restoreComplete: false,\n liveTeamIds: /* @__PURE__ */ new Set()\n });\n const monitorTargets = (0, react.useSyncExternalStore)(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);\n const returnToComposer = () => {\n setOpen(false);\n setOpenOwner(void 0);\n window.requestAnimationFrame(() => {\n document.querySelector("[data-composer-card] [contenteditable=\\"true\\"][role=\\"textbox\\"], [data-composer-card] textarea")?.focus();\n });\n };\n const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n const currentTargets = (0, react.useMemo)(() => current === void 0 ? [] : monitorTargets.filter((target) => target.sessionId === current), [current, monitorTargets]);\n const currentRef = (0, react.useRef)(current);\n (0, react.useEffect)(() => {\n currentRef.current = current;\n }, [current]);\n const mountedAtRef = (0, react.useRef)(performance.now());\n const expanded = conversationVisible && activityPanelExpandedForSession(open, openOwner, current);\n const geometry = (0, react.useMemo)(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);\n const compact = compactPanelForBounds(bounds);\n const commitLayout = (0, react.useCallback)((next) => {\n setLayout(next);\n }, []);\n (0, react.useEffect)(() => {\n window.localStorage.setItem(PANEL_LAYOUT_STORAGE_KEY, JSON.stringify(layout));\n }, [layout]);\n (0, react.useLayoutEffect)(() => {\n const overlay = document.querySelector("[data-shell-overlay]");\n if (overlay === null) return;\n const conversation = document.querySelector("[data-phase=\'active\']");\n let frame = null;\n const measure = () => {\n frame = null;\n const overlayRect = overlay.getBoundingClientRect();\n const conversationRect = conversation?.getBoundingClientRect();\n const next = {\n width: overlayRect.width,\n height: overlayRect.height,\n anchorRight: conversationRect === void 0 ? overlayRect.width : Math.min(Math.max(conversationRect.right - overlayRect.left, 0), overlayRect.width)\n };\n const previous = boundsRef.current;\n if (previous.width === next.width && previous.height === next.height && previous.anchorRight === next.anchorRight) return;\n boundsRef.current = next;\n setBounds(next);\n };\n const scheduleMeasure = () => {\n frame ??= requestAnimationFrame(measure);\n };\n measure();\n const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(scheduleMeasure);\n observer?.observe(overlay);\n if (conversation !== null) observer?.observe(conversation);\n window.addEventListener("resize", scheduleMeasure);\n return () => {\n if (frame !== null) cancelAnimationFrame(frame);\n observer?.disconnect();\n window.removeEventListener("resize", scheduleMeasure);\n };\n }, [current]);\n (0, react.useLayoutEffect)(() => {\n const tracker = autoOpenTrackerRef.current;\n if (tracker.sessionId !== current) {\n tracker.sessionId = current;\n tracker.restoreComplete = false;\n tracker.liveTeamIds = /* @__PURE__ */ new Set();\n setWasActive(false);\n setAutoOpened(false);\n }\n if (openOwner === void 0 || openOwner === current) return;\n setOpen(false);\n setOpenOwner(void 0);\n }, [current, openOwner]);\n (0, react.useLayoutEffect)(() => {\n const root = document.documentElement;\n if (expanded && geometry.mode === "docked" && !compact) {\n root.setAttribute(PANEL_OPEN_ATTRIBUTE, "");\n root.style.setProperty(PANEL_SHIFT_PROPERTY, `${geometry.width + PANEL_CONVERSATION_GAP + 18}px`);\n } else {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n }\n return () => {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n };\n }, [\n compact,\n expanded,\n geometry.mode,\n geometry.width\n ]);\n (0, react.useEffect)(() => {\n if (current === void 0) return;\n const controller = startActivityPolling(currentTargets, { discoverySessionId: current });\n let active = true;\n const tracker = autoOpenTrackerRef.current;\n if (tracker.sessionId === current && !tracker.restoreComplete) controller.firstTick.then(() => {\n const latest = autoOpenTrackerRef.current;\n if (!active || latest.sessionId !== current || latest.restoreComplete) return;\n latest.liveTeamIds = new Set(getActivitySnapshotsSnapshot().teams.filter((team) => team.captainSessionId === current).map((team) => team.teamId));\n latest.restoreComplete = true;\n });\n return () => {\n active = false;\n controller.stop();\n };\n }, [current, currentTargets]);\n (0, react.useEffect)(() => {\n const onOpenPanel = (event) => {\n const activeSession = currentRef.current;\n if (activeSession === void 0) return;\n setOpenOwner(activeSession);\n setOpen(true);\n const detail = event.detail;\n if (detail?.teamId !== void 0) {\n const owner = detail.captainSessionId !== "" ? detail.captainSessionId : currentRef.current ?? "";\n const teamKey = `${owner}:${detail.teamId}`;\n setHistoric((previous) => {\n const next = new Map(previous);\n next.set(teamKey, {\n data: detail,\n owner\n });\n return next;\n });\n }\n };\n window.addEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n return () => {\n window.removeEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n };\n }, []);\n const visibleTeams = (0, react.useMemo)(() => current === void 0 ? [] : teams.filter((team) => team.captainSessionId === current), [teams, current]);\n const visibleHistoric = (0, react.useMemo)(() => current === void 0 ? [] : [...historic.values()].filter(({ data, owner }) => owner === current && !teams.some((live) => live.captainSessionId === current && live.teamId === data.teamId) && !archivedTeams.some((archived) => archived.captainSessionId === current && archived.teamId === data.teamId)), [\n historic,\n current,\n teams,\n archivedTeams\n ]);\n const visibleArchived = (0, react.useMemo)(() => current === void 0 ? [] : archivedTeams.filter((team) => team.captainSessionId === current && !teams.some((live) => live.captainSessionId === current && live.teamId === team.teamId)), [\n archivedTeams,\n current,\n teams\n ]);\n const visibleCount = visibleTeams.length + visibleArchived.length + visibleHistoric.length;\n const visibleLiveTeamIds = (0, react.useMemo)(() => visibleTeams.map((team) => team.teamId).sort(), [visibleTeams]);\n (0, react.useEffect)(() => {\n const tracker = autoOpenTrackerRef.current;\n const settled = performance.now() - mountedAtRef.current >= AUTO_OPEN_SETTLE_MS;\n const shouldAutoExpand = tracker.sessionId === current && activityPanelShouldAutoExpand({\n alreadyAutoOpened: autoOpened,\n pageSettled: settled,\n restoreComplete: tracker.restoreComplete,\n previousLiveTeamIds: tracker.liveTeamIds,\n currentLiveTeamIds: visibleLiveTeamIds\n });\n if (tracker.sessionId === current && tracker.restoreComplete) tracker.liveTeamIds = new Set(visibleLiveTeamIds);\n if (visibleCount > 0) {\n setWasActive(true);\n if (shouldAutoExpand) {\n setOpenOwner(current);\n setOpen(true);\n setAutoOpened(true);\n }\n return;\n }\n if (!wasActive) return;\n const timer = setTimeout(() => {\n setOpen(false);\n setOpenOwner(void 0);\n setWasActive(false);\n setAutoOpened(false);\n }, AUTOCLOSE_GRACE_MS);\n return () => {\n clearTimeout(timer);\n };\n }, [\n visibleCount,\n visibleLiveTeamIds.join("\\0"),\n autoOpened,\n wasActive,\n current\n ]);\n const busy = (0, react.useMemo)(() => visibleTeams.some((team) => team.members.some((member) => member.activity === "working")), [visibleTeams]);\n const hasTeams = visibleCount > 0;\n const panelGeometryForGesture = (0, react.useCallback)(() => {\n const measuredHeight = panelRef.current?.getBoundingClientRect().height;\n if (measuredHeight === void 0 || measuredHeight <= 0) return geometry;\n return {\n ...geometry,\n height: measuredHeight\n };\n }, [geometry]);\n const flushScheduledLayout = (0, react.useCallback)(() => {\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null) commitLayout(pending);\n }, [commitLayout]);\n const scheduleLayout = (0, react.useCallback)((next) => {\n pendingLayoutRef.current = next;\n frameRef.current ??= requestAnimationFrame(() => {\n frameRef.current = null;\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null) commitLayout(pending);\n });\n }, [commitLayout]);\n (0, react.useEffect)(() => () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n }, []);\n const beginMove = (0, react.useCallback)((event) => {\n if (compact || event.button !== 0 || event.target.closest("button") !== null) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: "move",\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: false\n };\n }, [compact, panelGeometryForGesture]);\n const beginResize = (0, react.useCallback)((edge, event) => {\n if (compact || event.button !== 0 || geometry.mode === "docked" && edge !== "left") return;\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: "resize",\n edge,\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: true\n };\n setInteraction("resizing");\n }, [\n compact,\n geometry.mode,\n panelGeometryForGesture\n ]);\n const updateGesture = (0, react.useCallback)((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId || !event.currentTarget.hasPointerCapture(event.pointerId)) return;\n const dx = event.clientX - gesture.originX;\n const dy = event.clientY - gesture.originY;\n const activeBounds = boundsRef.current;\n if (gesture.kind === "move") {\n if (!gesture.activated && Math.hypot(dx, dy) < MOVE_THRESHOLD) return;\n if (!gesture.activated) {\n gesture.activated = true;\n setInteraction("dragging");\n }\n scheduleLayout(movePanelLayout(floatPanelLayout(gesture.start, activeBounds), dx, dy, activeBounds));\n return;\n }\n scheduleLayout(resizePanelLayout(gesture.start, gesture.edge ?? "left", dx, dy, activeBounds));\n }, [scheduleLayout]);\n const endGesture = (0, react.useCallback)((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId) return;\n updateGesture(event);\n flushScheduledLayout();\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout, updateGesture]);\n const cancelGesture = (0, react.useCallback)((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId) return;\n flushScheduledLayout();\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout]);\n const toggleDock = (0, react.useCallback)(() => {\n const liveGeometry = panelGeometryForGesture();\n commitLayout(liveGeometry.mode === "docked" ? floatPanelLayout(liveGeometry, boundsRef.current) : dockPanelLayout(liveGeometry, boundsRef.current));\n }, [commitLayout, panelGeometryForGesture]);\n const autoHeight = panelUsesAutoHeight(geometry, bounds);\n const panelStyle = {\n width: geometry.width,\n height: autoHeight ? "auto" : geometry.height,\n maxHeight: panelMaximumHeight(geometry, bounds),\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`\n };\n if (!conversationVisible || !hasTeams && !expanded) return null;\n return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {\n count: visibleCount,\n busy,\n t,\n onClick: () => {\n if (current === void 0) return;\n setOpenOwner(current);\n setOpen(true);\n }\n }), expanded && (0, react_jsx_runtime.jsxs)("aside", {\n ref: panelRef,\n className: ActivityPanel_module_css_default.panel,\n style: panelStyle,\n "data-t-team-activity": true,\n "data-panel-mode": geometry.mode,\n "data-height-mode": autoHeight ? "auto" : "manual",\n "data-compact": compact || void 0,\n "data-dragging": interaction === "dragging" || void 0,\n "data-resizing": interaction === "resizing" || void 0,\n "aria-label": t("activity.panelAria"),\n children: [\n (0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.panelHead,\n onPointerDown: beginMove,\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "data-drag-handle": !compact || void 0,\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.panelTitle,\n children: [t("activity.title"), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.panelDot,\n "data-busy": busy,\n "aria-hidden": true\n })]\n }), (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.panelControls,\n children: [!compact && (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.iconButton,\n "data-control": "dock",\n "data-mode": geometry.mode,\n onClick: toggleDock,\n "aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),\n title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),\n children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})\n }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.iconButton,\n "data-control": "collapse",\n onClick: () => {\n setOpen(false);\n setOpenOwner(void 0);\n },\n "aria-label": t("activity.collapse"),\n title: t("activity.collapse"),\n children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})\n })]\n })]\n }),\n (0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.teams,\n children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.emptyHint,\n children: t("activity.empty")\n }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [\n visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {\n team,\n modelDirectory: team.phase === "staged" ? modelDirectories.directoryFor(team.captainSessionId) : void 0,\n onContinuePlanning: returnToComposer,\n onDiscarded: returnToComposer,\n onNavigate: navigateToSession,\n t\n }, team.teamId)),\n visibleArchived.map((team) => (0, react_jsx_runtime.jsxs)("div", {\n "data-team-id": team.teamId,\n "data-historic": true,\n className: ActivityPanel_module_css_default.archivedWrap,\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.archiveLabel,\n children: t(team.phase === "staged" ? "archive.discardedLabel" : "archive.label")\n }), (0, react_jsx_runtime.jsx)(TeamSection, {\n team,\n onNavigate: navigateToSession,\n t,\n historic: true\n })]\n }, `${team.captainSessionId}:${team.teamId}`)),\n visibleHistoric.map(({ data: team, owner }) => {\n const teamKey = `${owner}:${team.teamId}`;\n return (0, react_jsx_runtime.jsx)(TeamSection, {\n team: historicCardTeam(team, owner),\n onNavigate: navigateToSession,\n t,\n historic: true\n }, teamKey);\n })\n ] })\n }),\n !compact && (0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.resizeHandle,\n "data-resize-edge": "left",\n onPointerDown: (event) => {\n beginResize("left", event);\n },\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "aria-hidden": true\n }),\n !compact && geometry.mode === "floating" && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.resizeHandle,\n "data-resize-edge": "bottom",\n onPointerDown: (event) => {\n beginResize("bottom", event);\n },\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "aria-hidden": true\n }), (0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.resizeHandle,\n "data-resize-edge": "corner",\n onPointerDown: (event) => {\n beginResize("corner", event);\n },\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "aria-hidden": true\n })] })\n ]\n })] });\n }\n\n\n /**\n * T Team conversation card: a lightweight in-conversation summary shown\n * when a team is created \u2014 the captain\'s name, the member roster with whale\n * avatars, and an entry point that re-activates the top-right activity\n * panel (useful after the floater was closed, or when re-opening an old\n * session for review).\n *\n * The fold anchors to the Harness\'s durable `tool/call` + `tool/result`\n * records for `t_team_create`. Those are first-party session events, so\n * the card survives restarts without writing an out-of-repo event type.\n * @module t-team/client/card\n */\n /** Parse the only create-call fields the historic card owns. */\n function parseTTeamCreateArgs(value) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== "object" || parsed === null || !("name" in parsed) || typeof parsed.name !== "string") return;\n const name = parsed.name.trim();\n if (name === "") return void 0;\n const cleaned = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");\n return {\n teamId: cleaned === "" ? "team" : cleaned,\n name\n };\n } catch {\n return;\n }\n }\n /** Durable first-party tool events folded into one keyed Chat node. */\n const tTeamCardDefinition = {\n kind: "t-team",\n target: "chat",\n match: (event) => {\n if (event.type === "tool/call" && event.data.name === "t_team_create") return parseTTeamCreateArgs(event.data.arguments) === void 0 ? null : {\n id: String(event.data.callId),\n role: "start"\n };\n if (event.type === "tool/result" && event.data.message.source.kind === "tool") return {\n id: String(event.data.message.source.callId),\n role: "update"\n };\n return null;\n },\n start: (_context, match) => {\n if (match.event.type !== "tool/call") throw new Error("t-team card start requires t_team_create tool/call");\n const parsed = parseTTeamCreateArgs(match.event.data.arguments);\n if (parsed === void 0) throw new Error("t-team card start requires valid create arguments");\n return {\n ...parsed,\n accepted: false\n };\n },\n update: (context, match) => {\n if (match.event.type !== "tool/result") return context.state;\n if (match.event.data.error !== void 0 || match.event.data.message.content.some((block) => block.type === "tool-result" && block.isError === true)) return context.state;\n return {\n ...context.state,\n accepted: true\n };\n },\n buildViewNode: (context) => {\n if (context.start === void 0) return null;\n const state = context.state;\n if (!state.accepted) return null;\n return {\n key: context.key,\n kind: "t-team",\n id: context.id,\n target: "chat",\n anchorSeq: context.start.event.seq,\n location: context.start.location,\n visibility: "visible",\n data: {\n teamId: state.teamId,\n captainSessionId: "",\n teamName: state.name,\n members: []\n }\n };\n }\n };\n\n\n /** `tTeam` namespace dictionaries for every plugin-owned Web surface. */\n /** Dictionary namespace owned by the T Team client plugin. */\n const T_TEAM_LOCALE_NAMESPACE = "tTeam";\n /** Simplified Chinese dictionary (the key-set source of truth). */\n const zh = {\n "card.memberCount": "{count} \u540D\u6210\u5458",\n "action.openActivityPanel": "\u6253\u5F00\u6D3B\u52A8\u9762\u677F",\n "activity.panelButton": "\u6D3B\u52A8\u9762\u677F",\n "activity.badgeAria": "T\u4E13\u5BB6 \u56E2\u961F\u6D3B\u52A8\u4E0E\u5386\u53F2\uFF0C{count} \u6761\u56E2\u961F\u8BB0\u5F55",\n "activity.panelAria": "T\u4E13\u5BB6 \u56E2\u961F\u6D3B\u52A8\u9762\u677F",\n "activity.title": "T\u4E13\u5BB6 \u56E2\u961F\u6D3B\u52A8",\n "activity.float": "\u5207\u6362\u4E3A\u6D6E\u52A8\u9762\u677F",\n "activity.dockRight": "\u505C\u9760\u5230\u53F3\u4FA7",\n "activity.collapse": "\u6536\u8D77\u6D3B\u52A8\u9762\u677F",\n "activity.empty": "\u6682\u65E0\u56E2\u961F\u6D3B\u52A8",\n "team.stop": "\u505C\u6B62\u56E2\u961F",\n "team.stopped": "\u5DF2\u505C\u6B62",\n "team.stopTitle": "\u786E\u8BA4\u505C\u6B62\u201C{team}\u201D\uFF1F",\n "team.stopDescription": "\u5C06\u53D6\u6D88 {tasks} \u9879\u672A\u5B8C\u6210\u4EFB\u52A1\uFF0C\u5E76\u505C\u6B62 {members} \u540D\u6B63\u5728\u5DE5\u4F5C\u7684\u6210\u5458\u3002\u5DF2\u5B8C\u6210\u7684\u7ED3\u679C\u4F1A\u4FDD\u7559\u3002",\n "team.stopCancel": "\u7EE7\u7EED\u8FD0\u884C",\n "team.stopConfirm": "\u786E\u8BA4\u505C\u6B62",\n "team.stopping": "\u6B63\u5728\u505C\u6B62\u2026",\n "team.stopFailed": "\u505C\u6B62\u5931\u8D25\uFF1A{message}",\n "team.stopRequestFailed": "\u670D\u52A1\u5668\u672A\u80FD\u505C\u6B62\u56E2\u961F\uFF0C\u8BF7\u91CD\u8BD5",\n "team.discarded": "\u5DF2\u653E\u5F03",\n "format.listSeparator": "\u3001",\n "task.status.pending": "\u5F85\u9886\u53D6",\n "task.status.claimed": "\u5DF2\u8BA4\u9886",\n "task.status.inProgress": "\u8FDB\u884C\u4E2D",\n "task.status.completed": "\u5DF2\u5B8C\u6210",\n "task.status.failed": "\u5931\u8D25",\n "task.status.cancelled": "\u5DF2\u53D6\u6D88",\n "task.status.notRun": "\u672A\u6267\u884C",\n "member.state.working": "\u5DE5\u4F5C\u4E2D",\n "member.state.failed": "\u6709\u5931\u8D25",\n "member.state.waiting": "\u7B49\u5F85",\n "member.state.delivered": "\u5DF2\u4EA4\u4ED8",\n "member.state.left": "\u5DF2\u79BB\u961F",\n "member.state.removed": "\u5DF2\u79FB\u9664",\n "member.state.pending": "\u5F85\u6267\u884C",\n "member.state.unassigned": "\u5F85\u6D3E\u5DE5",\n "member.state.staged": "\u5F85\u521B\u5EFA",\n "member.state.notCreated": "\u672A\u521B\u5EFA",\n "member.state.stopped": "\u5DF2\u505C\u6B62",\n "member.status.executing": "\u6B63\u5728\u6267\u884C {taskId}",\n "member.status.executingModel": "\u6B63\u5728\u6267\u884C {taskId} \xB7 {model}",\n "member.status.working": "\u6B63\u5728\u5904\u7406\u5DF2\u6D3E\u4EFB\u52A1",\n "member.status.waitingOn": "\u7B49\u5F85 {taskId} \xB7 {assignee}",\n "member.status.waitingPrerequisite": "\u7B49\u5F85\u524D\u7F6E\u4EFB\u52A1",\n "member.status.waitingAssignment": "\u7B49\u5F85\u961F\u957F\u6D3E\u5DE5",\n "member.status.delivered": "\u4EFB\u52A1\u5DF2\u4EA4\u4ED8",\n "member.status.idle": "\u5F85\u7EE7\u7EED\u6267\u884C",\n "member.status.unknown": "\u72B6\u6001\u672A\u77E5",\n "member.status.staged": "\u786E\u8BA4\u540E\u521B\u5EFA\u5E76\u542F\u52A8",\n "member.status.settled": "\u4EFB\u52A1\u5747\u5DF2\u7EC8\u7ED3",\n "member.status.discarded": "\u8BA1\u5212\u5DF2\u653E\u5F03\uFF0C\u672A\u521B\u5EFA",\n "member.status.stopped": "\u56E2\u961F\u5DF2\u505C\u6B62\uFF0C\u9700\u663E\u5F0F\u6062\u590D",\n "task.assignee.unclaimed": "\u5F85\u8BA4\u9886",\n "task.summary.waitingBreakdown": "\u7B49\u5F85\u961F\u957F\u62C6\u89E3\u4EFB\u52A1",\n "task.summary.staged": "{count} \u9879\u8BA1\u5212\u7B49\u5F85\u786E\u8BA4",\n "task.summary.discarded": "{count} \u9879\u8BA1\u5212\u5DF2\u653E\u5F03\uFF0C\u5747\u672A\u6267\u884C",\n "task.summary.allDelivered": "\u5168\u90E8 {count} \u9879\u4EFB\u52A1\u5DF2\u4EA4\u4ED8",\n "task.summary.ended": "\u7EC8\u6001\uFF1A{completed} \u5DF2\u4EA4\u4ED8 \xB7 {cancelled} \u5DF2\u53D6\u6D88 \xB7 {failed} \u5931\u8D25",\n "task.summary.blockedAndRunning": "{tasks}{more} \u7B49\u5F85\u524D\u7F6E\uFF0C\u5176\u4F59\u5DF2\u5F00\u5DE5",\n "task.summary.more": " \u7B49 {count} \u9879",\n "task.summary.running": "{tasks} \u6B63\u5728\u6267\u884C",\n "task.summary.ready": "{tasks} \u5DF2\u5C31\u7EEA\u5F85\u5F00\u5DE5",\n "task.summary.blocked": "{tasks} \u7B49\u5F85\u524D\u7F6E",\n "task.summary.failedSettled": "{count} \u9879\u5DF2\u5931\u8D25\uFF0C\u81EA\u52A8\u5FAA\u73AF\u5DF2\u505C\u6B62",\n "task.summary.waitingSchedule": "\u7B49\u5F85\u4E0B\u4E00\u8F6E\u8C03\u5EA6",\n "progress.aria": "\u56E2\u961F\u603B\u8FDB\u5EA6",\n "progress.title": "\u603B\u8FDB\u5EA6",\n "progress.running": "\u25A0 \u8FDB\u884C\u4E2D {count}",\n "progress.blocked": "\u25A0 \u7B49\u5F85\u4F9D\u8D56 {count}",\n "progress.delivered": "\u25A0 \u5DF2\u4EA4\u4ED8 {count}",\n "dependency.aria": "\u4EFB\u52A1\u4F9D\u8D56\u94FE",\n "dependency.parallel": "\u5E76\u884C\u4EFB\u52A1",\n "dependency.title": "\u4EFB\u52A1\u4F9D\u8D56",\n "dependency.hint.parallel": "\u65E0\u524D\u540E\u4F9D\u8D56 \xB7 \u70B9\u51FB\u67E5\u770B\u8BE6\u60C5",\n "dependency.hint.chain": "\u60AC\u505C\u9AD8\u4EAE\u4F9D\u8D56\u94FE \xB7 \u70B9\u51FB\u56FA\u5B9A",\n "dependency.hint.pinned": "{taskId} \u5DF2\u56FA\u5B9A \xB7 Esc \u53D6\u6D88",\n "task.runningAria": "\u8FD0\u884C\u4E2D",\n "task.model": "{model}",\n "task.detail.completed": "\u5DF2\u5B8C\u6210\u5E76\u4EA4\u4ED8",\n "task.detail.noPrerequisite": "\u65E0\u524D\u7F6E\uFF0C\u53EF\u7ACB\u5373\u5F00\u5DE5",\n "task.detail.ready": "\u524D\u7F6E\u5DF2\u5C31\u7EEA\uFF0C\u53EF\u5F00\u5DE5",\n "task.detail.waitingOn": "\u7B49\u5F85 {tasks}",\n "task.detail.notRun": "\u8BA1\u5212\u5DF2\u653E\u5F03\uFF0C\u4EFB\u52A1\u672A\u6267\u884C",\n "task.detail.noDownstream": "\u65E0\u4E0B\u6E38\u4EFB\u52A1",\n "task.detail.unlocks": "\u5B8C\u6210\u540E\u89E3\u9501 {tasks}",\n "team.ended": "\u5DF2\u7ED3\u675F",\n "plan.badge": "\u5F85\u786E\u8BA4",\n "plan.title": "\u6267\u884C\u524D\u8BA1\u5212\u5BA1\u67E5",\n "plan.description": "\u6210\u5458\u5C1A\u672A\u521B\u5EFA\u3001\u4EFB\u52A1\u5C1A\u672A\u8C03\u5EA6\u3002\u53EF\u76F4\u63A5\u8C03\u6574\u8BA1\u5212\uFF0C\u4E5F\u53EF\u8FD4\u56DE\u5BF9\u8BDD\u544A\u8BC9\u961F\u957F\u54EA\u91CC\u9700\u8981\u4FEE\u6539\u3002",\n "plan.member.role": "\u89D2\u8272",\n "plan.member.provider": "Provider",\n "plan.member.model": "\u6A21\u578B",\n "plan.member.reasoning": "\u63A8\u7406\u7B49\u7EA7",\n "plan.member.reasoningHint": "\u7559\u7A7A\u4F7F\u7528\u9ED8\u8BA4\u503C\uFF1B\u53EF\u7528 low\u3001medium\u3001high\u3001xhigh \u7B49",\n "plan.model.choose": "\u9009\u62E9\u6A21\u578B",\n "plan.model.currentUnavailable": "{provider}/{model}\uFF08\u5F53\u524D\u76EE\u5F55\u4E0D\u53EF\u7528\uFF09",\n "plan.model.route": "\u8DEF\u7531\uFF1A{provider}/{model}",\n "plan.model.defaultReasoning": "\u9ED8\u8BA4\u63A8\u7406\u7B49\u7EA7",\n "plan.model.providerDefault": "Provider \u9ED8\u8BA4\u503C",\n "plan.model.modelDefault": "\u6A21\u578B\u9ED8\u8BA4\u503C\uFF08{effort}\uFF09",\n "plan.model.triggerAria": "\u9009\u62E9\u6210\u5458\u6A21\u578B\uFF0C\u5F53\u524D {model}\uFF0C\u63A8\u7406\u7B49\u7EA7 {effort}",\n "plan.model.back": "\u8FD4\u56DE",\n "plan.model.loading": "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B\u2026",\n "plan.model.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u578B",\n "plan.model.partialFailure": "{count} \u4E2A Provider \u7684\u6A21\u578B\u76EE\u5F55\u52A0\u8F7D\u5931\u8D25",\n "plan.model.retry": "\u91CD\u8BD5",\n "plan.member.prompt": "\u89D2\u8272\u63D0\u793A\u8BCD",\n "plan.member.roleFallback": "\u672A\u8BBE\u7F6E\u89D2\u8272",\n "plan.task.subject": "\u4EFB\u52A1\u540D\u79F0",\n "plan.task.description": "\u4EFB\u52A1\u8BF4\u660E",\n "plan.task.assignee": "\u8D1F\u8D23\u4EBA",\n "plan.task.dependencies": "\u4F9D\u8D56\u4EFB\u52A1 ID\uFF08\u9017\u53F7\u5206\u9694\uFF09",\n "plan.task.dependenciesHint": "\u4F8B\u5982 task-1, task-2\uFF1B\u4E0D\u5F97\u5F62\u6210\u5FAA\u73AF\u4F9D\u8D56",\n "plan.task.unassigned": "\u5171\u4EAB\u4EFB\u52A1\u6C60",\n "plan.unsaved": "\u672A\u4FDD\u5B58",\n "plan.save": "\u4FDD\u5B58",\n "plan.saving": "\u4FDD\u5B58\u4E2D\u2026",\n "plan.remove": "\u5220\u9664",\n "plan.removed": "\u4EFB\u52A1\u5DF2\u5220\u9664",\n "plan.removeConfirm": "\u786E\u8BA4\u5220\u9664",\n "plan.removeWarning": "\u5220\u9664 {task} \u540E\u5C06\u91CD\u65B0\u8BA1\u7B97\u4F9D\u8D56\u5173\u7CFB\u3002",\n "plan.cancel": "\u53D6\u6D88",\n "plan.addTask": "\u6DFB\u52A0\u4EFB\u52A1",\n "plan.adding": "\u6DFB\u52A0\u4E2D\u2026",\n "plan.taskAdded": "\u4EFB\u52A1\u5DF2\u6DFB\u52A0",\n "plan.newTask": "\u65B0\u4EFB\u52A1\u540D\u79F0",\n "plan.newTaskLabel": "\u65B0\u589E\u8BA1\u5212\u4EFB\u52A1",\n "plan.readySummary": "{members} \u540D\u6210\u5458 \xB7 {tasks} \u9879\u4EFB\u52A1 \xB7 {links} \u6761\u4F9D\u8D56",\n "plan.flow.aria": "\u56E2\u961F\u542F\u52A8\u6D41\u7A0B",\n "plan.flow.review": "\u5BA1\u67E5\u8BA1\u5212",\n "plan.flow.spawn": "\u521B\u5EFA\u6210\u5458",\n "plan.flow.run": "\u5F00\u59CB\u6267\u884C",\n "plan.members.title": "\u6210\u5458\u4E0E\u6A21\u578B\u8DEF\u7531",\n "plan.members.count": "{count} \u540D\u6210\u5458",\n "plan.members.empty": "\u5C1A\u672A\u89C4\u5212\u6210\u5458",\n "plan.tasks.title": "\u4EFB\u52A1\u4E0E\u4F9D\u8D56",\n "plan.tasks.count": "{count} \u9879\u4EFB\u52A1 \xB7 {links} \u6761\u4F9D\u8D56",\n "plan.tasks.empty": "\u5C1A\u672A\u89C4\u5212\u4EFB\u52A1",\n "plan.dependencies.none": "\u65E0\u4F9D\u8D56",\n "plan.dependencies.count": "{count} \u6761\u4F9D\u8D56",\n "plan.approve": "\u786E\u8BA4\u5E76\u542F\u52A8\u56E2\u961F",\n "plan.approving": "\u6B63\u5728\u521B\u5EFA\u6210\u5458\u2026",\n "plan.approveTitle": "\u8BA1\u5212\u68C0\u67E5\u5B8C\u6BD5\uFF1F",\n "plan.approveHint": "\u786E\u8BA4\u540E\u5C06\u521B\u5EFA {members} \u540D\u6210\u5458\u5E76\u8C03\u5EA6 {tasks} \u9879\u4EFB\u52A1\u3002",\n "plan.approveConfirmTitle": "\u786E\u8BA4\u542F\u52A8\u6B64\u56E2\u961F",\n "plan.approveWarning": "\u542F\u52A8\u540E\u4E0D\u80FD\u518D\u5728\u6B64\u5904\u7F16\u8F91\u6210\u5458\u548C\u4F9D\u8D56\u3002",\n "plan.approveConfirm": "\u786E\u8BA4\u542F\u52A8",\n "plan.continue": "\u8FD4\u56DE\u5BF9\u8BDD\u4FEE\u6539",\n "plan.returnToChat": "\u56DE\u5230\u5BF9\u8BDD",\n "plan.feedbackTitle": "\u6B63\u5728\u7B49\u4F60\u8BF4\u660E\u4FEE\u6539\u65B9\u5411",\n "plan.feedbackHint": "\u961F\u957F\u4F1A\u5728\u5BF9\u8BDD\u4E2D\u8FFD\u95EE\uFF1B\u6536\u5230\u4F60\u7684\u56DE\u590D\u540E\uFF0C\u53EA\u4FEE\u6539\u8FD9\u4EFD\u8349\u6848\u5E76\u518D\u6B21\u7B49\u5F85\u786E\u8BA4\u3002",\n "plan.discard": "\u653E\u5F03\u672C\u6B21\u8BA1\u5212",\n "plan.discardConfirmTitle": "\u653E\u5F03\u672C\u6B21\u8BA1\u5212\uFF1F",\n "plan.discardWarning": "\u8BE5\u8BA1\u5212\u4F1A\u7ED3\u675F\u5E76\u5F52\u6863\uFF1B\u5C1A\u672A\u521B\u5EFA\u4EFB\u4F55\u6210\u5458\uFF0C\u4E5F\u4E0D\u4F1A\u6267\u884C\u4EFB\u52A1\u3002",\n "plan.discardConfirm": "\u786E\u8BA4\u653E\u5F03",\n "plan.discarding": "\u6B63\u5728\u653E\u5F03\u2026",\n "plan.pendingEdits": "\u8BF7\u5148\u4FDD\u5B58\u5F53\u524D\u4FEE\u6539\uFF0C\u518D\u542F\u52A8\u56E2\u961F\u3002",\n "plan.saved": "\u8BA1\u5212\u5DF2\u4FDD\u5B58",\n "plan.failed": "\u64CD\u4F5C\u5931\u8D25\uFF1A{message}",\n "team.stats.members": "{count} \u540D\u6210\u5458",\n "team.stats.completed": "{completed}/{total} \u5B8C\u6210",\n "team.stats.messages": "{count} \u6761\u6D88\u606F",\n "delegation.aria": "\u961F\u957F\u6D3E\u5DE5\u5173\u7CFB",\n "captain.name": "\u961F\u957F",\n "captain.role": "\u62C6\u89E3 \xB7 \u6D3E\u53D1 \xB7 \u6C47\u603B",\n "captain.summary": "\u5DF2\u6D3E\u53D1 {tasks} \u9879\u4EFB\u52A1\u7ED9 {members} \u540D\u6210\u5458",\n "captain.summary.staged": "\u5DF2\u89C4\u5212 {tasks} \u9879\u4EFB\u52A1\u4E0E {members} \u540D\u6210\u5458\uFF0C\u7B49\u5F85\u786E\u8BA4",\n "captain.summary.awaitingFeedback": "\u8349\u6848\u5DF2\u4FDD\u7559\uFF0C\u7B49\u5F85\u4F60\u5728\u5BF9\u8BDD\u4E2D\u8BF4\u660E\u4FEE\u6539\u65B9\u5411",\n "captain.summary.discarded": "\u8BA1\u5212\u5DF2\u653E\u5F03\uFF1A{members} \u540D\u6210\u5458\u672A\u521B\u5EFA\uFF0C{tasks} \u9879\u4EFB\u52A1\u672A\u6267\u884C",\n "captain.summary.withTakeover": "\u5DF2\u6D3E\u53D1 {tasks} \u9879\u7ED9\u6210\u5458 \xB7 \u961F\u957F\u63A5\u7BA1 {captainTasks}",\n "captain.state.working": "{count} \u4EBA\u6267\u884C\u4E2D",\n "captain.state.takeover": "\u6B63\u5728\u6267\u884C {tasks}",\n "captain.state.collected": "\u5DF2\u6536\u9F50",\n "captain.state.waiting": "\u7B49\u5F85\u56DE\u62A5",\n "captain.state.staged": "\u5F85\u786E\u8BA4",\n "captain.state.awaitingFeedback": "\u5F85\u53CD\u9988",\n "captain.state.discarded": "\u5DF2\u653E\u5F03",\n "captain.state.settled": "\u5DF2\u7EC8\u7ED3",\n "members.toggle": "{count} \u540D\u6210\u5458",\n "members.collapse": "\u6536\u8D77",\n "members.expand": "\u5C55\u5F00",\n "members.empty": "\u6682\u65E0\u6210\u5458\uFF0C\u7B49\u5F85\u961F\u957F\u7EC4\u5EFA\u56E2\u961F",\n "assignment.label": "\u961F\u957F\u6D3E\u53D1",\n "assignment.staged": "\u8BA1\u5212\u4EFB\u52A1",\n "assignment.discarded": "\u672A\u6267\u884C\u7684\u8BA1\u5212",\n "assignment.empty": "\u6682\u65E0\u4EFB\u52A1",\n "archive.label": "\u5DF2\u7ED3\u675F \xB7 \u5386\u53F2\u5F52\u6863",\n "archive.discardedLabel": "\u8BA1\u5212\u5DF2\u653E\u5F03 \xB7 \u5386\u53F2\u5F52\u6863"\n };\n /** English dictionary, checked complete against the Chinese source key set. */\n const en = {\n "card.memberCount": "{count} members",\n "action.openActivityPanel": "Open activity panel",\n "activity.panelButton": "Activity panel",\n "activity.badgeAria": "T Team activity and history, {count} team records",\n "activity.panelAria": "T Team activity panel",\n "activity.title": "T Team activity",\n "activity.float": "Switch to floating panel",\n "activity.dockRight": "Dock to the right",\n "activity.collapse": "Collapse activity panel",\n "activity.empty": "No team activity",\n "team.stop": "Stop team",\n "team.stopped": "Stopped",\n "team.stopTitle": "Stop \u201C{team}\u201D?",\n "team.stopDescription": "This cancels {tasks} unfinished tasks and stops {members} working members. Completed results are kept.",\n "team.stopCancel": "Keep running",\n "team.stopConfirm": "Stop team",\n "team.stopping": "Stopping\u2026",\n "team.stopFailed": "Could not stop team: {message}",\n "team.stopRequestFailed": "The server could not stop this team. Try again.",\n "team.discarded": "Discarded",\n "format.listSeparator": ", ",\n "task.status.pending": "Unclaimed",\n "task.status.claimed": "Claimed",\n "task.status.inProgress": "In progress",\n "task.status.completed": "Completed",\n "task.status.failed": "Failed",\n "task.status.cancelled": "Cancelled",\n "task.status.notRun": "Not run",\n "member.state.working": "Working",\n "member.state.failed": "Has failures",\n "member.state.waiting": "Waiting",\n "member.state.delivered": "Delivered",\n "member.state.left": "Left team",\n "member.state.removed": "Removed",\n "member.state.pending": "Pending",\n "member.state.unassigned": "Awaiting assignment",\n "member.state.staged": "Not spawned",\n "member.state.notCreated": "Not created",\n "member.state.stopped": "Stopped",\n "member.status.executing": "Working on {taskId}",\n "member.status.executingModel": "Working on {taskId} \xB7 {model}",\n "member.status.working": "Working on assigned tasks",\n "member.status.waitingOn": "Waiting for {taskId} \xB7 {assignee}",\n "member.status.waitingPrerequisite": "Waiting for prerequisites",\n "member.status.waitingAssignment": "Waiting for the captain to assign work",\n "member.status.delivered": "Tasks delivered",\n "member.status.idle": "Ready to continue",\n "member.status.unknown": "Status unknown",\n "member.status.staged": "Will be spawned after approval",\n "member.status.settled": "All assigned work is settled",\n "member.status.discarded": "Plan discarded; member was not created",\n "member.status.stopped": "Team stopped; explicit resume required",\n "task.assignee.unclaimed": "Unclaimed",\n "task.summary.waitingBreakdown": "Waiting for the captain to break down the work",\n "task.summary.staged": "{count} planned tasks awaiting approval",\n "task.summary.discarded": "{count} planned tasks discarded; none ran",\n "task.summary.allDelivered": "All {count} tasks delivered",\n "task.summary.ended": "Final: {completed} delivered \xB7 {cancelled} cancelled \xB7 {failed} failed",\n "task.summary.blockedAndRunning": "{tasks}{more} waiting on prerequisites; other work has started",\n "task.summary.more": " and {count} more",\n "task.summary.running": "{tasks} in progress",\n "task.summary.ready": "{tasks} ready to start",\n "task.summary.blocked": "{tasks} waiting on prerequisites",\n "task.summary.failedSettled": "{count} failed; the automatic loop has stopped",\n "task.summary.waitingSchedule": "Waiting for the next scheduling round",\n "progress.aria": "Overall team progress",\n "progress.title": "Overall progress",\n "progress.running": "\u25A0 In progress {count}",\n "progress.blocked": "\u25A0 Waiting {count}",\n "progress.delivered": "\u25A0 Delivered {count}",\n "dependency.aria": "Task dependency chain",\n "dependency.parallel": "Parallel tasks",\n "dependency.title": "Task dependencies",\n "dependency.hint.parallel": "No dependencies \xB7 Click for details",\n "dependency.hint.chain": "Hover to highlight dependencies \xB7 Click to pin",\n "dependency.hint.pinned": "{taskId} pinned \xB7 Esc to clear",\n "task.runningAria": "Running",\n "task.model": "{model}",\n "task.detail.completed": "Completed and delivered",\n "task.detail.noPrerequisite": "No prerequisites; ready to start",\n "task.detail.ready": "Prerequisites ready; can start",\n "task.detail.waitingOn": "Waiting for {tasks}",\n "task.detail.notRun": "Plan discarded; task was not run",\n "task.detail.noDownstream": "No downstream tasks",\n "task.detail.unlocks": "Unlocks {tasks} when complete",\n "team.ended": "Ended",\n "plan.badge": "Awaiting approval",\n "plan.title": "Pre-run plan review",\n "plan.description": "Members have not been spawned and tasks have not been scheduled. Edit the draft here, or return to chat and tell the Captain what should change.",\n "plan.member.role": "Role",\n "plan.member.provider": "Provider",\n "plan.member.model": "Model",\n "plan.member.reasoning": "Reasoning effort",\n "plan.member.reasoningHint": "Leave blank for default; accepts low, medium, high, xhigh, and more",\n "plan.model.choose": "Choose a model",\n "plan.model.currentUnavailable": "{provider}/{model} (not in the current catalog)",\n "plan.model.route": "Route: {provider}/{model}",\n "plan.model.defaultReasoning": "Default reasoning effort",\n "plan.model.providerDefault": "Provider default",\n "plan.model.modelDefault": "Model default ({effort})",\n "plan.model.triggerAria": "Choose member model, currently {model}, reasoning effort {effort}",\n "plan.model.back": "Back",\n "plan.model.loading": "Loading models\u2026",\n "plan.model.empty": "No models available",\n "plan.model.partialFailure": "{count} provider catalogs could not be loaded",\n "plan.model.retry": "Retry",\n "plan.member.prompt": "Role prompt",\n "plan.member.roleFallback": "Role not set",\n "plan.task.subject": "Task subject",\n "plan.task.description": "Task description",\n "plan.task.assignee": "Assignee",\n "plan.task.dependencies": "Dependency task IDs (comma-separated)",\n "plan.task.dependenciesHint": "For example task-1, task-2; cycles are rejected",\n "plan.task.unassigned": "Shared task pool",\n "plan.unsaved": "Unsaved",\n "plan.save": "Save",\n "plan.saving": "Saving\u2026",\n "plan.remove": "Remove",\n "plan.removed": "Task removed",\n "plan.removeConfirm": "Confirm remove",\n "plan.removeWarning": "Removing {task} will recalculate downstream dependencies.",\n "plan.cancel": "Cancel",\n "plan.addTask": "Add task",\n "plan.adding": "Adding\u2026",\n "plan.taskAdded": "Task added",\n "plan.newTask": "New task subject",\n "plan.newTaskLabel": "Add a planned task",\n "plan.readySummary": "{members} members \xB7 {tasks} tasks \xB7 {links} dependencies",\n "plan.flow.aria": "Team launch flow",\n "plan.flow.review": "Review plan",\n "plan.flow.spawn": "Create members",\n "plan.flow.run": "Start work",\n "plan.members.title": "Members & model routes",\n "plan.members.count": "{count} members",\n "plan.members.empty": "No members planned yet",\n "plan.tasks.title": "Tasks & dependencies",\n "plan.tasks.count": "{count} tasks \xB7 {links} dependencies",\n "plan.tasks.empty": "No tasks planned yet",\n "plan.dependencies.none": "No dependencies",\n "plan.dependencies.count": "{count} dependencies",\n "plan.approve": "Approve & Run",\n "plan.approving": "Creating members\u2026",\n "plan.approveTitle": "Plan ready?",\n "plan.approveHint": "Approval creates {members} members and schedules {tasks} tasks.",\n "plan.approveConfirmTitle": "Confirm team launch",\n "plan.approveWarning": "Member routes and dependencies cannot be edited here after launch.",\n "plan.approveConfirm": "Confirm launch",\n "plan.continue": "Return to chat & revise",\n "plan.returnToChat": "Return to chat",\n "plan.feedbackTitle": "Waiting for your revision direction",\n "plan.feedbackHint": "The Captain will ask in chat. After your reply, it will revise this draft and wait for approval again.",\n "plan.discard": "Discard this plan",\n "plan.discardConfirmTitle": "Discard this plan?",\n "plan.discardWarning": "The plan will end and be archived. No members have been spawned and no tasks will run.",\n "plan.discardConfirm": "Discard plan",\n "plan.discarding": "Discarding\u2026",\n "plan.pendingEdits": "Save the current edits before launching the team.",\n "plan.saved": "Plan saved",\n "plan.failed": "Operation failed: {message}",\n "team.stats.members": "{count} members",\n "team.stats.completed": "{completed}/{total} completed",\n "team.stats.messages": "{count} messages",\n "delegation.aria": "Captain delegation map",\n "captain.name": "Captain",\n "captain.role": "Break down \xB7 Delegate \xB7 Synthesize",\n "captain.summary": "Assigned {tasks} tasks to {members} members",\n "captain.summary.staged": "Planned {tasks} tasks and {members} members; awaiting approval",\n "captain.summary.awaitingFeedback": "Draft preserved; waiting for your revision direction in chat",\n "captain.summary.discarded": "Plan discarded: {members} members were not created and {tasks} tasks did not run",\n "captain.summary.withTakeover": "Assigned {tasks} to members \xB7 Captain owns {captainTasks}",\n "captain.state.working": "{count} active",\n "captain.state.takeover": "Working on {tasks}",\n "captain.state.collected": "All reports received",\n "captain.state.waiting": "Waiting for reports",\n "captain.state.staged": "Awaiting approval",\n "captain.state.awaitingFeedback": "Awaiting feedback",\n "captain.state.discarded": "Discarded",\n "captain.state.settled": "Settled",\n "members.toggle": "Members {count}",\n "members.collapse": "Collapse",\n "members.expand": "Expand",\n "members.empty": "No members yet; waiting for the captain to assemble the team",\n "assignment.label": "Captain assigned",\n "assignment.staged": "Planned task",\n "assignment.discarded": "Plan not run",\n "assignment.empty": "No tasks",\n "archive.label": "Ended \xB7 Archived history",\n "archive.discardedLabel": "Plan discarded \xB7 Archived history"\n };\n\n\n /** Version-tolerant navigation into durable T Team member transcripts. */\n /**\n * Open one member\'s persisted transcript.\n *\n * Harness rc.8 intentionally removed cold subagents from the ordinary session\n * list. They must first be rediscovered in their parent\'s catalog, then opened\n * with the exact parent/child/mode address. Older runtimes have only `open()`;\n * the fallback preserves ordinary-session navigation. New layouts also select\n * the Conversation panel and cancel catalog refreshes superseded by navigation.\n */\n async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout) {\n const navigation = layout?.beginNavigation?.();\n if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {\n sessions.open(childSessionId);\n layout?.selectPanel?.(null);\n return "session";\n }\n await sessions.refreshSubagents(parentSessionId);\n if (navigation?.aborted) return "cancelled";\n const retained = sessions.subagentAddress?.(childSessionId);\n sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {\n parentSessionId,\n childSessionId,\n mode: "continuable"\n });\n layout?.selectPanel?.(null);\n return "subagent";\n }\n\n\n /** Required services: conversation nodes, slots, sessions navigation, and locale. */\n const inject = [\n "uiConversation",\n "slots",\n "sessions",\n "locale",\n "modelDirectories",\n "layout"\n ];\n const useLegacyPanelInfo = (select) => select({ activePanelId: null });\n /** The replayed user message is the canonical transcript entry. */\n function HiddenTTeamCommand() {\n return null;\n }\n /**\n * Register the activity monitor in the shell\'s additive overlay and the\n * in-conversation team card. The card\'s activity button re-opens a folded\n * monitor via a window event \u2014 the recovery path for an old session.\n */\n function apply(ctx) {\n ctx.effect(() => ctx.locale.register(T_TEAM_LOCALE_NAMESPACE, {\n zh,\n en\n }), "t-team: dictionaries");\n const openMember = (parentId, childId) => {\n openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout).catch((error) => {\n console.warn(`t-team: failed to open member transcript ${childId}: ${String(error)}`);\n });\n };\n const Panel = ({ t, usePanelInfo }) => {\n return (0, react_jsx_runtime.jsx)(ActivityPanel, {\n conversationVisible: (usePanelInfo ?? useLegacyPanelInfo)((panel) => panel.activePanelId === null),\n sessionsList: ctx.sessions.list,\n modelDirectories: ctx.modelDirectories,\n openMember,\n t\n });\n };\n ctx.slots.inject("shell.overlay", () => ctx.slots.register({\n name: "shell.overlay",\n id: "t-team-activity",\n order: 80,\n label: () => ctx.locale.bind(T_TEAM_LOCALE_NAMESPACE)("activity.title"),\n locale: T_TEAM_LOCALE_NAMESPACE\n }, Panel));\n ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({\n name: "conversation.chat.commandview",\n key: "t-team-hidden"\n }, HiddenTTeamCommand));\n ctx.uiConversation.events.register(tTeamCardDefinition);\n ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({\n name: "conversation.chat.node",\n key: "t-team",\n locale: T_TEAM_LOCALE_NAMESPACE,\n inject: () => ({ openMember })\n }, TTeamCard));\n }\n\n exports.apply = apply;\n exports.inject = inject;\n return module.exports;\n }\n});\n\n';
|
|
46
|
+
var client_bundle_default = 'window.__ModuleLoader__.load({\n id: "dsh-plugin-t-expert",\n factory: (require) => {\n var module = { exports: {} };\n var exports = module.exports;\n Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });\n let react_jsx_runtime = require("react/jsx-runtime");\n let react = require("react");\n let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");\n /** Compact `provider/model` route, or just the model when the provider is absent. */\n function memberRouteLabel(member) {\n if (member === void 0) return "";\n const provider = member.provider?.trim() ?? "";\n const model = member.model?.trim() ?? "";\n if (provider !== "" && model !== "") return `${provider}/${model}`;\n return model;\n }\n /**\n * Compact route shown on a running task. Prefer the task\'s own snapshot\n * field; fall back to the assignee member when older hosts omit it.\n */\n function taskModelLabel(task, members) {\n const direct = task.model?.trim() ?? "";\n if (direct !== "") return direct;\n return memberRouteLabel(members.find((candidate) => candidate.name === task.assignee));\n }\n /** Short model id for tight DAG/chip surfaces (`openai/gpt-5.6-sol` \u2192 `gpt-5.6-sol`). */\n function compactModelLabel(route) {\n const trimmed = route.trim();\n if (trimmed === "") return "";\n const slash = trimmed.lastIndexOf("/");\n return slash === -1 ? trimmed : trimmed.slice(slash + 1);\n }\n /** Whether the captain chat should keep showing the in-progress banner. */\n function teamIsActive(team) {\n if (team.halted === true || team.phase === "staged") return false;\n if (team.members.some((member) => member.activity === "working" || member.status === "working")) return true;\n if (team.tasks.some((task) => task.status === "pending" || task.status === "claimed" || task.status === "in_progress")) return true;\n return team.members.length > 0 && team.tasks.length === 0;\n }\n /** Use a fill-width grid when the task graph has no real dependency edges. */\n function usesParallelTaskGrid(tasks) {\n if (tasks.length === 0) return false;\n const taskIds = new Set(tasks.map((task) => task.id));\n return tasks.every((task) => task.dependencies.every((dependency) => !taskIds.has(dependency)));\n }\n /**\n * Whether an expanded activity panel still belongs to the current session.\n *\n * The panel is mounted in the root-scoped shell overlay, so React does not\n * remount it when the conversation route changes. Ownership keeps an expanded\n * panel from leaking onto the new-session screen (or another conversation)\n * while its local open state is being reset.\n */\n function activityPanelExpandedForSession(open, owner, current) {\n return open && owner !== void 0 && owner === current;\n }\n /**\n * Auto-expand only for live teams that appear after the current session\'s\n * initial restore pass. Replayed cards, archived teams, and live teams restored\n * while reopening a conversation must remain behind the collapsed badge.\n */\n function activityPanelShouldAutoExpand({ alreadyAutoOpened, pageSettled, restoreComplete, previousLiveTeamIds, currentLiveTeamIds }) {\n return !alreadyAutoOpened && pageSettled && restoreComplete && currentLiveTeamIds.some((teamId) => !previousLiveTeamIds.has(teamId));\n }\n /**\n * Resolve the task whose dependency chain should be highlighted.\n *\n * A pinned task is an explicit user choice. Keyboard focus takes precedence\n * over delayed pointer intent so an older hover timer cannot steal the active\n * chain from someone navigating the task map with the keyboard.\n */\n function dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId) {\n return pinnedTaskId ?? keyboardTaskId ?? hoverTaskId;\n }\n /** Group tasks by their precomputed dependency depth. */\n function taskStages(tasks) {\n const byDepth = /* @__PURE__ */ new Map();\n for (const task of tasks) {\n const depth = Number.isFinite(task.depth) ? Math.max(0, Math.floor(task.depth)) : 0;\n const stage = byDepth.get(depth) ?? [];\n stage.push(task);\n byDepth.set(depth, stage);\n }\n return [...byDepth.entries()].sort(([left], [right]) => left - right).map(([depth, stageTasks]) => ({\n depth,\n tasks: stageTasks.slice().sort((left, right) => left.id.localeCompare(right.id, "en", { numeric: true }))\n }));\n }\n /**\n * Lay tasks out as the reference panel\'s compact left-to-right DAG.\n *\n * Columns are dependency-depth stages. Rows are stable task-id order within\n * each stage. Edges use cubic curves so fan-in remains readable without\n * turning every task into a large card.\n */\n function compactDagLayout(tasks) {\n const stages = taskStages(tasks);\n const positions = /* @__PURE__ */ new Map();\n const nodes = [];\n for (const [column, stage] of stages.entries()) for (const [row, task] of stage.tasks.entries()) {\n const x = column * 118;\n const y = row * 38;\n positions.set(task.id, {\n x,\n y\n });\n nodes.push({\n task,\n x,\n y\n });\n }\n const edges = [];\n for (const task of tasks) {\n const target = positions.get(task.id);\n if (target === void 0) continue;\n for (const dependency of task.dependencies) {\n const source = positions.get(dependency);\n if (source === void 0) continue;\n const x1 = source.x + 92;\n const y1 = source.y + 30 / 2;\n const x2 = target.x;\n const y2 = target.y + 30 / 2;\n edges.push({\n from: dependency,\n to: task.id,\n path: `M${x1} ${y1}C${x1 + 14} ${y1},${x2 - 14} ${y2},${x2} ${y2}`\n });\n }\n }\n const rows = Math.max(1, ...stages.map((stage) => stage.tasks.length));\n return {\n width: stages.length === 0 ? 0 : stages.length * 92 + (stages.length - 1) * 26,\n height: stages.length === 0 ? 0 : rows * 30 + (rows - 1) * 8,\n nodes,\n edges\n };\n }\n /**\n * Return the complete upstream/downstream chain around one task.\n *\n * Traversal uses both dependency directions and remains cycle-safe, so the UI\n * can highlight every handoff related to the focused task even if malformed\n * durable data contains a cycle.\n */\n function relatedTaskIds(taskId, tasks) {\n const byId = new Map(tasks.map((task) => [task.id, task]));\n if (!byId.has(taskId)) return /* @__PURE__ */ new Set();\n const dependents = /* @__PURE__ */ new Map();\n for (const task of tasks) for (const dependency of task.dependencies) {\n const targets = dependents.get(dependency) ?? [];\n targets.push(task.id);\n dependents.set(dependency, targets);\n }\n const related = /* @__PURE__ */ new Set();\n const upstreamSeen = /* @__PURE__ */ new Set();\n const downstreamSeen = /* @__PURE__ */ new Set();\n const visitUpstream = (id) => {\n if (upstreamSeen.has(id)) return;\n upstreamSeen.add(id);\n related.add(id);\n for (const dependency of byId.get(id)?.dependencies ?? []) visitUpstream(dependency);\n };\n const visitDownstream = (id) => {\n if (downstreamSeen.has(id)) return;\n downstreamSeen.add(id);\n related.add(id);\n for (const dependent of dependents.get(id) ?? []) visitDownstream(dependent);\n };\n visitUpstream(taskId);\n visitDownstream(taskId);\n return related;\n }\n\n\n /** Shared, demand-driven state for the T Team browser monitor. */\n const targets = /* @__PURE__ */ new Map();\n const targetListeners = /* @__PURE__ */ new Set();\n const snapshotListeners = /* @__PURE__ */ new Set();\n let targetSnapshot = [];\n let activitySnapshots = {\n teams: [],\n archivedTeams: []\n };\n function targetKey(sessionId, teamId) {\n return `${sessionId}\\u0000${teamId}`;\n }\n function publishTargets() {\n targetSnapshot = [...targets.values()].filter((target) => target.active).map(({ key, sessionId, teamId }) => ({\n key,\n sessionId,\n teamId\n }));\n for (const listener of targetListeners) listener();\n }\n /** Subscribe to the active monitor-target list (React external-store shape). */\n function subscribeActivityMonitorTargets(listener) {\n targetListeners.add(listener);\n return () => {\n targetListeners.delete(listener);\n };\n }\n /** Read the stable active-target snapshot. */\n function getActivityMonitorTargetsSnapshot() {\n return targetSnapshot;\n }\n /**\n * Register one successful T Team card as a monitoring demand.\n *\n * The returned cleanup is reference-counted so multiple cards and React\n * StrictMode remounts cannot stop another card\'s monitor.\n */\n function monitorAgentTeam(sessionId, teamId) {\n const owner = sessionId.trim();\n const id = teamId.trim();\n if (owner === "" || id === "") return () => {};\n const key = targetKey(owner, id);\n const existing = targets.get(key);\n if (existing === void 0) {\n targets.set(key, {\n key,\n sessionId: owner,\n teamId: id,\n refs: 1,\n active: true\n });\n publishTargets();\n } else {\n existing.refs += 1;\n if (!existing.active) {\n existing.active = true;\n publishTargets();\n }\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const current = targets.get(key);\n if (current === void 0) return;\n current.refs -= 1;\n if (current.refs <= 0) {\n targets.delete(key);\n if (current.active) publishTargets();\n }\n };\n }\n /** Stop polling targets whose final archived snapshot has been captured. */\n function settleActivityMonitorTargets(keys) {\n let changed = false;\n for (const key of keys) {\n const target = targets.get(key);\n if (target?.active !== true) continue;\n target.active = false;\n changed = true;\n }\n if (changed) publishTargets();\n }\n /** Subscribe to the shared live/archive snapshot. */\n function subscribeActivitySnapshots(listener) {\n snapshotListeners.add(listener);\n return () => {\n snapshotListeners.delete(listener);\n };\n }\n /** Read the stable shared live/archive snapshot. */\n function getActivitySnapshotsSnapshot() {\n return activitySnapshots;\n }\n /** Publish one or both successful state-route responses. */\n function updateActivitySnapshots(update) {\n const next = {\n teams: update.teams ?? activitySnapshots.teams,\n archivedTeams: update.archivedTeams ?? activitySnapshots.archivedTeams\n };\n if (next.teams === activitySnapshots.teams && next.archivedTeams === activitySnapshots.archivedTeams) return;\n activitySnapshots = next;\n for (const listener of snapshotListeners) listener();\n }\n /** Poll cadence for the live host snapshot route. */\n const ACTIVITY_POLL_MS = 1e3;\n /**\n * Low-frequency probe cadence while a cardless discovery session still owns\n * no team. The probe keeps the panel able to pick up a team created later in\n * that session (e.g. a run_code-wrapped t_team_create) without turning\n * every ordinary session into a one-second filesystem scan.\n */\n const ACTIVITY_PROBE_MS = 5e3;\n /** Host route serving live and archived team snapshots. */\n const ACTIVITY_STATE_URL = "/plugins/t-team/state";\n const ACTIVITY_HALT_URL = "/plugins/t-team/halt";\n /**\n * Start the single polling loop for the current session\'s requested targets.\n *\n * With neither targets nor a discovery session this is deliberately inert.\n * Explicit card targets poll at the live cadence from the start. A discovery\n * session performs an immediate live+archive restore pass, then \u2014 while it\n * still owns no team \u2014 probes on a low-frequency cadence, so a team created\n * later in that session (e.g. a run_code-wrapped t_team_create) is\n * discovered without a manual reload, without turning every ordinary session\n * into a one-second filesystem scan. The moment a team for the discovery\n * session appears, the controller upgrades to the live one-second cadence for\n * the rest of its lifetime. The caller \u2014 the session view, which stops the\n * controller when the session is no longer current \u2014 bounds the lifetime, and\n * archive state is refreshed when a target or a previously discovered live\n * team disappears.\n */\n function startActivityPolling(monitorTargets, runtime = {}) {\n const discoverySessionId = runtime.discoverySessionId?.trim();\n if (monitorTargets.length === 0 && (discoverySessionId === void 0 || discoverySessionId === "")) return {\n firstTick: Promise.resolve(),\n stop: () => {}\n };\n const fetchState = runtime.fetchState ?? ((url, init) => fetch(url, init));\n const schedule = runtime.schedule ?? ((callback, intervalMs) => setInterval(callback, intervalMs));\n const cancel = runtime.cancel ?? ((timer) => {\n clearInterval(timer);\n });\n const publishSnapshots = runtime.publishSnapshots ?? updateActivitySnapshots;\n const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;\n let cancelled = false;\n let inFlight = false;\n let hot = monitorTargets.length > 0;\n let discoveryComplete = false;\n let discoveredLiveKeys = /* @__PURE__ */ new Set();\n let controller;\n let timer;\n const intervalMs = () => hot ? ACTIVITY_POLL_MS : ACTIVITY_PROBE_MS;\n const reschedule = () => {\n cancel(timer);\n timer = schedule(() => {\n tick();\n }, intervalMs());\n };\n const tick = async () => {\n if (inFlight || cancelled) return;\n inFlight = true;\n controller = new AbortController();\n try {\n const liveResponse = await fetchState(ACTIVITY_STATE_URL, {\n cache: "no-store",\n signal: controller.signal\n });\n if (!liveResponse.ok) return;\n const body = await liveResponse.json();\n if (cancelled || !Array.isArray(body.teams)) return;\n const liveTeams = body.teams;\n publishSnapshots({ teams: liveTeams });\n const previousDiscoveredKeys = discoveredLiveKeys;\n discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));\n if (!hot && discoveredLiveKeys.size > 0) {\n hot = true;\n reschedule();\n }\n const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));\n const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));\n const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;\n if (missing.length === 0 && !needsDiscoveryArchive && !discoveredTeamArchived) return;\n const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {\n cache: "no-store",\n signal: controller.signal\n });\n if (!archivedResponse.ok) return;\n const archivedBody = await archivedResponse.json();\n if (cancelled || !Array.isArray(archivedBody.teams)) return;\n publishSnapshots({ archivedTeams: archivedBody.teams });\n discoveryComplete = true;\n settleTargets(new Set(missing.map((target) => target.key)));\n } catch (error) {\n if (error?.name === "AbortError") return;\n } finally {\n inFlight = false;\n }\n };\n const firstTick = tick();\n if (timer === void 0) timer = schedule(() => {\n tick();\n }, intervalMs());\n return {\n firstTick,\n stop: () => {\n if (cancelled) return;\n cancelled = true;\n controller?.abort();\n cancel(timer);\n }\n };\n }\n\n\n /**\n * Shared whale artwork lookup for the activity panel and the conversation\n * card: role keywords map to the packaged role images; the captain always\n * uses the lead whale.\n * @module t-team/client/artwork\n */\n /** Artwork route prefix served by the plugin host half. */\n const ART_BASE = "/plugins/t-team/assets/";\n /** V2 whale role artwork per role keyword. */\n const ROLE_ART = [\n [/data|analys|metric|performance|\u6570\u636E|\u5206\u6790|\u6307\u6807|\u6027\u80FD/, "member-data-v2.png"],\n [/resear|investig|explor|study|\u7814\u7A76|\u8C03\u67E5|\u63A2\u7D22|\u8C03\u7814/, "member-researcher-v2.png"],\n [/\\bqa\\b|test|verif|quality|\u6D4B\u8BD5|\u8D28\u91CF|\u9A8C\u8BC1/, "member-qa-v2.png"],\n [/engineer|dev\\b|server|backend|\\bapi\\b|runtime|watcher|contract|\u5DE5\u7A0B|\u540E\u7AEF|\u670D\u52A1|\u63A5\u53E3|\u5F00\u53D1|\u4EE3\u7801|\u7F16\u7A0B/, "member-engineer-v2.png"],\n [/design|\\bui\\b|\\bux\\b|front|theme|accessib|\u8BBE\u8BA1|\u524D\u7AEF|\u4E3B\u9898|\u65E0\u969C\u788D/, "member-designer-v2.png"],\n [/secur|audit|risk|threat|review|\u5B89\u5168|\u5BA1\u8BA1|\u5BA1\u67E5|\u98CE\u9669/, "member-security-v2.png"],\n [/docs|writer|product|spec|\u64B0\u5199|\u6587\u6848|\u5199\u4F5C|\u6587\u6863|\u89C4\u8303/, "member-docs-v2.png"],\n [/release|\\bbuild\\b|deploy|\\bops\\b|\\bci\\b|ship|coordin|\u53D1\u5E03|\u6784\u5EFA|\u90E8\u7F72|\u8FD0\u7EF4|\u534F\u8C03/, "member-operator-v2.png"]\n ];\n /** Captain artwork (always the lead whale). */\n const LEAD_ART = `${ART_BASE}team-lead-v2.png`;\n /** Status action artwork per member activity. */\n const ACTION_ART = {\n working: `${ART_BASE}action-working-v2.png`,\n idle: `${ART_BASE}action-sleeping-v2.png`,\n unknown: `${ART_BASE}action-thinking-v2.png`\n };\n /**\n * Member artwork URL, or null when no role matches (initial-letter fallback).\n * @param name - the member\'s display name.\n * @param role - the member\'s role text.\n * @returns the artwork URL, or null when unmatched.\n */\n function memberArtUrl(name, role) {\n const identity = `${name} ${role}`.toLowerCase();\n for (const [pattern, art] of ROLE_ART) if (pattern.test(identity)) return `${ART_BASE}${art}`;\n return null;\n }\n\n\n const css$1 = ".kPAopq_root{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:10px;flex-direction:column;gap:8px;width:100%;min-width:0;padding:10px 12px;display:flex}.kPAopq_head{align-items:center;gap:8px;min-width:0;display:flex}.kPAopq_leadAvatar{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0;flex:none;width:30px;height:30px}.kPAopq_teamName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.kPAopq_memberCount{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;margin-left:auto;font-size:11px;line-height:16px}.kPAopq_panelButton{border:1px solid var(--dsw-alias-line-strong);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;flex:none;padding:2px 8px;font-size:10.5px;font-weight:600;line-height:16px;transition:border-color .12s,color .12s}.kPAopq_panelButton:hover{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.kPAopq_panelButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_members{flex-wrap:wrap;gap:6px;min-width:0;display:flex}.kPAopq_member{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);max-width:160px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:5px;padding:3px 8px 3px 3px;font-size:11px;font-weight:500;line-height:16px;transition:border-color .12s,background-color .12s;display:inline-flex}.kPAopq_member:hover{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-bg-fill-neutral)}.kPAopq_member:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d482e);background:0 0;border:0;border-radius:0;width:24px;height:24px}.kPAopq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:20px;height:20px;color:var(--dsw-alias-label-on-fill);border-radius:50%;justify-content:center;align-items:center;font-size:10px;font-weight:600;line-height:20px;display:inline-flex}.kPAopq_memberName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";\n const tagId$1 = "dsh-plugin-t-expert/TTeamCard.module.css";\n if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {\n const tag = document.createElement("style");\n tag.dataset.plugin = "dsh-plugin-t-expert";\n tag.dataset.pluginCss = tagId$1;\n tag.textContent = css$1;\n document.head.appendChild(tag);\n }\n var TTeamCard_module_css_default = {\n "head": "kPAopq_head",\n "leadAvatar": "kPAopq_leadAvatar",\n "member": "kPAopq_member",\n "memberArt": "kPAopq_memberArt",\n "memberCount": "kPAopq_memberCount",\n "memberInitial": "kPAopq_memberInitial",\n "memberName": "kPAopq_memberName",\n "members": "kPAopq_members",\n "panelButton": "kPAopq_panelButton",\n "root": "kPAopq_root",\n "teamName": "kPAopq_teamName"\n };\n\n\n /**\n * T Team conversation card: the lightweight in-conversation summary for\n * one team \u2014 the captain\'s whale avatar and name, the member roster as\n * clickable whale avatars (opening the member\'s subagent transcript), and\n * an "activity panel" button that re-activates the top-right floater.\n *\n * The floater and this card share the `t-team:open-panel` window event\n * so the card can summon the panel even after it was closed (or when an old\n * session is re-opened for review).\n * @module t-team/client/card\n */\n /** Window event name the floater listens for to open itself. */\n const OPEN_PANEL_EVENT = "t-team:open-panel";\n /** Re-activate the top-right activity panel, carrying this team\'s summary\n * so the panel can show it even when the team no longer exists on disk\n * (historical session review). */\n function openActivityPanel(data) {\n window.dispatchEvent(new CustomEvent(OPEN_PANEL_EVENT, { detail: {\n teamId: data.teamId,\n captainSessionId: data.captainSessionId,\n teamName: data.teamName,\n members: data.members\n } }));\n }\n /** Render one durable team as a compact conversation card. */\n function TTeamCard({ node, openMember, sessionId, t }) {\n const data = node.data;\n const owner = data.captainSessionId || sessionId;\n const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n (0, react.useEffect)(() => {\n return monitorAgentTeam(owner, data.teamId);\n }, [data.teamId, owner]);\n const snapshot = teams.find((team) => team.teamId === data.teamId && (owner === "" || team.captainSessionId === owner)) ?? archivedTeams.find((team) => team.teamId === data.teamId && (owner === "" || team.captainSessionId === owner));\n const resolved = (0, react.useMemo)(() => ({\n ...data,\n captainSessionId: snapshot?.captainSessionId ?? owner,\n teamName: snapshot?.name ?? data.teamName,\n members: snapshot?.members.map((member) => ({\n id: member.id,\n name: member.name,\n role: member.role\n })) ?? data.members\n }), [\n data,\n owner,\n snapshot\n ]);\n return (0, react_jsx_runtime.jsxs)("section", {\n className: TTeamCard_module_css_default.root,\n "data-t-team-card": true,\n "data-team-id": resolved.teamId,\n children: [(0, react_jsx_runtime.jsxs)("header", {\n className: TTeamCard_module_css_default.head,\n children: [\n (0, react_jsx_runtime.jsx)("img", {\n className: TTeamCard_module_css_default.leadAvatar,\n src: LEAD_ART,\n alt: "",\n "aria-hidden": true\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.teamName,\n title: resolved.teamName,\n children: resolved.teamName\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.memberCount,\n children: t("card.memberCount", { count: resolved.members.length })\n }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: TTeamCard_module_css_default.panelButton,\n onClick: () => {\n openActivityPanel(resolved);\n },\n "aria-label": t("action.openActivityPanel"),\n title: t("action.openActivityPanel"),\n children: t("activity.panelButton")\n })\n ]\n }), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {\n className: TTeamCard_module_css_default.members,\n children: resolved.members.map((member) => (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: TTeamCard_module_css_default.member,\n onClick: () => {\n if (member.id !== "") openMember(owner, member.id);\n },\n title: member.role === "" ? member.name : `${member.name} \xB7 ${member.role}`,\n children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {\n className: TTeamCard_module_css_default.memberArt,\n src: memberArtUrl(member.name, member.role) ?? "",\n alt: "",\n "aria-hidden": true\n }) : (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.memberInitial,\n children: member.name.trim().slice(0, 1).toUpperCase() || "?"\n }), (0, react_jsx_runtime.jsx)("span", {\n className: TTeamCard_module_css_default.memberName,\n children: member.name\n })]\n }, member.id))\n })]\n });\n }\n\n\n const css = "html{--t-team-panel-shift:420px}html[data-t-team-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--t-team-panel-shift)}.aYQbCq_badge,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-line-strong);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_tTeamPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_tTeamPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent)}@keyframes aYQbCq_tTeamPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_tTeamPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:5;touch-action:none;pointer-events:auto;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:14px;top:44px;bottom:14px;left:0}.aYQbCq_resizeHandle[data-resize-edge=left]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\\"\\";opacity:.45;border-radius:999px;width:3px;height:48px;transition:background-color .12s,opacity .12s;position:absolute;top:50%;left:4px;transform:translateY(-50%)}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:14px;bottom:0;left:20px;right:20px}.aYQbCq_resizeHandle[data-resize-edge=bottom]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\\"\\";opacity:.45;border-radius:999px;width:48px;height:3px;transition:background-color .12s,opacity .12s;position:absolute;bottom:4px;left:50%;transform:translate(-50%)}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:28px;height:28px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:2px solid var(--dsw-alias-label-tertiary);border-bottom:2px solid var(--dsw-alias-label-tertiary);content:\\"\\";opacity:.58;width:10px;height:10px;transition:border-color .12s,opacity .12s;position:absolute;bottom:6px;right:6px}.aYQbCq_resizeHandle:hover:after,.aYQbCq_panel[data-resizing] .aYQbCq_resizeHandle:after{background-color:var(--dsw-alias-bg-fill-business);border-color:var(--dsw-alias-bg-fill-business);opacity:.95}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex;container:aYQbCq_agent-team/inline-size}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_teamStopButton{border:1px solid var(--dsw-alias-line-normal);width:26px;height:26px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border-radius:7px;flex:none;place-items:center;padding:0;transition:border-color .15s,background .15s,color .15s;display:grid}.aYQbCq_teamStopButton:hover{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 42%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-danger) 7%, transparent);color:var(--dsw-alias-state-danger)}.aYQbCq_teamStopButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_stopModalActions{justify-content:flex-end;gap:8px;display:flex}.aYQbCq_stopModalActions button{border:1px solid var(--dsw-alias-line-normal,#e7e9ee);background:var(--dsw-alias-bg-fill-neutral,#eef0f4);min-height:34px;color:var(--dsw-alias-label-primary,#1c1c1e);cursor:pointer;font:inherit;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:6px 13px;font-size:12px;font-weight:600;display:inline-flex}.aYQbCq_stopModalActions button[data-danger]{border-color:var(--dsw-alias-state-danger,#e5484d);background:var(--dsw-alias-state-danger,#e5484d);color:var(--dsw-alias-label-on-fill,#fff)}.aYQbCq_stopModalActions button:disabled{cursor:wait;opacity:.58}.aYQbCq_stopModalError{background:color-mix(in srgb, var(--dsw-alias-state-danger,#e5484d) 8%, transparent);color:var(--dsw-alias-state-danger,#e5484d);border-radius:8px;align-items:flex-start;gap:7px;margin:0;padding:9px 10px;font-size:12px;line-height:18px;display:flex}.aYQbCq_stopModalError svg{flex:none;margin-top:1px}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_taskDetailModel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;line-height:14px;overflow:hidden}.aYQbCq_memberModel{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-fill-neutral);min-width:0;max-width:132px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:0 auto;align-items:center;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:15px;display:inline-flex;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-bg-fill-business)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_tTeamDot}@keyframes aYQbCq_tTeamDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-line-strong);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=discarded]{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.aYQbCq_progressSummary[data-state=discarded] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-label-tertiary)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));content:\\"\\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\\"\\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-module);background:var(--dsw-alias-state-business-primary);content:\\"\\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_tTeamUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_tTeamUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:34px;height:34px;color:var(--dsw-alias-label-on-fill);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-module)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_tTeamFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_tTeamBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_tTeamThink}@keyframes aYQbCq_tTeamFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_tTeamBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_tTeamThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-bg-fill-neutral);max-width:100%;min-height:16px;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex;overflow:hidden}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-line-strong);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-line-strong);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_planEditor{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, var(--dsw-alias-state-business-primary));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent);border-radius:10px;flex-direction:column;gap:12px;margin:0 10px 12px;padding:12px;display:flex}.aYQbCq_planHeader>span{justify-content:space-between;align-items:center;gap:8px;display:flex}.aYQbCq_planHeader>span>span{flex-direction:column;gap:2px;min-width:0;display:flex}.aYQbCq_planHeader strong{color:var(--dsw-alias-label-primary);font-size:12px}.aYQbCq_planHeader small{color:var(--dsw-alias-label-secondary);font-size:9px;font-weight:500;line-height:13px}.aYQbCq_planHeader em{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill);border-radius:999px;flex:none;padding:1px 7px;font-size:9px;font-style:normal;line-height:16px}.aYQbCq_planHeader p{color:var(--dsw-alias-label-secondary);margin:5px 0 0;font-size:10px;line-height:15px}.aYQbCq_planFlow{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;padding:0;list-style:none;display:grid}.aYQbCq_planFlow li{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:5px;font-size:9px;font-weight:600;line-height:14px;display:flex;position:relative}.aYQbCq_planFlow li:not(:last-child):after{background:var(--dsw-alias-line-normal);content:\\"\\";flex:1;min-width:8px;height:1px;margin-right:5px}.aYQbCq_planFlow li>span{border:1px solid var(--dsw-alias-line-normal);border-radius:50%;flex:none;place-items:center;width:18px;height:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;display:grid}.aYQbCq_planFlow li[data-active]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_planFlow li[data-active]>span{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent)}.aYQbCq_planSection{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:8px;overflow:hidden}.aYQbCq_planSectionToggle,.aYQbCq_planCardHeader{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0}.aYQbCq_planSectionToggle{justify-content:space-between;align-items:center;gap:8px;min-height:42px;padding:7px 9px;display:flex}.aYQbCq_planSectionToggle:hover,.aYQbCq_planCardHeader:hover{background:color-mix(in srgb, var(--dsw-alias-bg-fill-neutral) 46%, transparent)}.aYQbCq_planSectionToggle>span{align-items:baseline;gap:7px;min-width:0;display:flex}.aYQbCq_planSectionToggle strong{font-size:10.5px}.aYQbCq_planSectionToggle small{color:var(--dsw-alias-label-tertiary);font-size:9px}.aYQbCq_planList{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:0;display:flex}.aYQbCq_planEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;padding:12px;font-size:10px}.aYQbCq_planCard{background:0 0;border:0;border-radius:0;min-width:0;margin:0;padding:0;display:block;position:relative}.aYQbCq_planCard+.aYQbCq_planCard{border-top:1px solid var(--dsw-alias-line-normal)}.aYQbCq_planCard[data-open=true]{background:color-mix(in srgb, var(--dsw-alias-bg-base) 62%, transparent)}.aYQbCq_planCardHeader{grid-template-columns:minmax(80px,.9fr) minmax(72px,1.15fr) auto 12px;align-items:center;gap:7px;min-height:40px;padding:6px 9px;display:grid}.aYQbCq_planCardIdentity{flex-direction:column;gap:1px;min-width:0;display:flex}.aYQbCq_planCardIdentity strong,.aYQbCq_planTaskSummary{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:650;line-height:14px;overflow:hidden}.aYQbCq_planCardIdentity>span,.aYQbCq_planCardMeta{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planTaskId{background:var(--dsw-alias-bg-fill-neutral);width:max-content;color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8.5px;font-weight:700;line-height:14px}.aYQbCq_planDirty{background:color-mix(in srgb, var(--dsw-alias-state-warning) 13%, transparent);color:var(--dsw-alias-state-warning);border-radius:999px;justify-self:end;padding:1px 5px;font-size:8px;font-style:normal;font-weight:650;line-height:14px}.aYQbCq_planChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.2,.7,.2,1)}.aYQbCq_planChevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_planCardBody{flex-direction:column;gap:8px;padding:0 9px 9px;display:flex}.aYQbCq_planCardBody fieldset{border:0;flex-direction:column;gap:7px;min-width:0;margin:0;padding:0;display:flex}.aYQbCq_planCardBody label,.aYQbCq_planNewTask label{min-width:0;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;gap:4px;font-size:9px;display:flex}.aYQbCq_planCardBody label small{color:var(--dsw-alias-label-tertiary);font-size:8px;line-height:11px}.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-base);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:6px;outline:none;font-size:10.5px;line-height:16px;transition:border-color .16s,box-shadow .16s}.aYQbCq_planCard input,.aYQbCq_planCard select,.aYQbCq_planNewTask input{min-height:32px;padding:6px 8px}.aYQbCq_planCard textarea{resize:vertical;min-height:58px;padding:7px 8px}.aYQbCq_planCard input:focus-visible,.aYQbCq_planCard textarea:focus-visible,.aYQbCq_planCard select:focus-visible,.aYQbCq_planNewTask input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent)}.aYQbCq_planGrid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px;display:grid}.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr);gap:5px;display:grid}.aYQbCq_planModelMenu{width:100%;display:flex}.aYQbCq_planModelTrigger{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:7px;justify-content:space-between;align-items:center;gap:8px;padding:7px 9px;transition:border-color .16s,background-color .16s,transform .12s;display:flex}.aYQbCq_planModelTrigger:hover:not(:disabled){border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.aYQbCq_planModelTrigger:active:not(:disabled){transform:translateY(1px)}.aYQbCq_planModelTrigger:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:2px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);outline-offset:1px}.aYQbCq_planModelTrigger:disabled{cursor:wait;opacity:.64}.aYQbCq_planModelTriggerCopy{align-items:baseline;gap:6px;min-width:0;display:flex}.aYQbCq_planModelTriggerCopy strong,.aYQbCq_planModelTriggerCopy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_planModelTriggerCopy strong{color:var(--dsw-alias-label-primary);font-size:10px;font-weight:650;line-height:15px}.aYQbCq_planModelTriggerCopy span{color:var(--dsw-alias-label-tertiary);font-size:9px;line-height:14px}.aYQbCq_planModelMenuRow{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;min-width:0;display:grid}.aYQbCq_planModelMenuRow>span:first-child{color:var(--dsw-alias-label-primary)}.aYQbCq_planModelMenuRow strong{color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-weight:450;overflow:hidden}.aYQbCq_planModelMenuBack{align-items:center;gap:7px;display:inline-flex}.aYQbCq_planModelMenuBack svg{transform:rotate(180deg)}.aYQbCq_planModelEffortRow{flex-direction:column;align-items:flex-start;min-width:0;display:flex}.aYQbCq_planModelEffortRow small{width:100%;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_planModelHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planModelNotice{background:color-mix(in srgb, var(--dsw-alias-state-warning) 9%, transparent);color:var(--dsw-alias-label-secondary);border-radius:6px;grid-column:1/-1;justify-content:space-between;align-items:center;gap:8px;padding:6px 7px;font-size:8.5px;line-height:12px;display:flex}.aYQbCq_planModelNotice button{color:var(--dsw-alias-state-business-primary);cursor:pointer;font:inherit;background:0 0;border:0;flex:none;padding:2px 6px;font-weight:650}.aYQbCq_planActions,.aYQbCq_planApproveRow,.aYQbCq_planNewTask,.aYQbCq_planConfirm,.aYQbCq_planApproveActions,.aYQbCq_planSecondaryActions{align-items:center;gap:7px;display:flex}.aYQbCq_planReviewActions{grid-template-columns:minmax(0,1fr);gap:6px;width:100%;display:grid}.aYQbCq_planSecondaryActions{grid-template-columns:minmax(0,1fr) auto;display:grid}.aYQbCq_planActions{justify-content:flex-end}.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-fill-neutral);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;flex:none;padding:5px 10px;font-size:9.5px;font-weight:600;transition:background .16s,border-color .16s,transform .16s}.aYQbCq_planActions button:hover:not(:disabled),.aYQbCq_planNewTask button:hover:not(:disabled),.aYQbCq_planApproveRow button:hover:not(:disabled),.aYQbCq_planConfirm button:hover:not(:disabled){border-color:var(--dsw-alias-label-tertiary)}.aYQbCq_planActions button:active:not(:disabled),.aYQbCq_planNewTask button:active:not(:disabled),.aYQbCq_planApproveRow button:active:not(:disabled),.aYQbCq_planConfirm button:active:not(:disabled){transform:scale(.98)}.aYQbCq_planActions button[data-danger],.aYQbCq_planConfirm button[data-danger]{color:var(--dsw-alias-state-danger)}.aYQbCq_planFeedback{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;align-items:center;gap:5px;font-size:9px;line-height:13px;animation:.18s ease-out aYQbCq_plan-feedback-in;display:inline-flex}.aYQbCq_planFeedback[data-tone=success]{color:var(--dsw-alias-state-success)}.aYQbCq_planFeedback[data-tone=error]{color:var(--dsw-alias-state-danger)}.aYQbCq_planFeedback>span{border:1px solid;border-radius:50%;flex:none;place-items:center;width:15px;height:15px;display:grid}.aYQbCq_planFeedback svg{width:11px;height:11px}@keyframes aYQbCq_plan-feedback-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.aYQbCq_planConfirm{border:1px solid color-mix(in srgb, var(--dsw-alias-state-danger) 30%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-danger) 7%, transparent);border-radius:7px;flex-wrap:wrap;justify-content:flex-end;padding:7px}.aYQbCq_planConfirm>span{min-width:140px;color:var(--dsw-alias-label-secondary);flex:1;font-size:9px;line-height:13px}.aYQbCq_planNewTask{align-items:flex-end}.aYQbCq_planNewTask label{gap:4px}.aYQbCq_planNewTask label>span{line-height:13px}.aYQbCq_planApproveRow{z-index:1;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, transparent);min-height:50px;box-shadow:0 -5px 16px color-mix(in srgb, var(--dsw-alias-bg-base) 35%, transparent);backdrop-filter:blur(8px);border-radius:8px;flex-direction:column;justify-content:flex-end;align-items:stretch;margin:0 -4px -4px;padding:8px;position:sticky;bottom:0}.aYQbCq_planApproveRow[data-armed=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, var(--dsw-alias-line-normal))}.aYQbCq_planApproveRow[data-discard=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 45%, var(--dsw-alias-line-normal))}.aYQbCq_planApproveCopy{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.aYQbCq_planApproveCopy strong{color:var(--dsw-alias-label-primary);font-size:9.5px;line-height:13px}.aYQbCq_planApproveCopy small{color:var(--dsw-alias-label-tertiary);font-size:8.5px;line-height:12px}.aYQbCq_planApproveRow button{background:var(--dsw-alias-state-business-primary);min-height:32px;color:var(--dsw-alias-label-on-fill);padding-inline:13px}.aYQbCq_planReviewActions>button[data-plan-approve]{width:100%}.aYQbCq_planApproveActions>button:first-child{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button,.aYQbCq_planApproveActions>button[data-danger]{border-color:var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button[data-danger],.aYQbCq_planApproveActions>button[data-danger]{color:var(--dsw-alias-state-danger)}.aYQbCq_planSectionToggle:focus-visible,.aYQbCq_planCardHeader:focus-visible,.aYQbCq_planActions button:focus-visible,.aYQbCq_planNewTask button:focus-visible,.aYQbCq_planApproveRow button:focus-visible,.aYQbCq_planConfirm button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.aYQbCq_planActions button:disabled,.aYQbCq_planNewTask button:disabled,.aYQbCq_planApproveRow button:disabled{cursor:default;opacity:.55}.aYQbCq_historicPill{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archiveLabel{color:var(--dsw-alias-label-tertiary);padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after,.aYQbCq_planChevron,.aYQbCq_planFeedback,.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button,.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{transition:none;animation:none}}@media (width<=960px){html[data-t-team-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}.aYQbCq_planFlow li{gap:4px;font-size:8px}.aYQbCq_planFlow li:not(:last-child):after{margin-right:3px}.aYQbCq_planCardHeader{grid-template-columns:auto minmax(0,1fr) auto}.aYQbCq_planCardHeader .aYQbCq_planCardMeta{display:none}.aYQbCq_planGrid,.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr)}.aYQbCq_planNewTask,.aYQbCq_planApproveRow{flex-direction:column;align-items:stretch}.aYQbCq_planNewTask button,.aYQbCq_planApproveRow>button,.aYQbCq_planApproveActions,.aYQbCq_planReviewActions{width:100%}.aYQbCq_planApproveActions button,.aYQbCq_planReviewActions button,.aYQbCq_planSecondaryActions button{flex:1}}@container aYQbCq_agent-team (width<=360px){.aYQbCq_planEditor{margin-inline:0;padding-inline:10px}.aYQbCq_planHeader>span{align-items:flex-start}.aYQbCq_planFlow li{gap:3px;font-size:7.5px}.aYQbCq_planFlow li:not(:last-child):after{min-width:4px;margin-right:2px}.aYQbCq_planSecondaryActions,.aYQbCq_planApproveActions{grid-template-columns:minmax(0,1fr);width:100%;display:grid}.aYQbCq_planSecondaryActions button,.aYQbCq_planApproveActions button{width:100%}}";\n const tagId = "dsh-plugin-t-expert/ActivityPanel.module.css";\n if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {\n const tag = document.createElement("style");\n tag.dataset.plugin = "dsh-plugin-t-expert";\n tag.dataset.pluginCss = tagId;\n tag.textContent = css;\n document.head.appendChild(tag);\n }\n var ActivityPanel_module_css_default = {\n "agent-team": "aYQbCq_agent-team",\n "tTeamBreathe": "aYQbCq_tTeamBreathe",\n "tTeamDot": "aYQbCq_tTeamDot",\n "tTeamFloat": "aYQbCq_tTeamFloat",\n "tTeamPanelIn": "aYQbCq_tTeamPanelIn",\n "tTeamPulse": "aYQbCq_tTeamPulse",\n "tTeamThink": "aYQbCq_tTeamThink",\n "tTeamUnreadPulse": "aYQbCq_tTeamUnreadPulse",\n "archiveLabel": "aYQbCq_archiveLabel",\n "assignmentChip": "aYQbCq_assignmentChip",\n "assignmentLabel": "aYQbCq_assignmentLabel",\n "assignmentLine": "aYQbCq_assignmentLine",\n "assignmentTasks": "aYQbCq_assignmentTasks",\n "badge": "aYQbCq_badge",\n "badgeCount": "aYQbCq_badgeCount",\n "badgeDot": "aYQbCq_badgeDot",\n "captainAvatar": "aYQbCq_captainAvatar",\n "captainInfo": "aYQbCq_captainInfo",\n "captainLine": "aYQbCq_captainLine",\n "captainName": "aYQbCq_captainName",\n "captainNode": "aYQbCq_captainNode",\n "captainRole": "aYQbCq_captainRole",\n "captainState": "aYQbCq_captainState",\n "captainSummary": "aYQbCq_captainSummary",\n "chevron": "aYQbCq_chevron",\n "dagCanvas": "aYQbCq_dagCanvas",\n "dagEdges": "aYQbCq_dagEdges",\n "dagNode": "aYQbCq_dagNode",\n "dagNodeDot": "aYQbCq_dagNodeDot",\n "dagNodeHead": "aYQbCq_dagNodeHead",\n "dagNodeLabel": "aYQbCq_dagNodeLabel",\n "dagRunningState": "aYQbCq_dagRunningState",\n "dagViewport": "aYQbCq_dagViewport",\n "delegationSection": "aYQbCq_delegationSection",\n "delegationTree": "aYQbCq_delegationTree",\n "dependencySection": "aYQbCq_dependencySection",\n "emptyHint": "aYQbCq_emptyHint",\n "historicPill": "aYQbCq_historicPill",\n "iconButton": "aYQbCq_iconButton",\n "leadAvatar": "aYQbCq_leadAvatar",\n "memberArt": "aYQbCq_memberArt",\n "memberAvatar": "aYQbCq_memberAvatar",\n "memberBlock": "aYQbCq_memberBlock",\n "memberBranch": "aYQbCq_memberBranch",\n "memberCount": "aYQbCq_memberCount",\n "memberInfo": "aYQbCq_memberInfo",\n "memberInitial": "aYQbCq_memberInitial",\n "memberLine": "aYQbCq_memberLine",\n "memberModel": "aYQbCq_memberModel",\n "memberName": "aYQbCq_memberName",\n "memberRole": "aYQbCq_memberRole",\n "memberRow": "aYQbCq_memberRow",\n "memberState": "aYQbCq_memberState",\n "memberStatusLine": "aYQbCq_memberStatusLine",\n "members": "aYQbCq_members",\n "membersToggle": "aYQbCq_membersToggle",\n "panel": "aYQbCq_panel",\n "panelControls": "aYQbCq_panelControls",\n "panelDot": "aYQbCq_panelDot",\n "panelHead": "aYQbCq_panelHead",\n "panelTitle": "aYQbCq_panelTitle",\n "plan-feedback-in": "aYQbCq_plan-feedback-in",\n "planActions": "aYQbCq_planActions",\n "planApproveActions": "aYQbCq_planApproveActions",\n "planApproveCopy": "aYQbCq_planApproveCopy",\n "planApproveRow": "aYQbCq_planApproveRow",\n "planCard": "aYQbCq_planCard",\n "planCardBody": "aYQbCq_planCardBody",\n "planCardHeader": "aYQbCq_planCardHeader",\n "planCardIdentity": "aYQbCq_planCardIdentity",\n "planCardMeta": "aYQbCq_planCardMeta",\n "planChevron": "aYQbCq_planChevron",\n "planConfirm": "aYQbCq_planConfirm",\n "planDirty": "aYQbCq_planDirty",\n "planEditor": "aYQbCq_planEditor",\n "planEmpty": "aYQbCq_planEmpty",\n "planFeedback": "aYQbCq_planFeedback",\n "planFlow": "aYQbCq_planFlow",\n "planGrid": "aYQbCq_planGrid",\n "planHeader": "aYQbCq_planHeader",\n "planList": "aYQbCq_planList",\n "planModelEffortRow": "aYQbCq_planModelEffortRow",\n "planModelHint": "aYQbCq_planModelHint",\n "planModelMenu": "aYQbCq_planModelMenu",\n "planModelMenuBack": "aYQbCq_planModelMenuBack",\n "planModelMenuRow": "aYQbCq_planModelMenuRow",\n "planModelNotice": "aYQbCq_planModelNotice",\n "planModelPicker": "aYQbCq_planModelPicker",\n "planModelTrigger": "aYQbCq_planModelTrigger",\n "planModelTriggerCopy": "aYQbCq_planModelTriggerCopy",\n "planNewTask": "aYQbCq_planNewTask",\n "planReviewActions": "aYQbCq_planReviewActions",\n "planSecondaryActions": "aYQbCq_planSecondaryActions",\n "planSection": "aYQbCq_planSection",\n "planSectionToggle": "aYQbCq_planSectionToggle",\n "planTaskId": "aYQbCq_planTaskId",\n "planTaskSummary": "aYQbCq_planTaskSummary",\n "progressEmpty": "aYQbCq_progressEmpty",\n "progressLegend": "aYQbCq_progressLegend",\n "progressOverview": "aYQbCq_progressOverview",\n "progressSegments": "aYQbCq_progressSegments",\n "progressSummary": "aYQbCq_progressSummary",\n "progressSummaryDot": "aYQbCq_progressSummaryDot",\n "progressTitle": "aYQbCq_progressTitle",\n "resizeHandle": "aYQbCq_resizeHandle",\n "sectionHead": "aYQbCq_sectionHead",\n "sectionHint": "aYQbCq_sectionHint",\n "sectionTitle": "aYQbCq_sectionTitle",\n "sectionToggleTitle": "aYQbCq_sectionToggleTitle",\n "stageLabel": "aYQbCq_stageLabel",\n "stateArt": "aYQbCq_stateArt",\n "stopModalActions": "aYQbCq_stopModalActions",\n "stopModalError": "aYQbCq_stopModalError",\n "taskDetail": "aYQbCq_taskDetail",\n "taskDetailBadge": "aYQbCq_taskDetailBadge",\n "taskDetailHead": "aYQbCq_taskDetailHead",\n "taskDetailId": "aYQbCq_taskDetailId",\n "taskDetailLine": "aYQbCq_taskDetailLine",\n "taskDetailMeta": "aYQbCq_taskDetailMeta",\n "taskDetailModel": "aYQbCq_taskDetailModel",\n "taskDetailSubject": "aYQbCq_taskDetailSubject",\n "taskEmpty": "aYQbCq_taskEmpty",\n "taskId": "aYQbCq_taskId",\n "team": "aYQbCq_team",\n "teamHead": "aYQbCq_teamHead",\n "teamName": "aYQbCq_teamName",\n "teamStats": "aYQbCq_teamStats",\n "teamStopButton": "aYQbCq_teamStopButton",\n "teams": "aYQbCq_teams",\n "unreadPill": "aYQbCq_unreadPill",\n "workGlyph": "aYQbCq_workGlyph"\n };\n\n\n /**\n * Editable pre-run roster and DAG review for staged T Team plans.\n *\n * This leaf owns only transient form/disclosure state. Durable truth remains\n * on the host and returns through the ordinary activity polling snapshot.\n * @module t-team/client/staging-plan\n */\n const PLAN_URL = "/plugins/t-team/plan";\n function useDismissSuccess(feedback, setFeedback) {\n (0, react.useEffect)(() => {\n if (feedback?.tone !== "success") return;\n const timeout = window.setTimeout(() => {\n setFeedback(void 0);\n }, 3500);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [feedback, setFeedback]);\n }\n async function mutatePlan(payload) {\n const response = await fetch(PLAN_URL, {\n method: "POST",\n cache: "no-store",\n headers: { "content-type": "application/json" },\n body: JSON.stringify(payload)\n });\n if (response.ok) return;\n let message = `HTTP ${response.status}`;\n try {\n const body = await response.json();\n if (typeof body.error === "string" && body.error.trim() !== "") message = body.error;\n } catch {}\n throw new Error(message);\n }\n function errorMessage(error) {\n return error instanceof Error ? error.message : String(error);\n }\n function DisclosureChevron({ open }) {\n return (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.planChevron,\n "data-open": open,\n width: "12",\n height: "12",\n viewBox: "0 0 12 12",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.5",\n strokeLinecap: "round",\n "aria-hidden": true,\n children: (0, react_jsx_runtime.jsx)("path", { d: "M4 2.5 7.5 6 4 9.5" })\n });\n }\n function Feedback({ value }) {\n if (value === void 0) return null;\n return (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planFeedback,\n "data-tone": value.tone,\n role: value.tone === "error" ? "alert" : "status",\n "aria-live": value.tone === "error" ? "assertive" : "polite",\n children: [(0, react_jsx_runtime.jsx)("span", {\n "aria-hidden": true,\n children: value.tone === "success" ? (0, react_jsx_runtime.jsx)("svg", {\n viewBox: "0 0 12 12",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.8",\n children: (0, react_jsx_runtime.jsx)("path", { d: "m2.5 6.2 2.2 2.2 4.8-5" })\n }) : (0, react_jsx_runtime.jsx)("svg", {\n viewBox: "0 0 12 12",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.8",\n children: (0, react_jsx_runtime.jsx)("path", { d: "M6 2.3v4.1M6 8.8v.1" })\n })\n }), value.message]\n });\n }\n function routeKey(provider, model) {\n return JSON.stringify([provider, model]);\n }\n const MODEL_MENU_OPEN_MODELS = "open:models";\n const MODEL_MENU_OPEN_EFFORT = "open:effort";\n const MODEL_MENU_BACK = "navigate:back";\n const MODEL_MENU_RETRY = "action:retry";\n const MODEL_MENU_DEFAULT_EFFORT = "effort:default";\n function modelMenuId(provider, model) {\n return `model:${routeKey(provider, model)}`;\n }\n function effortMenuId(effort) {\n return `effort:${effort}`;\n }\n /**\n * Thin staged-plan adapter over the official model directory. It deliberately\n * reads only catalog metadata: choosing a member route must not change the\n * captain session\'s composer model.\n */\n function StagedModelPicker({ directory, provider, model, reasoningEffort, busy, onChange, t }) {\n const state = (0, react.useSyncExternalStore)(directory.store.subscribe, directory.store.getSnapshot);\n const [open, setOpen] = (0, react.useState)(false);\n const [pane, setPane] = (0, react.useState)("root");\n const catalogRoutes = state.groups.flatMap((group) => group.models.map((candidate) => ({\n key: routeKey(group.id, candidate.id),\n provider: group.id,\n providerName: group.name,\n model: candidate\n })));\n const selectedKey = routeKey(provider, model);\n const selected = catalogRoutes.find((candidate) => candidate.key === selectedKey);\n const efforts = selected?.model.reasoning?.efforts ?? [];\n const currentMissing = provider !== "" && model !== "" && selected === void 0;\n const defaultEffort = selected?.model.reasoning?.defaultEffort;\n const effectiveEffort = reasoningEffort === "" || reasoningEffort === "default" ? defaultEffort : reasoningEffort;\n const selectedEffort = efforts.find((effort) => effort.id === effectiveEffort);\n const modelLabel = selected?.model.name ?? (model === "" ? t("plan.model.choose") : model);\n const effortLabel = selectedEffort?.name ?? (effectiveEffort === void 0 ? t("plan.model.providerDefault") : effectiveEffort);\n const unavailable = state.status === "error" || state.failures.length > 0;\n const close = () => {\n setOpen(false);\n setPane("root");\n };\n const rootItems = [{\n id: MODEL_MENU_OPEN_MODELS,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuRow,\n children: [\n (0, react_jsx_runtime.jsx)("span", { children: t("plan.member.model") }),\n (0, react_jsx_runtime.jsx)("strong", { children: modelLabel }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false })\n ]\n }),\n disabled: state.status === "loading" && catalogRoutes.length === 0\n }, {\n id: MODEL_MENU_OPEN_EFFORT,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuRow,\n children: [\n (0, react_jsx_runtime.jsx)("span", { children: t("plan.member.reasoning") }),\n (0, react_jsx_runtime.jsx)("strong", { children: effortLabel }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false })\n ]\n }),\n disabled: selected?.model.reasoning === void 0\n }];\n const modelItems = [{\n id: MODEL_MENU_BACK,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuBack,\n children: [(0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false }), t("plan.model.back")]\n })\n }, {\n type: "separator",\n id: "models:separator"\n }];\n if (catalogRoutes.length === 0) modelItems.push({\n id: "models:empty",\n label: state.status === "loading" ? t("plan.model.loading") : t("plan.model.empty"),\n disabled: true\n });\n else for (const group of state.groups) {\n modelItems.push({\n type: "label",\n id: `provider:${group.id}`,\n text: group.name\n });\n for (const candidate of group.models) modelItems.push({\n id: modelMenuId(group.id, candidate.id),\n label: candidate.name\n });\n }\n const effortItems = [\n {\n id: MODEL_MENU_BACK,\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelMenuBack,\n children: [(0, react_jsx_runtime.jsx)(DisclosureChevron, { open: false }), t("plan.model.back")]\n })\n },\n {\n type: "separator",\n id: "effort:separator"\n },\n {\n id: MODEL_MENU_DEFAULT_EFFORT,\n label: defaultEffort === void 0 ? t("plan.model.providerDefault") : t("plan.model.modelDefault", { effort: efforts.find((effort) => effort.id === defaultEffort)?.name ?? defaultEffort })\n },\n ...efforts.map((effort) => ({\n id: effortMenuId(effort.id),\n label: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelEffortRow,\n children: [(0, react_jsx_runtime.jsx)("span", { children: effort.name }), effort.description !== void 0 && (0, react_jsx_runtime.jsx)("small", { children: effort.description })]\n })\n }))\n ];\n const items = pane === "models" ? modelItems : pane === "effort" ? effortItems : rootItems;\n const selectedId = pane === "models" ? modelMenuId(provider, model) : pane === "effort" ? reasoningEffort === "" || reasoningEffort === "default" ? MODEL_MENU_DEFAULT_EFFORT : effortMenuId(reasoningEffort) : void 0;\n const choose = (id) => {\n if (id === MODEL_MENU_OPEN_MODELS) {\n setPane("models");\n return;\n }\n if (id === MODEL_MENU_OPEN_EFFORT) {\n setPane("effort");\n return;\n }\n if (id === MODEL_MENU_BACK) {\n setPane("root");\n return;\n }\n if (id === MODEL_MENU_RETRY) {\n directory.load().catch(() => void 0);\n return;\n }\n const nextModel = catalogRoutes.find((candidate) => modelMenuId(candidate.provider, candidate.model.id) === id);\n if (nextModel !== void 0) {\n close();\n if (nextModel.provider === provider && nextModel.model.id === model) return;\n onChange({\n provider: nextModel.provider,\n model: nextModel.model.id,\n reasoningEffort: "default"\n });\n return;\n }\n if (id === MODEL_MENU_DEFAULT_EFFORT) {\n close();\n if (effectiveEffort === defaultEffort) return;\n onChange({\n provider,\n model,\n reasoningEffort: "default"\n });\n return;\n }\n const nextEffort = efforts.find((effort) => effortMenuId(effort.id) === id);\n if (nextEffort === void 0) return;\n close();\n if (nextEffort.id === reasoningEffort) return;\n onChange({\n provider,\n model,\n reasoningEffort: nextEffort.id\n });\n };\n return (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.planModelPicker,\n "data-model-directory-status": state.status,\n children: [\n (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {\n open,\n portal: true,\n align: "end",\n compact: true,\n className: ActivityPanel_module_css_default.planModelMenu,\n items,\n footer: unavailable ? [{\n id: MODEL_MENU_RETRY,\n label: t("plan.model.retry")\n }] : void 0,\n selectedId,\n onSelect: choose,\n onClose: close,\n anchor: (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planModelTrigger,\n "data-plan-model-trigger": true,\n "aria-label": t("plan.model.triggerAria", {\n model: modelLabel,\n effort: effortLabel\n }),\n "aria-haspopup": "menu",\n "aria-expanded": open,\n disabled: busy,\n onClick: () => {\n if (open) close();\n else {\n setPane("root");\n setOpen(true);\n directory.load().catch(() => void 0);\n }\n },\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelTriggerCopy,\n children: [(0, react_jsx_runtime.jsx)("strong", { children: state.status === "loading" && catalogRoutes.length === 0 ? t("plan.model.loading") : modelLabel }), (0, react_jsx_runtime.jsx)("span", { children: effortLabel })]\n }), (0, react_jsx_runtime.jsx)(DisclosureChevron, { open })]\n })\n }),\n (0, react_jsx_runtime.jsx)("small", {\n className: ActivityPanel_module_css_default.planModelHint,\n children: currentMissing ? t("plan.model.currentUnavailable", {\n provider,\n model\n }) : selected?.model.description ?? t("plan.model.route", {\n provider,\n model\n })\n }),\n unavailable && (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planModelNotice,\n role: state.status === "error" ? "alert" : "status",\n children: [(0, react_jsx_runtime.jsx)("span", { children: state.error ?? t("plan.model.partialFailure", { count: state.failures.length }) }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n disabled: busy || state.status === "loading",\n onClick: () => {\n directory.load().catch(() => void 0);\n },\n children: t("plan.model.retry")\n })]\n })\n ]\n });\n }\n function StagedMemberEditor({ team, member, modelDirectory, onPendingChange, t }) {\n const bodyId = (0, react.useId)();\n const [open, setOpen] = (0, react.useState)(false);\n const [role, setRole] = (0, react.useState)(member.role);\n const [provider, setProvider] = (0, react.useState)(member.provider ?? "");\n const [model, setModel] = (0, react.useState)(member.model ?? "");\n const [reasoningEffort, setReasoningEffort] = (0, react.useState)(member.reasoningEffort ?? "");\n const [executionPrompt, setExecutionPrompt] = (0, react.useState)(member.executionPrompt ?? "");\n const remoteSignature = JSON.stringify([\n member.role,\n member.provider ?? "",\n member.model ?? "",\n member.reasoningEffort ?? "",\n member.executionPrompt ?? ""\n ]);\n const [savedSignature, setSavedSignature] = (0, react.useState)(remoteSignature);\n const [busy, setBusy] = (0, react.useState)(false);\n const [feedback, setFeedback] = (0, react.useState)();\n useDismissSuccess(feedback, setFeedback);\n const dirty = JSON.stringify([\n role,\n provider,\n model,\n reasoningEffort,\n executionPrompt\n ]) !== savedSignature;\n (0, react.useEffect)(() => {\n onPendingChange(`member:${member.name}`, dirty || busy);\n return () => {\n onPendingChange(`member:${member.name}`, false);\n };\n }, [\n busy,\n dirty,\n member.name,\n onPendingChange\n ]);\n (0, react.useEffect)(() => {\n setRole(member.role);\n setProvider(member.provider ?? "");\n setModel(member.model ?? "");\n setReasoningEffort(member.reasoningEffort ?? "");\n setExecutionPrompt(member.executionPrompt ?? "");\n setSavedSignature(remoteSignature);\n }, [\n member.role,\n member.provider,\n member.model,\n member.reasoningEffort,\n member.executionPrompt,\n remoteSignature\n ]);\n const markEdited = () => {\n setFeedback(void 0);\n };\n const persist = async (selection = {\n provider,\n model,\n reasoningEffort\n }) => {\n const nextSignature = JSON.stringify([\n role,\n selection.provider,\n selection.model,\n selection.reasoningEffort,\n executionPrompt\n ]);\n setProvider(selection.provider);\n setModel(selection.model);\n setReasoningEffort(selection.reasoningEffort);\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "update_member",\n memberName: member.name,\n role,\n provider: selection.provider,\n model: selection.model,\n reasoningEffort: selection.reasoningEffort,\n executionPrompt\n });\n setSavedSignature(nextSignature);\n setFeedback({\n tone: "success",\n message: t("plan.saved")\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n } finally {\n setBusy(false);\n }\n };\n const save = async (event) => {\n event.preventDefault();\n await persist();\n };\n const route = `${provider}/${model}`.replace(/^\\//u, "");\n return (0, react_jsx_runtime.jsxs)("article", {\n className: ActivityPanel_module_css_default.planCard,\n "data-plan-member": member.name,\n "data-open": open,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planCardHeader,\n "aria-expanded": open,\n "aria-controls": bodyId,\n onClick: () => {\n setOpen((current) => !current);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planCardIdentity,\n children: [(0, react_jsx_runtime.jsx)("strong", { children: member.name }), (0, react_jsx_runtime.jsx)("span", { children: role || t("plan.member.roleFallback") })]\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.planCardMeta,\n title: route,\n children: route\n }),\n dirty && (0, react_jsx_runtime.jsx)("em", {\n className: ActivityPanel_module_css_default.planDirty,\n children: t("plan.unsaved")\n }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open })\n ]\n }), open && (0, react_jsx_runtime.jsxs)("form", {\n id: bodyId,\n className: ActivityPanel_module_css_default.planCardBody,\n onSubmit: (event) => {\n save(event);\n },\n children: [(0, react_jsx_runtime.jsxs)("fieldset", {\n disabled: busy,\n children: [\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.member.role"), (0, react_jsx_runtime.jsx)("input", {\n name: "role",\n value: role,\n onChange: (event) => {\n setRole(event.currentTarget.value);\n markEdited();\n }\n })] }),\n (0, react_jsx_runtime.jsx)(StagedModelPicker, {\n directory: modelDirectory,\n provider,\n model,\n reasoningEffort,\n busy,\n onChange: (selection) => {\n persist(selection);\n },\n t\n }),\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.member.prompt"), (0, react_jsx_runtime.jsx)("textarea", {\n name: "executionPrompt",\n value: executionPrompt,\n onChange: (event) => {\n setExecutionPrompt(event.currentTarget.value);\n markEdited();\n },\n rows: 3\n })] })\n ]\n }), (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planActions,\n children: [(0, react_jsx_runtime.jsx)(Feedback, { value: feedback }), (0, react_jsx_runtime.jsx)("button", {\n type: "submit",\n disabled: busy || !dirty || provider.trim() === "" || model.trim() === "",\n children: busy ? t("plan.saving") : t("plan.save")\n })]\n })]\n })]\n });\n }\n function StagedTaskEditor({ team, task, onPendingChange, t }) {\n const bodyId = (0, react.useId)();\n const taskDependencies = task.dependencies.join(", ");\n const [open, setOpen] = (0, react.useState)(false);\n const [subject, setSubject] = (0, react.useState)(task.subject);\n const [description, setDescription] = (0, react.useState)(task.description ?? "");\n const [assignee, setAssignee] = (0, react.useState)(task.assignee);\n const [dependencies, setDependencies] = (0, react.useState)(taskDependencies);\n const remoteSignature = JSON.stringify([\n task.subject,\n task.description ?? "",\n task.assignee,\n taskDependencies\n ]);\n const [savedSignature, setSavedSignature] = (0, react.useState)(remoteSignature);\n const [busy, setBusy] = (0, react.useState)(false);\n const [confirmingRemove, setConfirmingRemove] = (0, react.useState)(false);\n const [feedback, setFeedback] = (0, react.useState)();\n useDismissSuccess(feedback, setFeedback);\n const signature = JSON.stringify([\n subject,\n description,\n assignee,\n dependencies\n ]);\n const dirty = signature !== savedSignature;\n (0, react.useEffect)(() => {\n onPendingChange(`task:${task.id}`, dirty || busy);\n return () => {\n onPendingChange(`task:${task.id}`, false);\n };\n }, [\n busy,\n dirty,\n onPendingChange,\n task.id\n ]);\n (0, react.useEffect)(() => {\n setSubject(task.subject);\n setDescription(task.description ?? "");\n setAssignee(task.assignee);\n setDependencies(taskDependencies);\n setSavedSignature(remoteSignature);\n }, [\n task.subject,\n task.description,\n task.assignee,\n taskDependencies,\n remoteSignature\n ]);\n const markEdited = () => {\n setFeedback(void 0);\n setConfirmingRemove(false);\n };\n const save = async (event) => {\n event.preventDefault();\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "update_task",\n taskId: task.id,\n subject,\n description,\n assignee,\n dependencies: dependencies.split(",").map((item) => item.trim()).filter(Boolean)\n });\n setSavedSignature(signature);\n setFeedback({\n tone: "success",\n message: t("plan.saved")\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n } finally {\n setBusy(false);\n }\n };\n const remove = async () => {\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "remove_task",\n taskId: task.id\n });\n setFeedback({\n tone: "success",\n message: t("plan.removed")\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n }\n };\n const dependencySummary = task.dependencies.length === 0 ? t("plan.dependencies.none") : t("plan.dependencies.count", { count: task.dependencies.length });\n return (0, react_jsx_runtime.jsxs)("article", {\n className: ActivityPanel_module_css_default.planCard,\n "data-plan-task": task.id,\n "data-open": open,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planCardHeader,\n "aria-expanded": open,\n "aria-controls": bodyId,\n onClick: () => {\n setOpen((current) => !current);\n },\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.planTaskId,\n children: task.id\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.planTaskSummary,\n title: subject,\n children: subject\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planCardMeta,\n children: [\n assignee || t("plan.task.unassigned"),\n " \xB7 ",\n dependencySummary\n ]\n }),\n dirty && (0, react_jsx_runtime.jsx)("em", {\n className: ActivityPanel_module_css_default.planDirty,\n children: t("plan.unsaved")\n }),\n (0, react_jsx_runtime.jsx)(DisclosureChevron, { open })\n ]\n }), open && (0, react_jsx_runtime.jsxs)("form", {\n id: bodyId,\n className: ActivityPanel_module_css_default.planCardBody,\n onSubmit: (event) => {\n save(event);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("fieldset", {\n disabled: busy,\n children: [\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.task.subject"), (0, react_jsx_runtime.jsx)("input", {\n name: "subject",\n required: true,\n value: subject,\n onChange: (event) => {\n setSubject(event.currentTarget.value);\n markEdited();\n }\n })] }),\n (0, react_jsx_runtime.jsxs)("label", { children: [t("plan.task.description"), (0, react_jsx_runtime.jsx)("textarea", {\n name: "description",\n value: description,\n onChange: (event) => {\n setDescription(event.currentTarget.value);\n markEdited();\n },\n rows: 3\n })] }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planGrid,\n children: [(0, react_jsx_runtime.jsxs)("label", { children: [t("plan.task.assignee"), (0, react_jsx_runtime.jsxs)("select", {\n name: "assignee",\n value: assignee,\n onChange: (event) => {\n setAssignee(event.currentTarget.value);\n markEdited();\n },\n children: [(0, react_jsx_runtime.jsx)("option", {\n value: "",\n children: t("plan.task.unassigned")\n }), team.members.map((member) => (0, react_jsx_runtime.jsx)("option", {\n value: member.name,\n children: member.name\n }, member.name))]\n })] }), (0, react_jsx_runtime.jsxs)("label", { children: [\n t("plan.task.dependencies"),\n (0, react_jsx_runtime.jsx)("input", {\n name: "dependencies",\n value: dependencies,\n onChange: (event) => {\n setDependencies(event.currentTarget.value);\n markEdited();\n }\n }),\n (0, react_jsx_runtime.jsx)("small", { children: t("plan.task.dependenciesHint") })\n ] })]\n })\n ]\n }),\n confirmingRemove && (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planConfirm,\n role: "alert",\n children: [\n (0, react_jsx_runtime.jsx)("span", { children: t("plan.removeWarning", { task: task.id }) }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n onClick: () => {\n setConfirmingRemove(false);\n },\n children: t("plan.cancel")\n }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-danger": true,\n "data-confirming": true,\n onClick: () => {\n remove();\n },\n children: t("plan.removeConfirm")\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planActions,\n children: [\n (0, react_jsx_runtime.jsx)(Feedback, { value: feedback }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-danger": true,\n onClick: () => {\n setConfirmingRemove(true);\n setFeedback(void 0);\n },\n disabled: busy || confirmingRemove,\n children: t("plan.remove")\n }),\n (0, react_jsx_runtime.jsx)("button", {\n type: "submit",\n disabled: busy || !dirty || subject.trim() === "",\n children: busy ? t("plan.saving") : t("plan.save")\n })\n ]\n })\n ]\n })]\n });\n }\n function StagingPlanEditor({ team, modelDirectory, onContinuePlanning, onDiscarded, t }) {\n const membersId = (0, react.useId)();\n const tasksId = (0, react.useId)();\n const [membersOpen, setMembersOpen] = (0, react.useState)(true);\n const [tasksOpen, setTasksOpen] = (0, react.useState)(true);\n const [newTask, setNewTask] = (0, react.useState)("");\n const [busy, setBusy] = (0, react.useState)(false);\n const [discardArmed, setDiscardArmed] = (0, react.useState)(false);\n const [pendingEditors, setPendingEditors] = (0, react.useState)(/* @__PURE__ */ new Set());\n const [feedback, setFeedback] = (0, react.useState)();\n useDismissSuccess(feedback, setFeedback);\n const dependencyLinks = team.tasks.reduce((total, task) => total + task.dependencies.length, 0);\n const runnable = team.members.length > 0 && team.tasks.length > 0;\n const hasPendingEdits = pendingEditors.size > 0 || newTask.trim() !== "";\n const waitingForFeedback = team.planReviewState === "awaiting_feedback";\n (0, react.useEffect)(() => {\n modelDirectory.load().catch(() => void 0);\n }, [modelDirectory]);\n const onPendingChange = (0, react.useCallback)((key, pending) => {\n setPendingEditors((current) => {\n if (pending === current.has(key)) return current;\n const next = new Set(current);\n if (pending) next.add(key);\n else next.delete(key);\n return next;\n });\n }, []);\n const addTask = async (event) => {\n event.preventDefault();\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "add_task",\n subject: newTask,\n dependencies: []\n });\n setNewTask("");\n setFeedback({\n tone: "success",\n message: t("plan.taskAdded")\n });\n setTasksOpen(true);\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n } finally {\n setBusy(false);\n }\n };\n const approve = async () => {\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "approve"\n });\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n }\n };\n const continueInChat = async () => {\n if (waitingForFeedback) {\n onContinuePlanning();\n return;\n }\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "continue"\n });\n onContinuePlanning();\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n }\n };\n const discard = async () => {\n setBusy(true);\n setFeedback(void 0);\n try {\n await mutatePlan({\n sessionId: team.captainSessionId,\n teamId: team.teamId,\n action: "discard"\n });\n onDiscarded();\n } catch (error) {\n setFeedback({\n tone: "error",\n message: t("plan.failed", { message: errorMessage(error) })\n });\n setBusy(false);\n setDiscardArmed(false);\n }\n };\n return (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.planEditor,\n "data-staging-editor": true,\n children: [\n (0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.planHeader,\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("plan.title") }), (0, react_jsx_runtime.jsx)("small", { children: t("plan.readySummary", {\n members: team.members.length,\n tasks: team.tasks.length,\n links: dependencyLinks\n }) })] }), (0, react_jsx_runtime.jsx)("em", { children: t("plan.badge") })] }), (0, react_jsx_runtime.jsx)("p", { children: t("plan.description") })]\n }),\n (0, react_jsx_runtime.jsxs)("ol", {\n className: ActivityPanel_module_css_default.planFlow,\n "aria-label": t("plan.flow.aria"),\n children: [\n (0, react_jsx_runtime.jsxs)("li", {\n "data-active": true,\n children: [(0, react_jsx_runtime.jsx)("span", { children: "1" }), t("plan.flow.review")]\n }),\n (0, react_jsx_runtime.jsxs)("li", { children: [(0, react_jsx_runtime.jsx)("span", { children: "2" }), t("plan.flow.spawn")] }),\n (0, react_jsx_runtime.jsxs)("li", { children: [(0, react_jsx_runtime.jsx)("span", { children: "3" }), t("plan.flow.run")] })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.planSection,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planSectionToggle,\n "aria-expanded": membersOpen,\n "aria-controls": membersId,\n onClick: () => {\n setMembersOpen((current) => !current);\n },\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("plan.members.title") }), (0, react_jsx_runtime.jsx)("small", { children: t("plan.members.count", { count: team.members.length }) })] }), (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: membersOpen })]\n }), membersOpen && (0, react_jsx_runtime.jsx)("div", {\n id: membersId,\n className: ActivityPanel_module_css_default.planList,\n children: team.members.length === 0 ? (0, react_jsx_runtime.jsx)("p", {\n className: ActivityPanel_module_css_default.planEmpty,\n children: t("plan.members.empty")\n }) : team.members.map((member) => (0, react_jsx_runtime.jsx)(StagedMemberEditor, {\n team,\n member,\n modelDirectory,\n onPendingChange,\n t\n }, member.name))\n })]\n }),\n (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.planSection,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.planSectionToggle,\n "aria-expanded": tasksOpen,\n "aria-controls": tasksId,\n onClick: () => {\n setTasksOpen((current) => !current);\n },\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("plan.tasks.title") }), (0, react_jsx_runtime.jsx)("small", { children: t("plan.tasks.count", {\n count: team.tasks.length,\n links: dependencyLinks\n }) })] }), (0, react_jsx_runtime.jsx)(DisclosureChevron, { open: tasksOpen })]\n }), tasksOpen && (0, react_jsx_runtime.jsx)("div", {\n id: tasksId,\n className: ActivityPanel_module_css_default.planList,\n children: team.tasks.length === 0 ? (0, react_jsx_runtime.jsx)("p", {\n className: ActivityPanel_module_css_default.planEmpty,\n children: t("plan.tasks.empty")\n }) : team.tasks.map((task) => (0, react_jsx_runtime.jsx)(StagedTaskEditor, {\n team,\n task,\n onPendingChange,\n t\n }, task.id))\n })]\n }),\n (0, react_jsx_runtime.jsxs)("form", {\n className: ActivityPanel_module_css_default.planNewTask,\n onSubmit: (event) => {\n addTask(event);\n },\n children: [(0, react_jsx_runtime.jsxs)("label", { children: [(0, react_jsx_runtime.jsx)("span", { children: t("plan.newTaskLabel") }), (0, react_jsx_runtime.jsx)("input", {\n name: "newTask",\n value: newTask,\n onChange: (event) => {\n setNewTask(event.currentTarget.value);\n setFeedback(void 0);\n },\n placeholder: t("plan.newTask"),\n disabled: busy\n })] }), (0, react_jsx_runtime.jsx)("button", {\n type: "submit",\n disabled: busy || newTask.trim() === "",\n children: busy ? t("plan.adding") : t("plan.addTask")\n })]\n }),\n (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.planApproveRow,\n "data-armed": discardArmed || void 0,\n "data-discard": discardArmed || void 0,\n "data-review-state": waitingForFeedback ? "awaiting-feedback" : "awaiting-review",\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planApproveCopy,\n children: [(0, react_jsx_runtime.jsx)("strong", { children: discardArmed ? t("plan.discardConfirmTitle") : waitingForFeedback ? t("plan.feedbackTitle") : t("plan.approveTitle") }), (0, react_jsx_runtime.jsx)("small", { children: discardArmed ? t("plan.discardWarning") : waitingForFeedback ? t("plan.feedbackHint") : hasPendingEdits ? t("plan.pendingEdits") : t("plan.approveHint", {\n members: team.members.length,\n tasks: team.tasks.length\n }) })]\n }),\n (0, react_jsx_runtime.jsx)(Feedback, { value: feedback }),\n discardArmed ? (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planApproveActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n disabled: busy,\n onClick: () => {\n setDiscardArmed(false);\n },\n children: t("plan.cancel")\n }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-discard": true,\n "data-danger": true,\n "data-confirming": true,\n disabled: busy,\n onClick: () => {\n discard();\n },\n children: busy ? t("plan.discarding") : t("plan.discardConfirm")\n })]\n }) : (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planReviewActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-approve": true,\n disabled: busy || !runnable || hasPendingEdits,\n onClick: () => {\n approve();\n },\n children: t("plan.approve")\n }), (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.planSecondaryActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-continue": true,\n disabled: busy,\n onClick: () => {\n continueInChat();\n },\n children: t(waitingForFeedback ? "plan.returnToChat" : "plan.continue")\n }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n "data-plan-discard": true,\n "data-danger": true,\n disabled: busy,\n onClick: () => {\n setDiscardArmed(true);\n setFeedback(void 0);\n },\n children: t("plan.discard")\n })]\n })]\n })\n ]\n })\n ]\n });\n }\n\n\n /** Pure persisted geometry rules for the T Team shell-overlay panel. */\n const PANEL_LAYOUT_STORAGE_KEY = "t-team:activity-panel:v1";\n const DEFAULT_PANEL_LAYOUT = Object.freeze({\n mode: "docked",\n x: 0,\n y: 64,\n width: 388,\n height: 640,\n heightMode: "auto"\n });\n function clamp(value, minimum, maximum) {\n return Math.min(Math.max(value, minimum), maximum);\n }\n function finite(value) {\n return typeof value === "number" && Number.isFinite(value);\n }\n /** Decode one versioned localStorage value, rejecting partial/corrupt state. */\n function parsePanelLayout(value) {\n if (value === null) return DEFAULT_PANEL_LAYOUT;\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== "object" || parsed === null) return DEFAULT_PANEL_LAYOUT;\n const record = parsed;\n if (record.mode !== "docked" && record.mode !== "floating" || !finite(record.x) || !finite(record.y) || !finite(record.width) || !finite(record.height)) return DEFAULT_PANEL_LAYOUT;\n return {\n mode: record.mode,\n x: record.x,\n y: record.y,\n width: record.width,\n height: record.height,\n heightMode: record.mode === "floating" && record.heightMode === "manual" ? "manual" : "auto"\n };\n } catch {\n return DEFAULT_PANEL_LAYOUT;\n }\n }\n /** Whether the panel should become a simple inset overlay with no gestures. */\n function compactPanelForBounds(bounds) {\n return bounds.width <= 960;\n }\n /** Docked and compact panels always fit content; floating panels may be user-sized. */\n function panelUsesAutoHeight(layout, bounds) {\n return compactPanelForBounds(bounds) || layout.mode === "docked" || layout.heightMode === "auto";\n }\n /** CSS max-height ceiling that keeps an auto-height panel inside its shell. */\n function panelMaximumHeight(layout, bounds) {\n const bottomInset = compactPanelForBounds(bounds) || layout.mode === "floating" ? 12 : 48;\n return Math.max(1, bounds.height - layout.y - bottomInset);\n }\n /** Resolve persisted state into a visible rectangle inside the current shell. */\n function resolvePanelGeometry(layout, bounds) {\n const boundsWidth = Math.max(1, bounds.width);\n const boundsHeight = Math.max(1, bounds.height);\n if (compactPanelForBounds(bounds)) return {\n ...layout,\n x: 12,\n y: 12,\n width: Math.max(1, boundsWidth - 24),\n height: Math.max(1, boundsHeight - 24)\n };\n const maximumWidth = Math.max(1, Math.min(640, boundsWidth - 24));\n const minimumWidth = Math.min(320, maximumWidth);\n const width = clamp(layout.width, minimumWidth, maximumWidth);\n const maximumHeight = Math.max(1, boundsHeight - 24);\n const minimumHeight = Math.min(360, maximumHeight);\n if (layout.mode === "docked") {\n const y = clamp(64, 12, Math.max(12, boundsHeight - minimumHeight - 12));\n const availableHeight = Math.max(1, boundsHeight - y - 48);\n const height = clamp(availableHeight, Math.min(minimumHeight, availableHeight), maximumHeight);\n const anchorRight = clamp(bounds.anchorRight, 0, boundsWidth);\n const maximumX = Math.max(12, boundsWidth - width - 12);\n return {\n mode: "docked",\n x: clamp(anchorRight - 18 - width, 12, maximumX),\n y,\n width,\n height,\n heightMode: layout.heightMode\n };\n }\n const height = clamp(layout.height, minimumHeight, maximumHeight);\n return {\n mode: "floating",\n x: clamp(layout.x, 12, Math.max(12, boundsWidth - width - 12)),\n y: clamp(layout.y, 12, Math.max(12, boundsHeight - height - 12)),\n width,\n height,\n heightMode: layout.heightMode\n };\n }\n /** Undock without a visual jump by adopting the panel\'s resolved rectangle. */\n function floatPanelLayout(geometry, bounds) {\n return resolvePanelGeometry({\n ...geometry,\n mode: "floating"\n }, bounds);\n }\n /** Return to the right dock, preserving width and restoring content-fit height. */\n function dockPanelLayout(layout, bounds) {\n return resolvePanelGeometry({\n ...layout,\n mode: "docked",\n heightMode: "auto"\n }, bounds);\n }\n /** Translate a floating panel and clamp it back into the visible shell. */\n function movePanelLayout(start, dx, dy, bounds) {\n return resolvePanelGeometry({\n ...start,\n mode: "floating",\n x: start.x + dx,\n y: start.y + dy\n }, bounds);\n }\n /** Resize while keeping the edge opposite the active handle stationary. */\n function resizePanelLayout(start, edge, dx, dy, bounds) {\n if (start.mode === "docked") {\n if (edge !== "left") return resolvePanelGeometry(start, bounds);\n return resolvePanelGeometry({\n ...start,\n width: start.width - dx\n }, bounds);\n }\n const resolved = resolvePanelGeometry(start, bounds);\n const minimumWidth = Math.min(320, resolved.x + resolved.width - 12);\n const minimumHeight = Math.min(360, bounds.height - resolved.y - 12);\n if (edge === "left") {\n const right = resolved.x + resolved.width;\n const maximumWidth = Math.max(1, Math.min(640, right - 12));\n const width = clamp(resolved.width - dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return {\n ...resolved,\n x: right - width,\n width\n };\n }\n const maximumHeight = Math.max(1, bounds.height - resolved.y - 12);\n const height = clamp(resolved.height + dy, Math.min(minimumHeight, maximumHeight), maximumHeight);\n if (edge === "bottom") return {\n ...resolved,\n height,\n heightMode: "manual"\n };\n const maximumWidth = Math.max(1, Math.min(640, bounds.width - resolved.x - 12));\n const width = clamp(resolved.width + dx, Math.min(minimumWidth, maximumWidth), maximumWidth);\n return {\n ...resolved,\n width,\n height,\n heightMode: "manual"\n };\n }\n\n\n /**\n * T Team activity panel: the top-right floater monitoring every team.\n *\n * Modeled on the Claude Code desktop SessionActivityPanel: a shell-overlay\n * panel that docks at the conversation\'s top-right edge by default, can be\n * dragged into a floating window, resized, and folded into an activity badge.\n * On wide viewports the docked panel makes the conversation column yield\n * space; narrow viewports keep a simple inset overlay. It\n * polls the host `/plugins/t-team/state` route for\n * server-side snapshots (durable files + live subagent activity), with a\n * collapsed badge that auto-expands once when activity appears. Archived\n * teams stay available for the owning conversation after live work ends.\n *\n * The floater mounts in ui-layout\'s additive `shell.overlay`; it is not a\n * conversation node \u2014 the in-conversation panel was removed in favor of this\n * always-available monitor.\n * @module t-team/client/activity\n */\n /** Grace before the panel collapses once no team remains. */\n const AUTOCLOSE_GRACE_MS = 2e3;\n /**\n * Page-settle window after mount: activity restored on page load only shows\n * the collapsed badge, so the panel never yanks the conversation column\n * right after load. New activity after this window auto-expands as usual.\n */\n const AUTO_OPEN_SETTLE_MS = 4e3;\n /** Root marker shared with the panel CSS while the shell overlay is expanded. */\n const PANEL_OPEN_ATTRIBUTE = "data-t-team-panel-open";\n /** Shared width concession consumed by the conversation root CSS. */\n const PANEL_SHIFT_PROPERTY = "--t-team-panel-shift";\n const PANEL_CONVERSATION_GAP = 14;\n const MOVE_THRESHOLD = 4;\n const CAPTAIN_ASSIGNEE = "captain";\n function initialPanelLayout() {\n if (typeof window === "undefined") return DEFAULT_PANEL_LAYOUT;\n return parsePanelLayout(window.localStorage.getItem(PANEL_LAYOUT_STORAGE_KEY));\n }\n function initialPanelBounds() {\n if (typeof window === "undefined") return {\n width: 1440,\n height: 900,\n anchorRight: 1440\n };\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n anchorRight: window.innerWidth\n };\n }\n /** Initial-letter fallback for unmatched roles. */\n function memberInitial(name) {\n return name.trim().slice(0, 1).toUpperCase() || "?";\n }\n function stableHash(value) {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) hash = (hash << 5) - hash + value.charCodeAt(index) | 0;\n return Math.abs(hash);\n }\n const ACCENTS = [\n "var(--dsw-alias-state-business-primary)",\n "var(--dsw-alias-state-success)",\n "var(--dsw-alias-state-danger)",\n "var(--dsw-alias-state-warning)",\n "var(--dsw-alias-label-tertiary)"\n ];\n function accentOf(id) {\n return ACCENTS[stableHash(id) % ACCENTS.length] ?? ACCENTS[0];\n }\n /** Badge text follows the raw task status (finer than the 4 visual states):\n * claimed/pending/failed/cancelled keep their own labels and colors. */\n const TASK_STATUS_LABEL = {\n pending: "task.status.pending",\n claimed: "task.status.claimed",\n in_progress: "task.status.inProgress",\n completed: "task.status.completed",\n failed: "task.status.failed",\n cancelled: "task.status.cancelled"\n };\n function taskStatusLabel(status, t) {\n const key = TASK_STATUS_LABEL[status];\n return key === void 0 ? status : t(key);\n }\n function formatTaskIds(ids, t) {\n return ids.join(t("format.listSeparator"));\n }\n function taskTitle(task, model) {\n const extras = [\n task.kind,\n task.round === void 0 ? void 0 : `r${task.round}`,\n task.verdict,\n model === "" ? void 0 : model\n ].filter((item) => item !== void 0);\n return extras.length === 0 ? `${task.id} \xB7 ${task.subject}` : `${task.id} \xB7 ${task.subject} \xB7 ${extras.join(" \xB7 ")}`;\n }\n /** Badge/bar coloring key: visual state, widened for terminal statuses. */\n function taskTone(state, status) {\n if (status === "failed") return "failed";\n if (status === "cancelled") return "cancelled";\n return state;\n }\n function Chevron({ open }) {\n return (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.chevron,\n "data-open": open,\n width: "9",\n height: "9",\n viewBox: "0 0 10 10",\n fill: "none",\n stroke: "currentColor",\n strokeWidth: "1.5",\n strokeLinecap: "round",\n "aria-hidden": true,\n children: (0, react_jsx_runtime.jsx)("path", { d: "M3.5 2l3 3-3 3" })\n });\n }\n function WorkGlyph({ active }) {\n return (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.workGlyph,\n "data-active": active,\n width: "11",\n height: "11",\n viewBox: "0 0 11 11",\n fill: "currentColor",\n "aria-hidden": true,\n children: [\n [0, 0],\n [4.2, 0],\n [8.4, 0],\n [0, 4.2],\n [4.2, 4.2],\n [8.4, 4.2]\n ].map(([x, y], index) => (0, react_jsx_runtime.jsx)("rect", {\n x,\n y,\n width: "2.6",\n height: "2.6",\n rx: ".6",\n style: { animationDelay: `${index * .15}s` }\n }, `${x}:${y}`))\n });\n }\n /** Collapsed badge: an always-visible corner pill while any team exists. */\n function CollapsedBadge({ count, busy, onClick, t }) {\n return (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.badge,\n "data-t-team-collapsed": true,\n "data-busy": busy,\n onClick,\n "aria-label": t("activity.badgeAria", { count }),\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.badgeDot,\n "data-busy": busy,\n "aria-hidden": true\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.badgeCount,\n children: count\n })]\n });\n }\n function memberStateLabel(member, tasks, historic, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n if (member.activity === "working") return t("member.state.working");\n if (owned.some((task) => task.status === "failed")) return t("member.state.failed");\n if (owned.some((task) => task.state === "blocked")) return t("member.state.waiting");\n if (owned.length > 0 && owned.every((task) => task.status === "completed")) return t("member.state.delivered");\n if (member.status === "removed") return t(historic ? "member.state.left" : "member.state.removed");\n if (owned.length > 0) return t("member.state.pending");\n return t("member.state.unassigned");\n }\n function memberStatusText(member, tasks, t) {\n const owned = tasks.filter((task) => task.assignee === member.name);\n const current = owned.find((task) => task.id === member.currentTask);\n const blocked = owned.find((task) => task.state === "blocked");\n if (member.activity === "working" && current !== void 0) {\n const model = taskModelLabel(current, [member]);\n return model === "" ? t("member.status.executing", { taskId: current.id }) : t("member.status.executingModel", {\n taskId: current.id,\n model\n });\n }\n if (member.activity === "working") return t("member.status.working");\n if (blocked !== void 0) {\n const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== "completed");\n if (dependency !== void 0) return t("member.status.waitingOn", {\n taskId: dependency.id,\n assignee: dependency.assignee || t("task.assignee.unclaimed")\n });\n return t("member.status.waitingPrerequisite");\n }\n if (member.total === 0) return t("member.status.waitingAssignment");\n if (member.done === member.total) return t("member.status.delivered");\n return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");\n }\n function compactTaskLabel(subject) {\n const withoutVerb = subject.replace(/^\u5F00\u53D1\\s*/u, "").replace(/^\\d+[-_.\u3001\\s]*/u, "");\n const head = withoutVerb.split(/[\uFF08(\xB7\uFF1A:]/u)[0]?.trim() ?? withoutVerb;\n return head.length > 18 ? `${head.slice(0, 17)}\u2026` : head;\n }\n function taskSummary(team, t, discarded = false) {\n const completed = team.tasks.filter((task) => task.status === "completed");\n const cancelled = team.tasks.filter((task) => task.status === "cancelled");\n const running = team.tasks.filter((task) => task.state === "running");\n const blocked = team.tasks.filter((task) => task.state === "blocked");\n const ready = team.tasks.filter((task) => task.state === "open" && task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled");\n const failed = team.tasks.filter((task) => task.status === "failed");\n if (discarded) return t("task.summary.discarded", { count: team.tasks.length });\n if (team.tasks.length === 0) return t("task.summary.waitingBreakdown");\n if (team.phase === "staged") return t("task.summary.staged", { count: team.tasks.length });\n if (completed.length === team.tasks.length) return t("task.summary.allDelivered", { count: completed.length });\n if (completed.length + cancelled.length + failed.length === team.tasks.length) return t("task.summary.ended", {\n completed: completed.length,\n cancelled: cancelled.length,\n failed: failed.length\n });\n if (failed.length > 0 && running.length === 0 && ready.length === 0 && blocked.length === 0) return t("task.summary.failedSettled", { count: failed.length });\n if (blocked.length > 0 && running.length > 0) return t("task.summary.blockedAndRunning", {\n tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),\n more: blocked.length > 3 ? t("task.summary.more", { count: blocked.length - 3 }) : ""\n });\n if (running.length > 0) return t("task.summary.running", { tasks: formatTaskIds(running.map((task) => task.id), t) });\n if (ready.length > 0) return t("task.summary.ready", { tasks: formatTaskIds(ready.map((task) => task.id), t) });\n if (blocked.length > 0) return t("task.summary.blocked", { tasks: formatTaskIds(blocked.map((task) => task.id), t) });\n return t("task.summary.waitingSchedule");\n }\n function ProgressOverview({ team, t, discarded = false }) {\n const running = discarded ? 0 : team.tasks.filter((task) => task.state === "running").length;\n const blocked = discarded ? 0 : team.tasks.filter((task) => task.state === "blocked").length;\n const completed = discarded ? 0 : team.tasks.filter((task) => task.status === "completed").length;\n const settled = !discarded && team.tasks.length > 0 && team.tasks.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled");\n const summaryTone = discarded ? "discarded" : blocked > 0 ? "warning" : settled ? "completed" : "running";\n return (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.progressOverview,\n "aria-label": t("progress.aria"),\n "data-progress-summary": true,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.progressTitle,\n children: t("progress.title")\n }),\n team.tasks.length > 0 ? (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.progressSegments,\n "aria-hidden": true,\n children: team.tasks.map((task) => (0, react_jsx_runtime.jsx)("span", { "data-state": discarded ? "cancelled" : taskTone(task.state, task.status) }, task.id))\n }) : (0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressEmpty }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.progressLegend,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n "data-state": "running",\n children: t("progress.running", { count: running })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-state": "blocked",\n children: t("progress.blocked", { count: blocked })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-state": "completed",\n children: t("progress.delivered", { count: completed })\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.progressSummary,\n "data-state": summaryTone,\n children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team, t, discarded) })]\n })\n ]\n });\n }\n function DependencyMap({ tasks, members, t, discarded = false }) {\n const [open, setOpen] = (0, react.useState)(true);\n const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);\n const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);\n const [pinnedTaskId, setPinnedTaskId] = (0, react.useState)(null);\n const hoverTimer = (0, react.useRef)(null);\n const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);\n const layout = (0, react.useMemo)(() => compactDagLayout(tasks), [tasks]);\n const parallel = (0, react.useMemo)(() => usesParallelTaskGrid(tasks), [tasks]);\n const related = (0, react.useMemo)(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);\n const scheduleHover = (id) => {\n if (hoverTimer.current !== null) {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }\n if (id === null) {\n setHoverTaskId(null);\n return;\n }\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n setHoverTaskId(id);\n }, 180);\n };\n (0, react.useEffect)(() => () => {\n if (hoverTimer.current !== null) clearTimeout(hoverTimer.current);\n }, []);\n (0, react.useEffect)(() => {\n const onKeyDown = (event) => {\n if (event.key === "Escape") setPinnedTaskId(null);\n };\n window.addEventListener("keydown", onKeyDown);\n return () => {\n window.removeEventListener("keydown", onKeyDown);\n };\n }, []);\n if (tasks.length === 0) return null;\n const fallbackTask = tasks.find((task) => task.state === "blocked") ?? tasks.find((task) => task.state === "running") ?? tasks[0];\n const detailTask = tasks.find((task) => task.id === focusedTaskId) ?? fallbackTask;\n const detailModel = taskModelLabel(detailTask, members);\n const waitingOn = detailTask.dependencies.filter((dependency) => tasks.find((task) => task.id === dependency)?.status !== "completed");\n const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));\n return (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.dependencySection,\n "aria-label": t("dependency.aria"),\n "data-dependency-map": true,\n children: [(0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.sectionHead,\n children: [(0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.sectionToggleTitle,\n onClick: () => {\n setOpen((current) => !current);\n },\n "aria-expanded": open,\n children: [\n (0, react_jsx_runtime.jsx)(Chevron, { open }),\n (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),\n " ",\n t(parallel ? "dependency.parallel" : "dependency.title")\n ]\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.sectionHint,\n children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })\n })]\n }), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.dagViewport,\n children: (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.dagCanvas,\n "data-layout": parallel ? "parallel" : "dependency",\n style: parallel ? void 0 : {\n width: layout.width,\n height: layout.height\n },\n children: [!parallel && (0, react_jsx_runtime.jsx)("svg", {\n className: ActivityPanel_module_css_default.dagEdges,\n width: layout.width,\n height: layout.height,\n "aria-hidden": true,\n children: layout.edges.map((edge) => {\n const active = related !== null && related.has(edge.from) && related.has(edge.to);\n return (0, react_jsx_runtime.jsx)("path", {\n d: edge.path,\n "data-active": active,\n "data-dimmed": related !== null && !active\n }, `${edge.from}:${edge.to}`);\n })\n }), layout.nodes.map(({ task, x, y }) => {\n const model = taskModelLabel(task, members);\n const shortModel = compactModelLabel(model);\n return (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.dagNode,\n style: parallel ? { height: 30 } : {\n left: x,\n top: y,\n width: 92,\n height: 30\n },\n "data-task-id": task.id,\n "data-state": discarded ? "cancelled" : taskTone(task.state, task.status),\n "data-task-model": model || void 0,\n "data-focused": related?.has(task.id) ?? false,\n "data-dimmed": related !== null && !related.has(task.id),\n "aria-pressed": pinnedTaskId === task.id,\n title: taskTitle(task, model),\n onClick: () => {\n setPinnedTaskId((current) => current === task.id ? null : task.id);\n },\n onMouseEnter: () => {\n scheduleHover(task.id);\n },\n onMouseLeave: () => {\n scheduleHover(null);\n },\n onFocus: () => {\n setKeyboardTaskId(task.id);\n },\n onBlur: () => {\n setKeyboardTaskId(null);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.dagNodeHead,\n children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.dagNodeDot }), task.id]\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.dagNodeLabel,\n children: task.state === "running" && shortModel !== "" ? shortModel : compactTaskLabel(task.subject)\n }),\n task.state === "running" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.dagRunningState,\n "aria-label": t("task.runningAria"),\n children: (0, react_jsx_runtime.jsx)(WorkGlyph, { active: true })\n })\n ]\n }, task.id);\n })]\n })\n }), (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.taskDetail,\n "data-task-detail": detailTask.id,\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.taskDetailHead,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailId,\n children: detailTask.id\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailSubject,\n title: detailTask.subject,\n children: detailTask.subject.replace(/^\u5F00\u53D1\\s*/u, "")\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailBadge,\n "data-state": discarded ? "cancelled" : taskTone(detailTask.state, detailTask.status),\n children: discarded ? t("task.status.notRun") : taskStatusLabel(detailTask.status, t)\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.taskDetailLine,\n children: [\n detailTask.assignee || t("task.assignee.unclaimed"),\n " \xB7 ",\n discarded ? t("task.detail.notRun") : detailTask.status === "completed" ? t("task.detail.completed") : detailTask.dependencies.length === 0 ? t("task.detail.noPrerequisite") : waitingOn.length === 0 ? t("task.detail.ready") : t("task.detail.waitingOn", { tasks: formatTaskIds(waitingOn, t) })\n ]\n }),\n detailModel !== "" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailModel,\n "data-task-model": detailModel,\n children: t("task.model", { model: detailModel })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskDetailMeta,\n children: dependents.length === 0 ? t("task.detail.noDownstream") : t("task.detail.unlocks", { tasks: formatTaskIds(dependents.map((task) => task.id), t) })\n })\n ]\n })] })]\n });\n }\n function TeamSection({ team, modelDirectory, onContinuePlanning, onDiscarded, onNavigate, t, historic = false }) {\n const [membersOpen, setMembersOpen] = (0, react.useState)(true);\n const [stopOpen, setStopOpen] = (0, react.useState)(false);\n const [stopping, setStopping] = (0, react.useState)(false);\n const [stopError, setStopError] = (0, react.useState)("");\n const discarded = historic && team.phase === "staged";\n const stopped = !historic && team.halted === true;\n const busyCount = team.members.filter((member) => member.activity === "working").length;\n const assignedCount = team.tasks.filter((task) => task.assignee !== "" && task.assignee !== CAPTAIN_ASSIGNEE).length;\n const captainOwned = team.tasks.filter((task) => task.assignee === CAPTAIN_ASSIGNEE && task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled");\n const captainBusy = captainOwned.length > 0;\n const captainTaskIds = formatTaskIds(captainOwned.map((task) => task.id), t);\n const completedCount = team.tasks.filter((task) => task.status === "completed").length;\n const allCompleted = team.tasks.length > 0 && completedCount === team.tasks.length;\n const allSettled = team.tasks.length > 0 && team.tasks.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled");\n const unfinishedCount = team.tasks.filter((task) => task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled").length;\n const canStop = !historic && team.phase === "running" && team.halted !== true && teamIsActive(team);\n const stopTeam = async () => {\n if (stopping) return;\n setStopping(true);\n setStopError("");\n try {\n const response = await fetch(ACTIVITY_HALT_URL, {\n method: "POST",\n cache: "no-store",\n headers: { "content-type": "application/json" },\n body: JSON.stringify({\n sessionId: team.captainSessionId,\n teamId: team.teamId\n })\n });\n if (!response.ok) {\n let message = t("team.stopRequestFailed");\n try {\n const body = await response.json();\n if (typeof body.error === "string" && body.error.trim() !== "") message = body.error;\n } catch {}\n throw new Error(message);\n }\n setStopOpen(false);\n } catch (error) {\n setStopError(t("team.stopFailed", { message: error instanceof Error ? error.message : String(error) }));\n } finally {\n setStopping(false);\n }\n };\n return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.team,\n "data-team-id": team.teamId,\n children: [\n (0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.teamHead,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.teamName,\n title: team.name,\n children: team.name\n }),\n historic && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.historicPill,\n children: t(discarded ? "team.discarded" : "team.ended")\n }),\n stopped && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.historicPill,\n children: t("team.stopped")\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.teamStats,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n "data-stat": "members",\n children: t("team.stats.members", { count: team.members.length })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-stat": "tasks",\n children: t("team.stats.completed", {\n completed: completedCount,\n total: team.tasks.length\n })\n }),\n (0, react_jsx_runtime.jsx)("span", {\n "data-stat": "messages",\n children: t("team.stats.messages", { count: team.messageCount })\n })\n ]\n }),\n canStop && (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.teamStopButton,\n "aria-label": t("team.stop"),\n title: t("team.stop"),\n onClick: () => {\n setStopError("");\n setStopOpen(true);\n },\n children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconStopFill16, {})\n })\n ]\n }),\n team.phase === "staged" && !historic && modelDirectory !== void 0 && onContinuePlanning !== void 0 && onDiscarded !== void 0 && (0, react_jsx_runtime.jsx)(StagingPlanEditor, {\n team,\n modelDirectory,\n onContinuePlanning,\n onDiscarded,\n t\n }),\n (0, react_jsx_runtime.jsxs)("section", {\n className: ActivityPanel_module_css_default.delegationSection,\n "aria-label": t("delegation.aria"),\n "data-delegation-map": true,\n children: [\n (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.captainNode,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainAvatar,\n children: (0, react_jsx_runtime.jsx)("img", {\n className: ActivityPanel_module_css_default.leadAvatar,\n src: LEAD_ART,\n alt: "",\n "aria-hidden": true\n })\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.captainInfo,\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.captainLine,\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainName,\n children: t("captain.name")\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainRole,\n children: t("captain.role")\n })]\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.captainSummary,\n children: discarded ? t("captain.summary.discarded", {\n tasks: team.tasks.length,\n members: team.members.length\n }) : captainBusy ? t("captain.summary.withTakeover", {\n tasks: assignedCount,\n captainTasks: captainTaskIds\n }) : team.phase === "staged" ? t(team.planReviewState === "awaiting_feedback" ? "captain.summary.awaitingFeedback" : "captain.summary.staged", {\n tasks: team.tasks.length,\n members: team.members.length\n }) : t("captain.summary", {\n tasks: assignedCount,\n members: team.members.length\n })\n })]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.captainState,\n "data-busy": captainBusy || busyCount > 0,\n children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: captainBusy || busyCount > 0 }), discarded ? t("captain.state.discarded") : captainBusy ? t("captain.state.takeover", { tasks: captainTaskIds }) : team.phase === "staged" ? t(team.planReviewState === "awaiting_feedback" ? "captain.state.awaitingFeedback" : "captain.state.staged") : busyCount > 0 ? t("captain.state.working", { count: busyCount }) : t(allCompleted ? "captain.state.collected" : allSettled ? "captain.state.settled" : "captain.state.waiting")]\n })\n ]\n }),\n (0, react_jsx_runtime.jsx)(ProgressOverview, {\n team,\n t,\n discarded\n }),\n (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.membersToggle,\n onClick: () => {\n setMembersOpen((current) => !current);\n },\n "aria-expanded": membersOpen,\n "data-members-toggle": true,\n children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }), t("members.toggle", { count: team.members.length })] }), (0, react_jsx_runtime.jsx)("span", { children: t(membersOpen ? "members.collapse" : "members.expand") })]\n }),\n membersOpen && (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.delegationTree,\n children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.emptyHint,\n children: t("members.empty")\n }), team.members.map((member) => {\n const owned = team.tasks.filter((task) => task.assignee === member.name);\n const memberModel = memberRouteLabel(member);\n return (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.memberBlock,\n "data-activity": member.activity,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberBranch,\n "aria-hidden": true,\n children: (0, react_jsx_runtime.jsx)("span", {})\n }),\n (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.memberRow,\n "data-activity": member.activity,\n onClick: () => {\n if (member.id !== "") onNavigate(team.captainSessionId, member.id);\n },\n children: [\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberAvatar,\n "data-unread": member.unread > 0,\n children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {\n className: ActivityPanel_module_css_default.memberArt,\n src: memberArtUrl(member.name, member.role) ?? "",\n alt: "",\n "aria-hidden": true\n }) : (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberInitial,\n style: { background: accentOf(member.id) },\n children: memberInitial(member.name)\n }), (0, react_jsx_runtime.jsx)("img", {\n className: ActivityPanel_module_css_default.stateArt,\n "data-activity": member.activity,\n src: ACTION_ART[member.activity],\n alt: "",\n "aria-hidden": true\n })]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberInfo,\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberLine,\n children: [\n (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberName,\n children: member.name\n }),\n member.role !== "" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberRole,\n children: member.role\n }),\n memberModel !== "" && (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberModel,\n role: "img",\n "data-member-model": memberModel,\n title: memberModel,\n "aria-label": memberModel,\n children: compactModelLabel(memberModel)\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberState,\n "data-activity": member.activity,\n children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), discarded ? t("member.state.notCreated") : stopped ? t("member.state.stopped") : team.phase === "staged" ? t("member.state.staged") : memberStateLabel(member, team.tasks, historic, t)]\n })\n ]\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.memberStatusLine,\n children: discarded ? t("member.status.discarded") : stopped ? t("member.status.stopped") : team.phase === "staged" ? t("member.status.staged") : historic && owned.length > 0 && owned.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled") ? t("member.status.settled") : memberStatusText(member, team.tasks, t)\n })]\n }),\n (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.memberCount,\n children: [\n member.done,\n "/",\n member.total\n ]\n })\n ]\n }),\n (0, react_jsx_runtime.jsxs)("div", {\n className: ActivityPanel_module_css_default.assignmentLine,\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.assignmentLabel,\n children: t(discarded ? "assignment.discarded" : team.phase === "staged" ? "assignment.staged" : "assignment.label")\n }), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.assignmentTasks,\n children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.taskEmpty,\n children: t("assignment.empty")\n }) : owned.map((task) => {\n const model = taskModelLabel(task, team.members);\n const shortModel = compactModelLabel(model);\n return (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.assignmentChip,\n "data-state": discarded ? "cancelled" : taskTone(task.state, task.status),\n "data-task-model": model || void 0,\n title: taskTitle(task, model),\n children: task.state === "running" && shortModel !== "" ? `${task.id} \xB7 ${shortModel}` : task.id\n }, task.id);\n })\n })]\n })\n ]\n }, member.id || member.name);\n })]\n })\n ]\n }),\n (0, react_jsx_runtime.jsx)(DependencyMap, {\n tasks: team.tasks,\n members: team.members,\n t,\n discarded\n })\n ]\n }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {\n open: stopOpen,\n onClose: () => {\n if (!stopping) setStopOpen(false);\n },\n title: t("team.stopTitle", { team: team.name }),\n closeLabel: t("plan.cancel"),\n description: t("team.stopDescription", {\n tasks: unfinishedCount,\n members: busyCount\n }),\n footer: (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.stopModalActions,\n children: [(0, react_jsx_runtime.jsx)("button", {\n type: "button",\n disabled: stopping,\n onClick: () => {\n setStopOpen(false);\n },\n children: t("team.stopCancel")\n }), (0, react_jsx_runtime.jsxs)("button", {\n type: "button",\n "data-danger": true,\n disabled: stopping,\n onClick: () => {\n stopTeam();\n },\n children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconStopFill16, {}), stopping ? t("team.stopping") : t("team.stopConfirm")]\n })]\n }),\n children: stopError !== "" && (0, react_jsx_runtime.jsxs)("p", {\n className: ActivityPanel_module_css_default.stopModalError,\n role: "alert",\n children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, {}), stopError]\n })\n })] });\n }\n /** Legacy conversation cards may outlive their host archive. Project their\n * durable roster through the same rebuilt panel instead of a second UI. */\n function historicCardTeam(data, owner) {\n return {\n workspace: "",\n teamId: data.teamId,\n name: data.teamName,\n captainSessionId: data.captainSessionId || owner,\n phase: "running",\n members: data.members.map((member) => ({\n ...member,\n status: "removed",\n activity: "idle",\n progress: 0,\n done: 0,\n total: 0,\n currentTask: "",\n unread: 0\n })),\n tasks: [],\n messageCount: 0,\n captainInbox: []\n };\n }\n function ActivityPanel({ sessionsList, modelDirectories, openMember, t, conversationVisible = true }) {\n const navigateToSession = (parentId, childId) => {\n setOpen(false);\n setWasActive(false);\n openMember(parentId, childId);\n };\n const [open, setOpen] = (0, react.useState)(false);\n const [openOwner, setOpenOwner] = (0, react.useState)();\n const [autoOpened, setAutoOpened] = (0, react.useState)(false);\n const [wasActive, setWasActive] = (0, react.useState)(false);\n const [historic, setHistoric] = (0, react.useState)(/* @__PURE__ */ new Map());\n const [layout, setLayout] = (0, react.useState)(initialPanelLayout);\n const [bounds, setBounds] = (0, react.useState)(initialPanelBounds);\n const [interaction, setInteraction] = (0, react.useState)(null);\n const panelRef = (0, react.useRef)(null);\n const boundsRef = (0, react.useRef)(bounds);\n const gestureRef = (0, react.useRef)(null);\n const frameRef = (0, react.useRef)(null);\n const pendingLayoutRef = (0, react.useRef)(null);\n const current = (0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot).current;\n const autoOpenTrackerRef = (0, react.useRef)({\n sessionId: current,\n restoreComplete: false,\n liveTeamIds: /* @__PURE__ */ new Set()\n });\n const monitorTargets = (0, react.useSyncExternalStore)(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);\n const returnToComposer = () => {\n setOpen(false);\n setOpenOwner(void 0);\n window.requestAnimationFrame(() => {\n document.querySelector("[data-composer-card] [contenteditable=\\"true\\"][role=\\"textbox\\"], [data-composer-card] textarea")?.focus();\n });\n };\n const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);\n const currentTargets = (0, react.useMemo)(() => current === void 0 ? [] : monitorTargets.filter((target) => target.sessionId === current), [current, monitorTargets]);\n const currentRef = (0, react.useRef)(current);\n (0, react.useEffect)(() => {\n currentRef.current = current;\n }, [current]);\n const mountedAtRef = (0, react.useRef)(performance.now());\n const expanded = conversationVisible && activityPanelExpandedForSession(open, openOwner, current);\n const geometry = (0, react.useMemo)(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);\n const compact = compactPanelForBounds(bounds);\n const commitLayout = (0, react.useCallback)((next) => {\n setLayout(next);\n }, []);\n (0, react.useEffect)(() => {\n window.localStorage.setItem(PANEL_LAYOUT_STORAGE_KEY, JSON.stringify(layout));\n }, [layout]);\n (0, react.useLayoutEffect)(() => {\n const overlay = document.querySelector("[data-shell-overlay]");\n if (overlay === null) return;\n const conversation = document.querySelector("[data-phase=\'active\']");\n let frame = null;\n const measure = () => {\n frame = null;\n const overlayRect = overlay.getBoundingClientRect();\n const conversationRect = conversation?.getBoundingClientRect();\n const next = {\n width: overlayRect.width,\n height: overlayRect.height,\n anchorRight: conversationRect === void 0 ? overlayRect.width : Math.min(Math.max(conversationRect.right - overlayRect.left, 0), overlayRect.width)\n };\n const previous = boundsRef.current;\n if (previous.width === next.width && previous.height === next.height && previous.anchorRight === next.anchorRight) return;\n boundsRef.current = next;\n setBounds(next);\n };\n const scheduleMeasure = () => {\n frame ??= requestAnimationFrame(measure);\n };\n measure();\n const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(scheduleMeasure);\n observer?.observe(overlay);\n if (conversation !== null) observer?.observe(conversation);\n window.addEventListener("resize", scheduleMeasure);\n return () => {\n if (frame !== null) cancelAnimationFrame(frame);\n observer?.disconnect();\n window.removeEventListener("resize", scheduleMeasure);\n };\n }, [current]);\n (0, react.useLayoutEffect)(() => {\n const tracker = autoOpenTrackerRef.current;\n if (tracker.sessionId !== current) {\n tracker.sessionId = current;\n tracker.restoreComplete = false;\n tracker.liveTeamIds = /* @__PURE__ */ new Set();\n setWasActive(false);\n setAutoOpened(false);\n }\n if (openOwner === void 0 || openOwner === current) return;\n setOpen(false);\n setOpenOwner(void 0);\n }, [current, openOwner]);\n (0, react.useLayoutEffect)(() => {\n const root = document.documentElement;\n if (expanded && geometry.mode === "docked" && !compact) {\n root.setAttribute(PANEL_OPEN_ATTRIBUTE, "");\n root.style.setProperty(PANEL_SHIFT_PROPERTY, `${geometry.width + PANEL_CONVERSATION_GAP + 18}px`);\n } else {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n }\n return () => {\n root.removeAttribute(PANEL_OPEN_ATTRIBUTE);\n root.style.removeProperty(PANEL_SHIFT_PROPERTY);\n };\n }, [\n compact,\n expanded,\n geometry.mode,\n geometry.width\n ]);\n (0, react.useEffect)(() => {\n if (current === void 0) return;\n const controller = startActivityPolling(currentTargets, { discoverySessionId: current });\n let active = true;\n const tracker = autoOpenTrackerRef.current;\n if (tracker.sessionId === current && !tracker.restoreComplete) controller.firstTick.then(() => {\n const latest = autoOpenTrackerRef.current;\n if (!active || latest.sessionId !== current || latest.restoreComplete) return;\n latest.liveTeamIds = new Set(getActivitySnapshotsSnapshot().teams.filter((team) => team.captainSessionId === current).map((team) => team.teamId));\n latest.restoreComplete = true;\n });\n return () => {\n active = false;\n controller.stop();\n };\n }, [current, currentTargets]);\n (0, react.useEffect)(() => {\n const onOpenPanel = (event) => {\n const activeSession = currentRef.current;\n if (activeSession === void 0) return;\n setOpenOwner(activeSession);\n setOpen(true);\n const detail = event.detail;\n if (detail?.teamId !== void 0) {\n const owner = detail.captainSessionId !== "" ? detail.captainSessionId : currentRef.current ?? "";\n const teamKey = `${owner}:${detail.teamId}`;\n setHistoric((previous) => {\n const next = new Map(previous);\n next.set(teamKey, {\n data: detail,\n owner\n });\n return next;\n });\n }\n };\n window.addEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n return () => {\n window.removeEventListener(OPEN_PANEL_EVENT, onOpenPanel);\n };\n }, []);\n const visibleTeams = (0, react.useMemo)(() => current === void 0 ? [] : teams.filter((team) => team.captainSessionId === current), [teams, current]);\n const visibleHistoric = (0, react.useMemo)(() => current === void 0 ? [] : [...historic.values()].filter(({ data, owner }) => owner === current && !teams.some((live) => live.captainSessionId === current && live.teamId === data.teamId) && !archivedTeams.some((archived) => archived.captainSessionId === current && archived.teamId === data.teamId)), [\n historic,\n current,\n teams,\n archivedTeams\n ]);\n const visibleArchived = (0, react.useMemo)(() => current === void 0 ? [] : archivedTeams.filter((team) => team.captainSessionId === current && !teams.some((live) => live.captainSessionId === current && live.teamId === team.teamId)), [\n archivedTeams,\n current,\n teams\n ]);\n const visibleCount = visibleTeams.length + visibleArchived.length + visibleHistoric.length;\n const visibleLiveTeamIds = (0, react.useMemo)(() => visibleTeams.map((team) => team.teamId).sort(), [visibleTeams]);\n (0, react.useEffect)(() => {\n const tracker = autoOpenTrackerRef.current;\n const settled = performance.now() - mountedAtRef.current >= AUTO_OPEN_SETTLE_MS;\n const shouldAutoExpand = tracker.sessionId === current && activityPanelShouldAutoExpand({\n alreadyAutoOpened: autoOpened,\n pageSettled: settled,\n restoreComplete: tracker.restoreComplete,\n previousLiveTeamIds: tracker.liveTeamIds,\n currentLiveTeamIds: visibleLiveTeamIds\n });\n if (tracker.sessionId === current && tracker.restoreComplete) tracker.liveTeamIds = new Set(visibleLiveTeamIds);\n if (visibleCount > 0) {\n setWasActive(true);\n if (shouldAutoExpand) {\n setOpenOwner(current);\n setOpen(true);\n setAutoOpened(true);\n }\n return;\n }\n if (!wasActive) return;\n const timer = setTimeout(() => {\n setOpen(false);\n setOpenOwner(void 0);\n setWasActive(false);\n setAutoOpened(false);\n }, AUTOCLOSE_GRACE_MS);\n return () => {\n clearTimeout(timer);\n };\n }, [\n visibleCount,\n visibleLiveTeamIds.join("\\0"),\n autoOpened,\n wasActive,\n current\n ]);\n const busy = (0, react.useMemo)(() => visibleTeams.some((team) => team.members.some((member) => member.activity === "working")), [visibleTeams]);\n const hasTeams = visibleCount > 0;\n const panelGeometryForGesture = (0, react.useCallback)(() => {\n const measuredHeight = panelRef.current?.getBoundingClientRect().height;\n if (measuredHeight === void 0 || measuredHeight <= 0) return geometry;\n return {\n ...geometry,\n height: measuredHeight\n };\n }, [geometry]);\n const flushScheduledLayout = (0, react.useCallback)(() => {\n if (frameRef.current !== null) {\n cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null) commitLayout(pending);\n }, [commitLayout]);\n const scheduleLayout = (0, react.useCallback)((next) => {\n pendingLayoutRef.current = next;\n frameRef.current ??= requestAnimationFrame(() => {\n frameRef.current = null;\n const pending = pendingLayoutRef.current;\n pendingLayoutRef.current = null;\n if (pending !== null) commitLayout(pending);\n });\n }, [commitLayout]);\n (0, react.useEffect)(() => () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n }, []);\n const beginMove = (0, react.useCallback)((event) => {\n if (compact || event.button !== 0 || event.target.closest("button") !== null) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: "move",\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: false\n };\n }, [compact, panelGeometryForGesture]);\n const beginResize = (0, react.useCallback)((edge, event) => {\n if (compact || event.button !== 0 || geometry.mode === "docked" && edge !== "left") return;\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n gestureRef.current = {\n kind: "resize",\n edge,\n pointerId: event.pointerId,\n originX: event.clientX,\n originY: event.clientY,\n start: panelGeometryForGesture(),\n activated: true\n };\n setInteraction("resizing");\n }, [\n compact,\n geometry.mode,\n panelGeometryForGesture\n ]);\n const updateGesture = (0, react.useCallback)((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId || !event.currentTarget.hasPointerCapture(event.pointerId)) return;\n const dx = event.clientX - gesture.originX;\n const dy = event.clientY - gesture.originY;\n const activeBounds = boundsRef.current;\n if (gesture.kind === "move") {\n if (!gesture.activated && Math.hypot(dx, dy) < MOVE_THRESHOLD) return;\n if (!gesture.activated) {\n gesture.activated = true;\n setInteraction("dragging");\n }\n scheduleLayout(movePanelLayout(floatPanelLayout(gesture.start, activeBounds), dx, dy, activeBounds));\n return;\n }\n scheduleLayout(resizePanelLayout(gesture.start, gesture.edge ?? "left", dx, dy, activeBounds));\n }, [scheduleLayout]);\n const endGesture = (0, react.useCallback)((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId) return;\n updateGesture(event);\n flushScheduledLayout();\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout, updateGesture]);\n const cancelGesture = (0, react.useCallback)((event) => {\n const gesture = gestureRef.current;\n if (gesture === null || gesture.pointerId !== event.pointerId) return;\n flushScheduledLayout();\n gestureRef.current = null;\n setInteraction(null);\n }, [flushScheduledLayout]);\n const toggleDock = (0, react.useCallback)(() => {\n const liveGeometry = panelGeometryForGesture();\n commitLayout(liveGeometry.mode === "docked" ? floatPanelLayout(liveGeometry, boundsRef.current) : dockPanelLayout(liveGeometry, boundsRef.current));\n }, [commitLayout, panelGeometryForGesture]);\n const autoHeight = panelUsesAutoHeight(geometry, bounds);\n const panelStyle = {\n width: geometry.width,\n height: autoHeight ? "auto" : geometry.height,\n maxHeight: panelMaximumHeight(geometry, bounds),\n transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`\n };\n if (!conversationVisible || !hasTeams && !expanded) return null;\n return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {\n count: visibleCount,\n busy,\n t,\n onClick: () => {\n if (current === void 0) return;\n setOpenOwner(current);\n setOpen(true);\n }\n }), expanded && (0, react_jsx_runtime.jsxs)("aside", {\n ref: panelRef,\n className: ActivityPanel_module_css_default.panel,\n style: panelStyle,\n "data-t-team-activity": true,\n "data-panel-mode": geometry.mode,\n "data-height-mode": autoHeight ? "auto" : "manual",\n "data-compact": compact || void 0,\n "data-dragging": interaction === "dragging" || void 0,\n "data-resizing": interaction === "resizing" || void 0,\n "aria-label": t("activity.panelAria"),\n children: [\n (0, react_jsx_runtime.jsxs)("header", {\n className: ActivityPanel_module_css_default.panelHead,\n onPointerDown: beginMove,\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "data-drag-handle": !compact || void 0,\n children: [(0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.panelTitle,\n children: [t("activity.title"), (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.panelDot,\n "data-busy": busy,\n "aria-hidden": true\n })]\n }), (0, react_jsx_runtime.jsxs)("span", {\n className: ActivityPanel_module_css_default.panelControls,\n children: [!compact && (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.iconButton,\n "data-control": "dock",\n "data-mode": geometry.mode,\n onClick: toggleDock,\n "aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),\n title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),\n children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})\n }), (0, react_jsx_runtime.jsx)("button", {\n type: "button",\n className: ActivityPanel_module_css_default.iconButton,\n "data-control": "collapse",\n onClick: () => {\n setOpen(false);\n setOpenOwner(void 0);\n },\n "aria-label": t("activity.collapse"),\n title: t("activity.collapse"),\n children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})\n })]\n })]\n }),\n (0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.teams,\n children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.emptyHint,\n children: t("activity.empty")\n }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [\n visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {\n team,\n modelDirectory: team.phase === "staged" ? modelDirectories.directoryFor(team.captainSessionId) : void 0,\n onContinuePlanning: returnToComposer,\n onDiscarded: returnToComposer,\n onNavigate: navigateToSession,\n t\n }, team.teamId)),\n visibleArchived.map((team) => (0, react_jsx_runtime.jsxs)("div", {\n "data-team-id": team.teamId,\n "data-historic": true,\n className: ActivityPanel_module_css_default.archivedWrap,\n children: [(0, react_jsx_runtime.jsx)("span", {\n className: ActivityPanel_module_css_default.archiveLabel,\n children: t(team.phase === "staged" ? "archive.discardedLabel" : "archive.label")\n }), (0, react_jsx_runtime.jsx)(TeamSection, {\n team,\n onNavigate: navigateToSession,\n t,\n historic: true\n })]\n }, `${team.captainSessionId}:${team.teamId}`)),\n visibleHistoric.map(({ data: team, owner }) => {\n const teamKey = `${owner}:${team.teamId}`;\n return (0, react_jsx_runtime.jsx)(TeamSection, {\n team: historicCardTeam(team, owner),\n onNavigate: navigateToSession,\n t,\n historic: true\n }, teamKey);\n })\n ] })\n }),\n !compact && (0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.resizeHandle,\n "data-resize-edge": "left",\n onPointerDown: (event) => {\n beginResize("left", event);\n },\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "aria-hidden": true\n }),\n !compact && geometry.mode === "floating" && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.resizeHandle,\n "data-resize-edge": "bottom",\n onPointerDown: (event) => {\n beginResize("bottom", event);\n },\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "aria-hidden": true\n }), (0, react_jsx_runtime.jsx)("div", {\n className: ActivityPanel_module_css_default.resizeHandle,\n "data-resize-edge": "corner",\n onPointerDown: (event) => {\n beginResize("corner", event);\n },\n onPointerMove: updateGesture,\n onPointerUp: endGesture,\n onPointerCancel: cancelGesture,\n "aria-hidden": true\n })] })\n ]\n })] });\n }\n\n\n /**\n * T Team conversation card: a lightweight in-conversation summary shown\n * when a team is created \u2014 the captain\'s name, the member roster with whale\n * avatars, and an entry point that re-activates the top-right activity\n * panel (useful after the floater was closed, or when re-opening an old\n * session for review).\n *\n * The fold anchors to the Harness\'s durable `tool/call` + `tool/result`\n * records for `t_team_create`. Those are first-party session events, so\n * the card survives restarts without writing an out-of-repo event type.\n * @module t-team/client/card\n */\n /** Parse the only create-call fields the historic card owns. */\n function parseTTeamCreateArgs(value) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed !== "object" || parsed === null || !("name" in parsed) || typeof parsed.name !== "string") return;\n const name = parsed.name.trim();\n if (name === "") return void 0;\n const cleaned = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");\n return {\n teamId: cleaned === "" ? "team" : cleaned,\n name\n };\n } catch {\n return;\n }\n }\n /** Durable first-party tool events folded into one keyed Chat node. */\n const tTeamCardDefinition = {\n kind: "t-team",\n target: "chat",\n match: (event) => {\n if (event.type === "tool/call" && event.data.name === "t_team_create") return parseTTeamCreateArgs(event.data.arguments) === void 0 ? null : {\n id: String(event.data.callId),\n role: "start"\n };\n if (event.type === "tool/result" && event.data.message.source.kind === "tool") return {\n id: String(event.data.message.source.callId),\n role: "update"\n };\n return null;\n },\n start: (_context, match) => {\n if (match.event.type !== "tool/call") throw new Error("t-team card start requires t_team_create tool/call");\n const parsed = parseTTeamCreateArgs(match.event.data.arguments);\n if (parsed === void 0) throw new Error("t-team card start requires valid create arguments");\n return {\n ...parsed,\n accepted: false\n };\n },\n update: (context, match) => {\n if (match.event.type !== "tool/result") return context.state;\n if (match.event.data.error !== void 0 || match.event.data.message.content.some((block) => block.type === "tool-result" && block.isError === true)) return context.state;\n return {\n ...context.state,\n accepted: true\n };\n },\n buildViewNode: (context) => {\n if (context.start === void 0) return null;\n const state = context.state;\n if (!state.accepted) return null;\n return {\n key: context.key,\n kind: "t-team",\n id: context.id,\n target: "chat",\n anchorSeq: context.start.event.seq,\n location: context.start.location,\n visibility: "visible",\n data: {\n teamId: state.teamId,\n captainSessionId: "",\n teamName: state.name,\n members: []\n }\n };\n }\n };\n\n\n /** `tTeam` namespace dictionaries for every plugin-owned Web surface. */\n /** Dictionary namespace owned by the T Team client plugin. */\n const T_TEAM_LOCALE_NAMESPACE = "tTeam";\n /** Simplified Chinese dictionary (the key-set source of truth). */\n const zh = {\n "card.memberCount": "{count} \u540D\u6210\u5458",\n "action.openActivityPanel": "\u6253\u5F00\u6D3B\u52A8\u9762\u677F",\n "activity.panelButton": "\u6D3B\u52A8\u9762\u677F",\n "activity.badgeAria": "T\u4E13\u5BB6 \u56E2\u961F\u6D3B\u52A8\u4E0E\u5386\u53F2\uFF0C{count} \u6761\u56E2\u961F\u8BB0\u5F55",\n "activity.panelAria": "T\u4E13\u5BB6 \u56E2\u961F\u6D3B\u52A8\u9762\u677F",\n "activity.title": "T\u4E13\u5BB6 \u56E2\u961F\u6D3B\u52A8",\n "activity.float": "\u5207\u6362\u4E3A\u6D6E\u52A8\u9762\u677F",\n "activity.dockRight": "\u505C\u9760\u5230\u53F3\u4FA7",\n "activity.collapse": "\u6536\u8D77\u6D3B\u52A8\u9762\u677F",\n "activity.empty": "\u6682\u65E0\u56E2\u961F\u6D3B\u52A8",\n "team.stop": "\u505C\u6B62\u56E2\u961F",\n "team.stopped": "\u5DF2\u505C\u6B62",\n "team.stopTitle": "\u786E\u8BA4\u505C\u6B62\u201C{team}\u201D\uFF1F",\n "team.stopDescription": "\u5C06\u53D6\u6D88 {tasks} \u9879\u672A\u5B8C\u6210\u4EFB\u52A1\uFF0C\u5E76\u505C\u6B62 {members} \u540D\u6B63\u5728\u5DE5\u4F5C\u7684\u6210\u5458\u3002\u5DF2\u5B8C\u6210\u7684\u7ED3\u679C\u4F1A\u4FDD\u7559\u3002",\n "team.stopCancel": "\u7EE7\u7EED\u8FD0\u884C",\n "team.stopConfirm": "\u786E\u8BA4\u505C\u6B62",\n "team.stopping": "\u6B63\u5728\u505C\u6B62\u2026",\n "team.stopFailed": "\u505C\u6B62\u5931\u8D25\uFF1A{message}",\n "team.stopRequestFailed": "\u670D\u52A1\u5668\u672A\u80FD\u505C\u6B62\u56E2\u961F\uFF0C\u8BF7\u91CD\u8BD5",\n "team.discarded": "\u5DF2\u653E\u5F03",\n "format.listSeparator": "\u3001",\n "task.status.pending": "\u5F85\u9886\u53D6",\n "task.status.claimed": "\u5DF2\u8BA4\u9886",\n "task.status.inProgress": "\u8FDB\u884C\u4E2D",\n "task.status.completed": "\u5DF2\u5B8C\u6210",\n "task.status.failed": "\u5931\u8D25",\n "task.status.cancelled": "\u5DF2\u53D6\u6D88",\n "task.status.notRun": "\u672A\u6267\u884C",\n "member.state.working": "\u5DE5\u4F5C\u4E2D",\n "member.state.failed": "\u6709\u5931\u8D25",\n "member.state.waiting": "\u7B49\u5F85",\n "member.state.delivered": "\u5DF2\u4EA4\u4ED8",\n "member.state.left": "\u5DF2\u79BB\u961F",\n "member.state.removed": "\u5DF2\u79FB\u9664",\n "member.state.pending": "\u5F85\u6267\u884C",\n "member.state.unassigned": "\u5F85\u6D3E\u5DE5",\n "member.state.staged": "\u5F85\u521B\u5EFA",\n "member.state.notCreated": "\u672A\u521B\u5EFA",\n "member.state.stopped": "\u5DF2\u505C\u6B62",\n "member.status.executing": "\u6B63\u5728\u6267\u884C {taskId}",\n "member.status.executingModel": "\u6B63\u5728\u6267\u884C {taskId} \xB7 {model}",\n "member.status.working": "\u6B63\u5728\u5904\u7406\u5DF2\u6D3E\u4EFB\u52A1",\n "member.status.waitingOn": "\u7B49\u5F85 {taskId} \xB7 {assignee}",\n "member.status.waitingPrerequisite": "\u7B49\u5F85\u524D\u7F6E\u4EFB\u52A1",\n "member.status.waitingAssignment": "\u7B49\u5F85\u961F\u957F\u6D3E\u5DE5",\n "member.status.delivered": "\u4EFB\u52A1\u5DF2\u4EA4\u4ED8",\n "member.status.idle": "\u5F85\u7EE7\u7EED\u6267\u884C",\n "member.status.unknown": "\u72B6\u6001\u672A\u77E5",\n "member.status.staged": "\u786E\u8BA4\u540E\u521B\u5EFA\u5E76\u542F\u52A8",\n "member.status.settled": "\u4EFB\u52A1\u5747\u5DF2\u7EC8\u7ED3",\n "member.status.discarded": "\u8BA1\u5212\u5DF2\u653E\u5F03\uFF0C\u672A\u521B\u5EFA",\n "member.status.stopped": "\u56E2\u961F\u5DF2\u505C\u6B62\uFF0C\u9700\u663E\u5F0F\u6062\u590D",\n "task.assignee.unclaimed": "\u5F85\u8BA4\u9886",\n "task.summary.waitingBreakdown": "\u7B49\u5F85\u961F\u957F\u62C6\u89E3\u4EFB\u52A1",\n "task.summary.staged": "{count} \u9879\u8BA1\u5212\u7B49\u5F85\u786E\u8BA4",\n "task.summary.discarded": "{count} \u9879\u8BA1\u5212\u5DF2\u653E\u5F03\uFF0C\u5747\u672A\u6267\u884C",\n "task.summary.allDelivered": "\u5168\u90E8 {count} \u9879\u4EFB\u52A1\u5DF2\u4EA4\u4ED8",\n "task.summary.ended": "\u7EC8\u6001\uFF1A{completed} \u5DF2\u4EA4\u4ED8 \xB7 {cancelled} \u5DF2\u53D6\u6D88 \xB7 {failed} \u5931\u8D25",\n "task.summary.blockedAndRunning": "{tasks}{more} \u7B49\u5F85\u524D\u7F6E\uFF0C\u5176\u4F59\u5DF2\u5F00\u5DE5",\n "task.summary.more": " \u7B49 {count} \u9879",\n "task.summary.running": "{tasks} \u6B63\u5728\u6267\u884C",\n "task.summary.ready": "{tasks} \u5DF2\u5C31\u7EEA\u5F85\u5F00\u5DE5",\n "task.summary.blocked": "{tasks} \u7B49\u5F85\u524D\u7F6E",\n "task.summary.failedSettled": "{count} \u9879\u5DF2\u5931\u8D25\uFF0C\u81EA\u52A8\u5FAA\u73AF\u5DF2\u505C\u6B62",\n "task.summary.waitingSchedule": "\u7B49\u5F85\u4E0B\u4E00\u8F6E\u8C03\u5EA6",\n "progress.aria": "\u56E2\u961F\u603B\u8FDB\u5EA6",\n "progress.title": "\u603B\u8FDB\u5EA6",\n "progress.running": "\u25A0 \u8FDB\u884C\u4E2D {count}",\n "progress.blocked": "\u25A0 \u7B49\u5F85\u4F9D\u8D56 {count}",\n "progress.delivered": "\u25A0 \u5DF2\u4EA4\u4ED8 {count}",\n "dependency.aria": "\u4EFB\u52A1\u4F9D\u8D56\u94FE",\n "dependency.parallel": "\u5E76\u884C\u4EFB\u52A1",\n "dependency.title": "\u4EFB\u52A1\u4F9D\u8D56",\n "dependency.hint.parallel": "\u65E0\u524D\u540E\u4F9D\u8D56 \xB7 \u70B9\u51FB\u67E5\u770B\u8BE6\u60C5",\n "dependency.hint.chain": "\u60AC\u505C\u9AD8\u4EAE\u4F9D\u8D56\u94FE \xB7 \u70B9\u51FB\u56FA\u5B9A",\n "dependency.hint.pinned": "{taskId} \u5DF2\u56FA\u5B9A \xB7 Esc \u53D6\u6D88",\n "task.runningAria": "\u8FD0\u884C\u4E2D",\n "task.model": "{model}",\n "task.detail.completed": "\u5DF2\u5B8C\u6210\u5E76\u4EA4\u4ED8",\n "task.detail.noPrerequisite": "\u65E0\u524D\u7F6E\uFF0C\u53EF\u7ACB\u5373\u5F00\u5DE5",\n "task.detail.ready": "\u524D\u7F6E\u5DF2\u5C31\u7EEA\uFF0C\u53EF\u5F00\u5DE5",\n "task.detail.waitingOn": "\u7B49\u5F85 {tasks}",\n "task.detail.notRun": "\u8BA1\u5212\u5DF2\u653E\u5F03\uFF0C\u4EFB\u52A1\u672A\u6267\u884C",\n "task.detail.noDownstream": "\u65E0\u4E0B\u6E38\u4EFB\u52A1",\n "task.detail.unlocks": "\u5B8C\u6210\u540E\u89E3\u9501 {tasks}",\n "team.ended": "\u5DF2\u7ED3\u675F",\n "plan.badge": "\u5F85\u786E\u8BA4",\n "plan.title": "\u6267\u884C\u524D\u8BA1\u5212\u5BA1\u67E5",\n "plan.description": "\u6210\u5458\u5C1A\u672A\u521B\u5EFA\u3001\u4EFB\u52A1\u5C1A\u672A\u8C03\u5EA6\u3002\u53EF\u76F4\u63A5\u8C03\u6574\u8BA1\u5212\uFF0C\u4E5F\u53EF\u8FD4\u56DE\u5BF9\u8BDD\u544A\u8BC9\u961F\u957F\u54EA\u91CC\u9700\u8981\u4FEE\u6539\u3002",\n "plan.member.role": "\u89D2\u8272",\n "plan.member.provider": "Provider",\n "plan.member.model": "\u6A21\u578B",\n "plan.member.reasoning": "\u63A8\u7406\u7B49\u7EA7",\n "plan.member.reasoningHint": "\u7559\u7A7A\u4F7F\u7528\u9ED8\u8BA4\u503C\uFF1B\u53EF\u7528 low\u3001medium\u3001high\u3001xhigh \u7B49",\n "plan.model.choose": "\u9009\u62E9\u6A21\u578B",\n "plan.model.currentUnavailable": "{provider}/{model}\uFF08\u5F53\u524D\u76EE\u5F55\u4E0D\u53EF\u7528\uFF09",\n "plan.model.route": "\u8DEF\u7531\uFF1A{provider}/{model}",\n "plan.model.defaultReasoning": "\u9ED8\u8BA4\u63A8\u7406\u7B49\u7EA7",\n "plan.model.providerDefault": "Provider \u9ED8\u8BA4\u503C",\n "plan.model.modelDefault": "\u6A21\u578B\u9ED8\u8BA4\u503C\uFF08{effort}\uFF09",\n "plan.model.triggerAria": "\u9009\u62E9\u6210\u5458\u6A21\u578B\uFF0C\u5F53\u524D {model}\uFF0C\u63A8\u7406\u7B49\u7EA7 {effort}",\n "plan.model.back": "\u8FD4\u56DE",\n "plan.model.loading": "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B\u2026",\n "plan.model.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u578B",\n "plan.model.partialFailure": "{count} \u4E2A Provider \u7684\u6A21\u578B\u76EE\u5F55\u52A0\u8F7D\u5931\u8D25",\n "plan.model.retry": "\u91CD\u8BD5",\n "plan.member.prompt": "\u89D2\u8272\u63D0\u793A\u8BCD",\n "plan.member.roleFallback": "\u672A\u8BBE\u7F6E\u89D2\u8272",\n "plan.task.subject": "\u4EFB\u52A1\u540D\u79F0",\n "plan.task.description": "\u4EFB\u52A1\u8BF4\u660E",\n "plan.task.assignee": "\u8D1F\u8D23\u4EBA",\n "plan.task.dependencies": "\u4F9D\u8D56\u4EFB\u52A1 ID\uFF08\u9017\u53F7\u5206\u9694\uFF09",\n "plan.task.dependenciesHint": "\u4F8B\u5982 task-1, task-2\uFF1B\u4E0D\u5F97\u5F62\u6210\u5FAA\u73AF\u4F9D\u8D56",\n "plan.task.unassigned": "\u5171\u4EAB\u4EFB\u52A1\u6C60",\n "plan.unsaved": "\u672A\u4FDD\u5B58",\n "plan.save": "\u4FDD\u5B58",\n "plan.saving": "\u4FDD\u5B58\u4E2D\u2026",\n "plan.remove": "\u5220\u9664",\n "plan.removed": "\u4EFB\u52A1\u5DF2\u5220\u9664",\n "plan.removeConfirm": "\u786E\u8BA4\u5220\u9664",\n "plan.removeWarning": "\u5220\u9664 {task} \u540E\u5C06\u91CD\u65B0\u8BA1\u7B97\u4F9D\u8D56\u5173\u7CFB\u3002",\n "plan.cancel": "\u53D6\u6D88",\n "plan.addTask": "\u6DFB\u52A0\u4EFB\u52A1",\n "plan.adding": "\u6DFB\u52A0\u4E2D\u2026",\n "plan.taskAdded": "\u4EFB\u52A1\u5DF2\u6DFB\u52A0",\n "plan.newTask": "\u65B0\u4EFB\u52A1\u540D\u79F0",\n "plan.newTaskLabel": "\u65B0\u589E\u8BA1\u5212\u4EFB\u52A1",\n "plan.readySummary": "{members} \u540D\u6210\u5458 \xB7 {tasks} \u9879\u4EFB\u52A1 \xB7 {links} \u6761\u4F9D\u8D56",\n "plan.flow.aria": "\u56E2\u961F\u542F\u52A8\u6D41\u7A0B",\n "plan.flow.review": "\u5BA1\u67E5\u8BA1\u5212",\n "plan.flow.spawn": "\u521B\u5EFA\u6210\u5458",\n "plan.flow.run": "\u5F00\u59CB\u6267\u884C",\n "plan.members.title": "\u6210\u5458\u4E0E\u6A21\u578B\u8DEF\u7531",\n "plan.members.count": "{count} \u540D\u6210\u5458",\n "plan.members.empty": "\u5C1A\u672A\u89C4\u5212\u6210\u5458",\n "plan.tasks.title": "\u4EFB\u52A1\u4E0E\u4F9D\u8D56",\n "plan.tasks.count": "{count} \u9879\u4EFB\u52A1 \xB7 {links} \u6761\u4F9D\u8D56",\n "plan.tasks.empty": "\u5C1A\u672A\u89C4\u5212\u4EFB\u52A1",\n "plan.dependencies.none": "\u65E0\u4F9D\u8D56",\n "plan.dependencies.count": "{count} \u6761\u4F9D\u8D56",\n "plan.approve": "\u786E\u8BA4\u5E76\u542F\u52A8\u56E2\u961F",\n "plan.approving": "\u6B63\u5728\u521B\u5EFA\u6210\u5458\u2026",\n "plan.approveTitle": "\u8BA1\u5212\u68C0\u67E5\u5B8C\u6BD5\uFF1F",\n "plan.approveHint": "\u786E\u8BA4\u540E\u5C06\u521B\u5EFA {members} \u540D\u6210\u5458\u5E76\u8C03\u5EA6 {tasks} \u9879\u4EFB\u52A1\u3002",\n "plan.approveConfirmTitle": "\u786E\u8BA4\u542F\u52A8\u6B64\u56E2\u961F",\n "plan.approveWarning": "\u542F\u52A8\u540E\u4E0D\u80FD\u518D\u5728\u6B64\u5904\u7F16\u8F91\u6210\u5458\u548C\u4F9D\u8D56\u3002",\n "plan.approveConfirm": "\u786E\u8BA4\u542F\u52A8",\n "plan.continue": "\u8FD4\u56DE\u5BF9\u8BDD\u4FEE\u6539",\n "plan.returnToChat": "\u56DE\u5230\u5BF9\u8BDD",\n "plan.feedbackTitle": "\u6B63\u5728\u7B49\u4F60\u8BF4\u660E\u4FEE\u6539\u65B9\u5411",\n "plan.feedbackHint": "\u961F\u957F\u4F1A\u5728\u5BF9\u8BDD\u4E2D\u8FFD\u95EE\uFF1B\u6536\u5230\u4F60\u7684\u56DE\u590D\u540E\uFF0C\u53EA\u4FEE\u6539\u8FD9\u4EFD\u8349\u6848\u5E76\u518D\u6B21\u7B49\u5F85\u786E\u8BA4\u3002",\n "plan.discard": "\u653E\u5F03\u672C\u6B21\u8BA1\u5212",\n "plan.discardConfirmTitle": "\u653E\u5F03\u672C\u6B21\u8BA1\u5212\uFF1F",\n "plan.discardWarning": "\u8BE5\u8BA1\u5212\u4F1A\u7ED3\u675F\u5E76\u5F52\u6863\uFF1B\u5C1A\u672A\u521B\u5EFA\u4EFB\u4F55\u6210\u5458\uFF0C\u4E5F\u4E0D\u4F1A\u6267\u884C\u4EFB\u52A1\u3002",\n "plan.discardConfirm": "\u786E\u8BA4\u653E\u5F03",\n "plan.discarding": "\u6B63\u5728\u653E\u5F03\u2026",\n "plan.pendingEdits": "\u8BF7\u5148\u4FDD\u5B58\u5F53\u524D\u4FEE\u6539\uFF0C\u518D\u542F\u52A8\u56E2\u961F\u3002",\n "plan.saved": "\u8BA1\u5212\u5DF2\u4FDD\u5B58",\n "plan.failed": "\u64CD\u4F5C\u5931\u8D25\uFF1A{message}",\n "team.stats.members": "{count} \u540D\u6210\u5458",\n "team.stats.completed": "{completed}/{total} \u5B8C\u6210",\n "team.stats.messages": "{count} \u6761\u6D88\u606F",\n "delegation.aria": "\u961F\u957F\u6D3E\u5DE5\u5173\u7CFB",\n "captain.name": "\u961F\u957F",\n "captain.role": "\u62C6\u89E3 \xB7 \u6D3E\u53D1 \xB7 \u6C47\u603B",\n "captain.summary": "\u5DF2\u6D3E\u53D1 {tasks} \u9879\u4EFB\u52A1\u7ED9 {members} \u540D\u6210\u5458",\n "captain.summary.staged": "\u5DF2\u89C4\u5212 {tasks} \u9879\u4EFB\u52A1\u4E0E {members} \u540D\u6210\u5458\uFF0C\u7B49\u5F85\u786E\u8BA4",\n "captain.summary.awaitingFeedback": "\u8349\u6848\u5DF2\u4FDD\u7559\uFF0C\u7B49\u5F85\u4F60\u5728\u5BF9\u8BDD\u4E2D\u8BF4\u660E\u4FEE\u6539\u65B9\u5411",\n "captain.summary.discarded": "\u8BA1\u5212\u5DF2\u653E\u5F03\uFF1A{members} \u540D\u6210\u5458\u672A\u521B\u5EFA\uFF0C{tasks} \u9879\u4EFB\u52A1\u672A\u6267\u884C",\n "captain.summary.withTakeover": "\u5DF2\u6D3E\u53D1 {tasks} \u9879\u7ED9\u6210\u5458 \xB7 \u961F\u957F\u63A5\u7BA1 {captainTasks}",\n "captain.state.working": "{count} \u4EBA\u6267\u884C\u4E2D",\n "captain.state.takeover": "\u6B63\u5728\u6267\u884C {tasks}",\n "captain.state.collected": "\u5DF2\u6536\u9F50",\n "captain.state.waiting": "\u7B49\u5F85\u56DE\u62A5",\n "captain.state.staged": "\u5F85\u786E\u8BA4",\n "captain.state.awaitingFeedback": "\u5F85\u53CD\u9988",\n "captain.state.discarded": "\u5DF2\u653E\u5F03",\n "captain.state.settled": "\u5DF2\u7EC8\u7ED3",\n "members.toggle": "{count} \u540D\u6210\u5458",\n "members.collapse": "\u6536\u8D77",\n "members.expand": "\u5C55\u5F00",\n "members.empty": "\u6682\u65E0\u6210\u5458\uFF0C\u7B49\u5F85\u961F\u957F\u7EC4\u5EFA\u56E2\u961F",\n "assignment.label": "\u961F\u957F\u6D3E\u53D1",\n "assignment.staged": "\u8BA1\u5212\u4EFB\u52A1",\n "assignment.discarded": "\u672A\u6267\u884C\u7684\u8BA1\u5212",\n "assignment.empty": "\u6682\u65E0\u4EFB\u52A1",\n "archive.label": "\u5DF2\u7ED3\u675F \xB7 \u5386\u53F2\u5F52\u6863",\n "archive.discardedLabel": "\u8BA1\u5212\u5DF2\u653E\u5F03 \xB7 \u5386\u53F2\u5F52\u6863"\n };\n /** English dictionary, checked complete against the Chinese source key set. */\n const en = {\n "card.memberCount": "{count} members",\n "action.openActivityPanel": "Open activity panel",\n "activity.panelButton": "Activity panel",\n "activity.badgeAria": "T Team activity and history, {count} team records",\n "activity.panelAria": "T Team activity panel",\n "activity.title": "T Team activity",\n "activity.float": "Switch to floating panel",\n "activity.dockRight": "Dock to the right",\n "activity.collapse": "Collapse activity panel",\n "activity.empty": "No team activity",\n "team.stop": "Stop team",\n "team.stopped": "Stopped",\n "team.stopTitle": "Stop \u201C{team}\u201D?",\n "team.stopDescription": "This cancels {tasks} unfinished tasks and stops {members} working members. Completed results are kept.",\n "team.stopCancel": "Keep running",\n "team.stopConfirm": "Stop team",\n "team.stopping": "Stopping\u2026",\n "team.stopFailed": "Could not stop team: {message}",\n "team.stopRequestFailed": "The server could not stop this team. Try again.",\n "team.discarded": "Discarded",\n "format.listSeparator": ", ",\n "task.status.pending": "Unclaimed",\n "task.status.claimed": "Claimed",\n "task.status.inProgress": "In progress",\n "task.status.completed": "Completed",\n "task.status.failed": "Failed",\n "task.status.cancelled": "Cancelled",\n "task.status.notRun": "Not run",\n "member.state.working": "Working",\n "member.state.failed": "Has failures",\n "member.state.waiting": "Waiting",\n "member.state.delivered": "Delivered",\n "member.state.left": "Left team",\n "member.state.removed": "Removed",\n "member.state.pending": "Pending",\n "member.state.unassigned": "Awaiting assignment",\n "member.state.staged": "Not spawned",\n "member.state.notCreated": "Not created",\n "member.state.stopped": "Stopped",\n "member.status.executing": "Working on {taskId}",\n "member.status.executingModel": "Working on {taskId} \xB7 {model}",\n "member.status.working": "Working on assigned tasks",\n "member.status.waitingOn": "Waiting for {taskId} \xB7 {assignee}",\n "member.status.waitingPrerequisite": "Waiting for prerequisites",\n "member.status.waitingAssignment": "Waiting for the captain to assign work",\n "member.status.delivered": "Tasks delivered",\n "member.status.idle": "Ready to continue",\n "member.status.unknown": "Status unknown",\n "member.status.staged": "Will be spawned after approval",\n "member.status.settled": "All assigned work is settled",\n "member.status.discarded": "Plan discarded; member was not created",\n "member.status.stopped": "Team stopped; explicit resume required",\n "task.assignee.unclaimed": "Unclaimed",\n "task.summary.waitingBreakdown": "Waiting for the captain to break down the work",\n "task.summary.staged": "{count} planned tasks awaiting approval",\n "task.summary.discarded": "{count} planned tasks discarded; none ran",\n "task.summary.allDelivered": "All {count} tasks delivered",\n "task.summary.ended": "Final: {completed} delivered \xB7 {cancelled} cancelled \xB7 {failed} failed",\n "task.summary.blockedAndRunning": "{tasks}{more} waiting on prerequisites; other work has started",\n "task.summary.more": " and {count} more",\n "task.summary.running": "{tasks} in progress",\n "task.summary.ready": "{tasks} ready to start",\n "task.summary.blocked": "{tasks} waiting on prerequisites",\n "task.summary.failedSettled": "{count} failed; the automatic loop has stopped",\n "task.summary.waitingSchedule": "Waiting for the next scheduling round",\n "progress.aria": "Overall team progress",\n "progress.title": "Overall progress",\n "progress.running": "\u25A0 In progress {count}",\n "progress.blocked": "\u25A0 Waiting {count}",\n "progress.delivered": "\u25A0 Delivered {count}",\n "dependency.aria": "Task dependency chain",\n "dependency.parallel": "Parallel tasks",\n "dependency.title": "Task dependencies",\n "dependency.hint.parallel": "No dependencies \xB7 Click for details",\n "dependency.hint.chain": "Hover to highlight dependencies \xB7 Click to pin",\n "dependency.hint.pinned": "{taskId} pinned \xB7 Esc to clear",\n "task.runningAria": "Running",\n "task.model": "{model}",\n "task.detail.completed": "Completed and delivered",\n "task.detail.noPrerequisite": "No prerequisites; ready to start",\n "task.detail.ready": "Prerequisites ready; can start",\n "task.detail.waitingOn": "Waiting for {tasks}",\n "task.detail.notRun": "Plan discarded; task was not run",\n "task.detail.noDownstream": "No downstream tasks",\n "task.detail.unlocks": "Unlocks {tasks} when complete",\n "team.ended": "Ended",\n "plan.badge": "Awaiting approval",\n "plan.title": "Pre-run plan review",\n "plan.description": "Members have not been spawned and tasks have not been scheduled. Edit the draft here, or return to chat and tell the Captain what should change.",\n "plan.member.role": "Role",\n "plan.member.provider": "Provider",\n "plan.member.model": "Model",\n "plan.member.reasoning": "Reasoning effort",\n "plan.member.reasoningHint": "Leave blank for default; accepts low, medium, high, xhigh, and more",\n "plan.model.choose": "Choose a model",\n "plan.model.currentUnavailable": "{provider}/{model} (not in the current catalog)",\n "plan.model.route": "Route: {provider}/{model}",\n "plan.model.defaultReasoning": "Default reasoning effort",\n "plan.model.providerDefault": "Provider default",\n "plan.model.modelDefault": "Model default ({effort})",\n "plan.model.triggerAria": "Choose member model, currently {model}, reasoning effort {effort}",\n "plan.model.back": "Back",\n "plan.model.loading": "Loading models\u2026",\n "plan.model.empty": "No models available",\n "plan.model.partialFailure": "{count} provider catalogs could not be loaded",\n "plan.model.retry": "Retry",\n "plan.member.prompt": "Role prompt",\n "plan.member.roleFallback": "Role not set",\n "plan.task.subject": "Task subject",\n "plan.task.description": "Task description",\n "plan.task.assignee": "Assignee",\n "plan.task.dependencies": "Dependency task IDs (comma-separated)",\n "plan.task.dependenciesHint": "For example task-1, task-2; cycles are rejected",\n "plan.task.unassigned": "Shared task pool",\n "plan.unsaved": "Unsaved",\n "plan.save": "Save",\n "plan.saving": "Saving\u2026",\n "plan.remove": "Remove",\n "plan.removed": "Task removed",\n "plan.removeConfirm": "Confirm remove",\n "plan.removeWarning": "Removing {task} will recalculate downstream dependencies.",\n "plan.cancel": "Cancel",\n "plan.addTask": "Add task",\n "plan.adding": "Adding\u2026",\n "plan.taskAdded": "Task added",\n "plan.newTask": "New task subject",\n "plan.newTaskLabel": "Add a planned task",\n "plan.readySummary": "{members} members \xB7 {tasks} tasks \xB7 {links} dependencies",\n "plan.flow.aria": "Team launch flow",\n "plan.flow.review": "Review plan",\n "plan.flow.spawn": "Create members",\n "plan.flow.run": "Start work",\n "plan.members.title": "Members & model routes",\n "plan.members.count": "{count} members",\n "plan.members.empty": "No members planned yet",\n "plan.tasks.title": "Tasks & dependencies",\n "plan.tasks.count": "{count} tasks \xB7 {links} dependencies",\n "plan.tasks.empty": "No tasks planned yet",\n "plan.dependencies.none": "No dependencies",\n "plan.dependencies.count": "{count} dependencies",\n "plan.approve": "Approve & Run",\n "plan.approving": "Creating members\u2026",\n "plan.approveTitle": "Plan ready?",\n "plan.approveHint": "Approval creates {members} members and schedules {tasks} tasks.",\n "plan.approveConfirmTitle": "Confirm team launch",\n "plan.approveWarning": "Member routes and dependencies cannot be edited here after launch.",\n "plan.approveConfirm": "Confirm launch",\n "plan.continue": "Return to chat & revise",\n "plan.returnToChat": "Return to chat",\n "plan.feedbackTitle": "Waiting for your revision direction",\n "plan.feedbackHint": "The Captain will ask in chat. After your reply, it will revise this draft and wait for approval again.",\n "plan.discard": "Discard this plan",\n "plan.discardConfirmTitle": "Discard this plan?",\n "plan.discardWarning": "The plan will end and be archived. No members have been spawned and no tasks will run.",\n "plan.discardConfirm": "Discard plan",\n "plan.discarding": "Discarding\u2026",\n "plan.pendingEdits": "Save the current edits before launching the team.",\n "plan.saved": "Plan saved",\n "plan.failed": "Operation failed: {message}",\n "team.stats.members": "{count} members",\n "team.stats.completed": "{completed}/{total} completed",\n "team.stats.messages": "{count} messages",\n "delegation.aria": "Captain delegation map",\n "captain.name": "Captain",\n "captain.role": "Break down \xB7 Delegate \xB7 Synthesize",\n "captain.summary": "Assigned {tasks} tasks to {members} members",\n "captain.summary.staged": "Planned {tasks} tasks and {members} members; awaiting approval",\n "captain.summary.awaitingFeedback": "Draft preserved; waiting for your revision direction in chat",\n "captain.summary.discarded": "Plan discarded: {members} members were not created and {tasks} tasks did not run",\n "captain.summary.withTakeover": "Assigned {tasks} to members \xB7 Captain owns {captainTasks}",\n "captain.state.working": "{count} active",\n "captain.state.takeover": "Working on {tasks}",\n "captain.state.collected": "All reports received",\n "captain.state.waiting": "Waiting for reports",\n "captain.state.staged": "Awaiting approval",\n "captain.state.awaitingFeedback": "Awaiting feedback",\n "captain.state.discarded": "Discarded",\n "captain.state.settled": "Settled",\n "members.toggle": "Members {count}",\n "members.collapse": "Collapse",\n "members.expand": "Expand",\n "members.empty": "No members yet; waiting for the captain to assemble the team",\n "assignment.label": "Captain assigned",\n "assignment.staged": "Planned task",\n "assignment.discarded": "Plan not run",\n "assignment.empty": "No tasks",\n "archive.label": "Ended \xB7 Archived history",\n "archive.discardedLabel": "Plan discarded \xB7 Archived history"\n };\n\n\n /** Version-tolerant navigation into durable T Team member transcripts. */\n /**\n * Open one member\'s persisted transcript.\n *\n * Harness rc.8 intentionally removed cold subagents from the ordinary session\n * list. They must first be rediscovered in their parent\'s catalog, then opened\n * with the exact parent/child/mode address. Older runtimes have only `open()`;\n * the fallback preserves ordinary-session navigation. New layouts also select\n * the Conversation panel and cancel catalog refreshes superseded by navigation.\n */\n async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout, uiWorkspace) {\n const navigation = layout?.beginNavigation?.();\n /**\n * \u3010T\u4E13\u5BB6 \u9002\u914D\u5C42\uFF0C\u975E\u4E0A\u6E38\u4EE3\u7801\u3011\u5BBF\u4E3B 0.1.6+ \u628A"\u6253\u5F00 subagent \u4F1A\u8BDD"\u4EA4\u7ED9\u4E86\n * `uiWorkspace.openSession(target)`\uFF1Asessions \u4E0A\u65E2\u6CA1\u6709 `openSubagent` \u4E5F\u6CA1\u6709 `open`\uFF0C\n * \u4E0B\u9762\u90A3\u4E24\u6761\u4E0A\u6E38\u8DEF\u5F84\u90FD\u4F1A\u629B TypeError\uFF0C\u518D\u88AB\u8C03\u7528\u65B9\u7684 .catch \u541E\u6210\u4E00\u884C console.warn \u2014\u2014\n * \u8868\u73B0\u5C31\u662F"\u70B9\u6210\u5458\u6CA1\u6709\u4EFB\u4F55\u53CD\u5E94"\u3002\u65E7\u5BBF\u4E3B\u6CA1\u6709 uiWorkspace.openSession \u65F6\u4ECD\u8D70\u539F\u8DEF\u5F84\u3002\n */\n if (typeof uiWorkspace?.openSession === "function") {\n await sessions.refreshSubagents?.(parentSessionId);\n if (navigation?.aborted) return "cancelled";\n uiWorkspace.openSession({\n parentSessionId,\n childSessionId,\n mode: "continuable"\n });\n layout?.selectPanel?.(null);\n return "subagent";\n }\n if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {\n sessions.open(childSessionId);\n layout?.selectPanel?.(null);\n return "session";\n }\n await sessions.refreshSubagents(parentSessionId);\n if (navigation?.aborted) return "cancelled";\n const retained = sessions.subagentAddress?.(childSessionId);\n sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {\n parentSessionId,\n childSessionId,\n mode: "continuable"\n });\n layout?.selectPanel?.(null);\n return "subagent";\n }\n\n\n /** Required services: conversation nodes, slots, sessions navigation, and locale. */\n const inject = [\n "uiConversation",\n "slots",\n "sessions",\n "locale",\n "modelDirectories",\n "layout"\n ];\n const useLegacyPanelInfo = (select) => select({ activePanelId: null });\n /** The replayed user message is the canonical transcript entry. */\n function HiddenTTeamCommand() {\n return null;\n }\n /**\n * Register the activity monitor in the shell\'s additive overlay and the\n * in-conversation team card. The card\'s activity button re-opens a folded\n * monitor via a window event \u2014 the recovery path for an old session.\n */\n function apply(ctx) {\n ctx.effect(() => ctx.locale.register(T_TEAM_LOCALE_NAMESPACE, {\n zh,\n en\n }), "t-team: dictionaries");\n const openMember = (parentId, childId) => {\n openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout, ctx.get?.("uiWorkspace")).catch((error) => {\n console.warn(`t-team: failed to open member transcript ${childId}: ${String(error)}`);\n });\n };\n /**\n * \u3010T\u4E13\u5BB6 \u9002\u914D\u5C42\uFF0C\u975E\u4E0A\u6E38\u4EE3\u7801\u3011\u5BBF\u4E3B 0.1.6+ \u7684 `sessions.list` \u5FEB\u7167\u4E0D\u518D\u643A\u5E26 `current`\n * \uFF08\u5F53\u524D\u4F1A\u8BDD\u5DF2\u8FC1\u5230 `uiSession` \u7684 scope \u9002\u914D\u5668\uFF09\uFF0C\u800C\u672C\u9762\u677F\u628A `snapshot.current`\n * \u5F53\u4F5C"\u5F53\u524D\u4F1A\u8BDD"\u7684\u552F\u4E00\u6765\u6E90\uFF1A\u5B83\u4E00\u65E6\u662F undefined\uFF0C\u9762\u677F\u65E2\u4E0D\u8F6E\u8BE2\u72B6\u6001\u8DEF\u7531\u3001\n * \u4E5F\u4E0D\u6E32\u67D3\u5FBD\u6807\u4E0E\u5BA1\u6279\u5165\u53E3 \u2014\u2014 \u8868\u73B0\u4E3A"\u5C0F\u961F\u5EFA\u597D\u540E\u754C\u9762\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u51FA\u73B0"\u3002\n * \u65E7\u5BBF\u4E3B\u5B57\u6BB5\u4ECD\u5728\u65F6\u539F\u6837\u900F\u4F20\uFF1B\u7F3A\u5931\u65F6\u4ECE uiSession \u9002\u914D\u5668\u8865\u9F50\u3002\n *\n * \u7ED3\u679C\u6309 `sessions.list` \u8BB0\u5FC6\u5316\uFF0C\u4E14 getSnapshot \u5728 current \u672A\u53D8\u65F6**\u590D\u7528\u540C\u4E00\u5BF9\u8C61**\uFF1A\n * useSyncExternalStore \u8981\u6C42 subscribe/getSnapshot \u5F15\u7528\u7A33\u5B9A\u3001\u5FEB\u7167\u672A\u53D8\u65F6\u8FD4\u56DE\u540C\u4E00\u4E2A\u503C\uFF0C\n * \u5426\u5219\u6BCF\u6B21\u6E32\u67D3\u90FD\u88AB\u5224\u5B9A\u4E3A"store \u53D8\u4E86"\uFF0C\u65E0\u9650\u91CD\u6E32\u67D3 \u2014\u2014 \u9762\u677F\u540C\u6837\u4EC0\u4E48\u90FD\u663E\u793A\u4E0D\u51FA\u6765\u3002\n */\n const tTeamAdaptedLists = /* @__PURE__ */ new WeakMap();\n const tTeamSessionsList = (ctx) => {\n const list = ctx.sessions.list;\n const ready = tTeamAdaptedLists.get(list);\n if (ready !== undefined) return ready;\n const currentSource = () => ctx.get?.("uiSession")?.adapter?.current;\n let cached;\n let cachedCurrent;\n const adapter = {\n subscribe: (listener) => {\n const disposers = [list.subscribe(listener)];\n const source = currentSource();\n if (typeof source?.subscribe === "function") disposers.push(source.subscribe(listener));\n return () => {\n for (const dispose of disposers) {\n try {\n dispose();\n } catch {\n }\n }\n };\n },\n getSnapshot: () => {\n const snapshot = list.getSnapshot();\n if (snapshot?.current !== undefined) return snapshot;\n const key = currentSource()?.getSnapshot?.()?.key;\n const current = typeof key === "string" && key !== "" ? key : undefined;\n if (cached !== undefined && cachedCurrent === current) return cached;\n cachedCurrent = current;\n cached = {\n ...snapshot,\n current\n };\n return cached;\n }\n };\n tTeamAdaptedLists.set(list, adapter);\n return adapter;\n };\n const Panel = ({ t, usePanelInfo }) => {\n return (0, react_jsx_runtime.jsx)(ActivityPanel, {\n conversationVisible: (usePanelInfo ?? useLegacyPanelInfo)((panel) => panel.activePanelId === null),\n sessionsList: tTeamSessionsList(ctx),\n modelDirectories: ctx.modelDirectories,\n openMember,\n t\n });\n };\n ctx.slots.inject("shell.overlay", () => ctx.slots.register({\n name: "shell.overlay",\n id: "t-team-activity",\n order: 80,\n label: () => ctx.locale.bind(T_TEAM_LOCALE_NAMESPACE)("activity.title"),\n locale: T_TEAM_LOCALE_NAMESPACE\n }, Panel));\n ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({\n name: "conversation.chat.commandview",\n key: "t-team-hidden"\n }, HiddenTTeamCommand));\n ctx.uiConversation.events.register(tTeamCardDefinition);\n ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({\n name: "conversation.chat.node",\n key: "t-team",\n locale: T_TEAM_LOCALE_NAMESPACE,\n inject: () => ({ openMember })\n }, TTeamCard));\n }\n\n exports.apply = apply;\n exports.inject = inject;\n return module.exports;\n }\n});\n\n';
|
|
47
47
|
|
|
48
48
|
// src/client/attention.jsx
|
|
49
49
|
var import_react3 = __toESM(require("react"), 1);
|
|
@@ -51,7 +51,7 @@ var import_react3 = __toESM(require("react"), 1);
|
|
|
51
51
|
// src/client/jobs.jsx
|
|
52
52
|
var import_react2 = __toESM(require("react"), 1);
|
|
53
53
|
|
|
54
|
-
// node_modules/zod/v4/classic/external.js
|
|
54
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/external.js
|
|
55
55
|
var external_exports = {};
|
|
56
56
|
__export(external_exports, {
|
|
57
57
|
$brand: () => $brand,
|
|
@@ -121,7 +121,6 @@ __export(external_exports, {
|
|
|
121
121
|
ZodPrefault: () => ZodPrefault,
|
|
122
122
|
ZodPreprocess: () => ZodPreprocess,
|
|
123
123
|
ZodPromise: () => ZodPromise,
|
|
124
|
-
ZodProperties: () => ZodProperties,
|
|
125
124
|
ZodReadonly: () => ZodReadonly,
|
|
126
125
|
ZodRealError: () => ZodRealError,
|
|
127
126
|
ZodRecord: () => ZodRecord,
|
|
@@ -165,6 +164,7 @@ __export(external_exports, {
|
|
|
165
164
|
creditCard: () => creditCard2,
|
|
166
165
|
cuid: () => cuid3,
|
|
167
166
|
cuid2: () => cuid22,
|
|
167
|
+
currencyCode: () => currencyCode2,
|
|
168
168
|
custom: () => custom,
|
|
169
169
|
date: () => date2,
|
|
170
170
|
decode: () => decode2,
|
|
@@ -258,7 +258,7 @@ __export(external_exports, {
|
|
|
258
258
|
preprocess: () => preprocess,
|
|
259
259
|
prettifyError: () => prettifyError,
|
|
260
260
|
promise: () => promise,
|
|
261
|
-
properties: () =>
|
|
261
|
+
properties: () => _properties,
|
|
262
262
|
property: () => _property,
|
|
263
263
|
readonly: () => readonly,
|
|
264
264
|
record: () => record,
|
|
@@ -314,7 +314,7 @@ __export(external_exports, {
|
|
|
314
314
|
xor: () => xor
|
|
315
315
|
});
|
|
316
316
|
|
|
317
|
-
// node_modules/zod/v4/core/index.js
|
|
317
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/index.js
|
|
318
318
|
var core_exports2 = {};
|
|
319
319
|
__export(core_exports2, {
|
|
320
320
|
$ZodAny: () => $ZodAny,
|
|
@@ -346,6 +346,7 @@ __export(core_exports2, {
|
|
|
346
346
|
$ZodCheckMultipleOf: () => $ZodCheckMultipleOf,
|
|
347
347
|
$ZodCheckNumberFormat: () => $ZodCheckNumberFormat,
|
|
348
348
|
$ZodCheckOverwrite: () => $ZodCheckOverwrite,
|
|
349
|
+
$ZodCheckProperties: () => $ZodCheckProperties,
|
|
349
350
|
$ZodCheckProperty: () => $ZodCheckProperty,
|
|
350
351
|
$ZodCheckRegex: () => $ZodCheckRegex,
|
|
351
352
|
$ZodCheckSizeEquals: () => $ZodCheckSizeEquals,
|
|
@@ -399,7 +400,6 @@ __export(core_exports2, {
|
|
|
399
400
|
$ZodPrefault: () => $ZodPrefault,
|
|
400
401
|
$ZodPreprocess: () => $ZodPreprocess,
|
|
401
402
|
$ZodPromise: () => $ZodPromise,
|
|
402
|
-
$ZodProperties: () => $ZodProperties,
|
|
403
403
|
$ZodReadonly: () => $ZodReadonly,
|
|
404
404
|
$ZodRealError: () => $ZodRealError,
|
|
405
405
|
$ZodRecord: () => $ZodRecord,
|
|
@@ -567,6 +567,7 @@ __export(core_exports2, {
|
|
|
567
567
|
_xor: () => _xor,
|
|
568
568
|
base64Charset: () => base64Charset,
|
|
569
569
|
base64urlCharset: () => base64urlCharset,
|
|
570
|
+
canParseURL: () => canParseURL,
|
|
570
571
|
clone: () => clone,
|
|
571
572
|
compile: () => compile,
|
|
572
573
|
compileFn: () => compileFn,
|
|
@@ -589,7 +590,6 @@ __export(core_exports2, {
|
|
|
589
590
|
initializeContext: () => initializeContext,
|
|
590
591
|
isBackEdge: () => isBackEdge,
|
|
591
592
|
isRecursiveSchema: () => isRecursiveSchema,
|
|
592
|
-
isTransforming: () => isTransforming,
|
|
593
593
|
isValidBase64: () => isValidBase64,
|
|
594
594
|
isValidBase64URL: () => isValidBase64URL,
|
|
595
595
|
isValidCIDRv6: () => isValidCIDRv6,
|
|
@@ -626,11 +626,12 @@ __export(core_exports2, {
|
|
|
626
626
|
util: () => util_exports,
|
|
627
627
|
validate: () => validate,
|
|
628
628
|
validateAsync: () => validateAsync,
|
|
629
|
+
validateURL: () => validateURL,
|
|
629
630
|
version: () => version,
|
|
630
631
|
withParser: () => withParser
|
|
631
632
|
});
|
|
632
633
|
|
|
633
|
-
// node_modules/zod/v4/core/util.js
|
|
634
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/util.js
|
|
634
635
|
var util_exports = {};
|
|
635
636
|
__export(util_exports, {
|
|
636
637
|
BIGINT_FORMAT_RANGES: () => BIGINT_FORMAT_RANGES,
|
|
@@ -1367,9 +1368,6 @@ function members(proto, table) {
|
|
|
1367
1368
|
else
|
|
1368
1369
|
defineBound(proto, key, desc.value);
|
|
1369
1370
|
}
|
|
1370
|
-
for (const sym of Object.getOwnPropertySymbols(table)) {
|
|
1371
|
-
defineBound(proto, sym, table[sym]);
|
|
1372
|
-
}
|
|
1373
1371
|
}
|
|
1374
1372
|
function own(inst, key, value, enumerable = true) {
|
|
1375
1373
|
Object.defineProperty(inst, key, { configurable: true, writable: true, enumerable, value });
|
|
@@ -1476,7 +1474,7 @@ function constantCatch(value) {
|
|
|
1476
1474
|
return fn;
|
|
1477
1475
|
}
|
|
1478
1476
|
|
|
1479
|
-
// node_modules/zod/v4/core/core.js
|
|
1477
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/core.js
|
|
1480
1478
|
var _a;
|
|
1481
1479
|
var NEVER = /* @__PURE__ */ Object.freeze({
|
|
1482
1480
|
status: "aborted"
|
|
@@ -1522,8 +1520,7 @@ function $constructor(name, initializer3, proto, params) {
|
|
|
1522
1520
|
} finally {
|
|
1523
1521
|
_zodDesc.value = void 0;
|
|
1524
1522
|
}
|
|
1525
|
-
}
|
|
1526
|
-
if (inst._zod.traits.has(name)) {
|
|
1523
|
+
} else if (inst._zod.traits.has(name)) {
|
|
1527
1524
|
return;
|
|
1528
1525
|
}
|
|
1529
1526
|
inst._zod.traits.add(name);
|
|
@@ -1599,7 +1596,7 @@ function config(newConfig) {
|
|
|
1599
1596
|
return globalConfig;
|
|
1600
1597
|
}
|
|
1601
1598
|
|
|
1602
|
-
// node_modules/zod/v4/core/errors.js
|
|
1599
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/errors.js
|
|
1603
1600
|
function _getMessage() {
|
|
1604
1601
|
const internals = this._zod;
|
|
1605
1602
|
internals.message ?? (internals.message = JSON.stringify(internals.def, jsonStringifyReplacer, 2));
|
|
@@ -1791,7 +1788,7 @@ function prettifyError(error62) {
|
|
|
1791
1788
|
return lines.join("\n");
|
|
1792
1789
|
}
|
|
1793
1790
|
|
|
1794
|
-
// node_modules/zod/v4/core/parse.js
|
|
1791
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/parse.js
|
|
1795
1792
|
function finalizeParams(callee, params) {
|
|
1796
1793
|
return { callee: params?.callee ?? callee, Err: params?.Err };
|
|
1797
1794
|
}
|
|
@@ -1951,7 +1948,7 @@ var _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {
|
|
|
1951
1948
|
};
|
|
1952
1949
|
var safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync($ZodRealError);
|
|
1953
1950
|
|
|
1954
|
-
// node_modules/zod/v4/core/regexes.js
|
|
1951
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/regexes.js
|
|
1955
1952
|
var regexes_exports = {};
|
|
1956
1953
|
__export(regexes_exports, {
|
|
1957
1954
|
anyString: () => anyString,
|
|
@@ -1965,6 +1962,7 @@ __export(regexes_exports, {
|
|
|
1965
1962
|
creditCard: () => creditCard,
|
|
1966
1963
|
cuid: () => cuid,
|
|
1967
1964
|
cuid2: () => cuid2,
|
|
1965
|
+
currencyCode: () => currencyCode,
|
|
1968
1966
|
date: () => date,
|
|
1969
1967
|
datetime: () => datetime,
|
|
1970
1968
|
domain: () => domain,
|
|
@@ -2063,6 +2061,7 @@ var domain = /^(?=.{1,253}$)([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a
|
|
|
2063
2061
|
var httpProtocol = /^https?$/;
|
|
2064
2062
|
var e164 = /^\+[1-9]\d{6,14}$/;
|
|
2065
2063
|
var creditCard = /^\d(?:[ -]?\d){11,18}$/;
|
|
2064
|
+
var currencyCode = /^(?:AED|AFN|ALL|AMD|AOA|ARS|AUD|AWG|AZN|BAM|BBD|BDT|BHD|BIF|BMD|BND|BOB|BOV|BRL|BSD|BTN|BWP|BYN|BZD|CAD|CDF|CHE|CHF|CHW|CLF|CLP|CNY|COP|COU|CRC|CUP|CVE|CZK|DJF|DKK|DOP|DZD|EGP|ERN|ETB|EUR|FJD|FKP|GBP|GEL|GHS|GIP|GMD|GNF|GTQ|GYD|HKD|HNL|HTG|HUF|IDR|ILS|INR|IQD|IRR|ISK|JMD|JOD|JPY|KES|KGS|KHR|KMF|KPW|KRW|KWD|KYD|KZT|LAK|LBP|LKR|LRD|LSL|LYD|MAD|MDL|MGA|MKD|MMK|MNT|MOP|MRU|MUR|MVR|MWK|MXN|MXV|MYR|MZN|NAD|NGN|NIO|NOK|NPR|NZD|OMR|PAB|PEN|PGK|PHP|PKR|PLN|PYG|QAR|RON|RSD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|SLE|SOS|SRD|SSP|STN|SVC|SYP|SZL|THB|TJS|TMT|TND|TOP|TRY|TTD|TWD|TZS|UAH|UGX|USD|USN|UYI|UYU|UYW|UZS|VED|VES|VND|VUV|WST|XAD|XAF|XAG|XAU|XBA|XBB|XBC|XBD|XCD|XCG|XDR|XOF|XPD|XPF|XPT|XSU|XTS|XUA|XXX|YER|ZAR|ZMW|ZWG)$/;
|
|
2066
2065
|
var iban = /^[A-Z]{2}(?!00|01|99)\d{2}[A-Z0-9]{11,30}$/;
|
|
2067
2066
|
var dateSource = `(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`;
|
|
2068
2067
|
function anchor(source) {
|
|
@@ -2121,7 +2120,7 @@ var sha512_hex = /^[0-9a-fA-F]{128}$/;
|
|
|
2121
2120
|
var sha512_base64 = /* @__PURE__ */ fixedBase64(86, "==");
|
|
2122
2121
|
var sha512_base64url = /* @__PURE__ */ fixedBase64url(86);
|
|
2123
2122
|
|
|
2124
|
-
// node_modules/zod/v4/core/checks.js
|
|
2123
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/checks.js
|
|
2125
2124
|
var $ZodCheck = /* @__PURE__ */ $constructor("$ZodCheck", (inst, def) => {
|
|
2126
2125
|
var _a3;
|
|
2127
2126
|
inst._zod ?? (inst._zod = {});
|
|
@@ -2547,6 +2546,34 @@ var $ZodCheckProperty = /* @__PURE__ */ $constructor("$ZodCheckProperty", (inst,
|
|
|
2547
2546
|
return;
|
|
2548
2547
|
};
|
|
2549
2548
|
});
|
|
2549
|
+
var $ZodCheckProperties = /* @__PURE__ */ $constructor("$ZodCheckProperties", (inst, def) => {
|
|
2550
|
+
$ZodCheck.init(inst, def);
|
|
2551
|
+
hide(inst, Symbol.iterator, function* () {
|
|
2552
|
+
yield inst;
|
|
2553
|
+
});
|
|
2554
|
+
let entries;
|
|
2555
|
+
inst._zod.check = (payload) => {
|
|
2556
|
+
if (payload.value == null) {
|
|
2557
|
+
payload.issues.push({ expected: "object", code: "invalid_type", input: payload.value, inst });
|
|
2558
|
+
return void 0;
|
|
2559
|
+
}
|
|
2560
|
+
entries ?? (entries = Reflect.ownKeys(def.shape).map((key) => [key, def.shape[key]]));
|
|
2561
|
+
const input2 = payload.value;
|
|
2562
|
+
let proms;
|
|
2563
|
+
for (const [key, schema] of entries) {
|
|
2564
|
+
const result = schema._zod.run({ value: input2[key], issues: [] }, {});
|
|
2565
|
+
if (result instanceof Promise) {
|
|
2566
|
+
proms ?? (proms = []);
|
|
2567
|
+
proms.push(result.then((result2) => handleCheckPropertyResult(result2, payload, key)));
|
|
2568
|
+
} else {
|
|
2569
|
+
handleCheckPropertyResult(result, payload, key);
|
|
2570
|
+
}
|
|
2571
|
+
}
|
|
2572
|
+
if (proms)
|
|
2573
|
+
return Promise.all(proms).then(() => void 0);
|
|
2574
|
+
return void 0;
|
|
2575
|
+
};
|
|
2576
|
+
});
|
|
2550
2577
|
var $ZodCheckMimeType = /* @__PURE__ */ $constructor("$ZodCheckMimeType", (inst, def) => {
|
|
2551
2578
|
$ZodCheck.init(inst, def);
|
|
2552
2579
|
const mimeSet = new Set(def.mime);
|
|
@@ -2569,7 +2596,7 @@ var $ZodCheckOverwrite = /* @__PURE__ */ $constructor("$ZodCheckOverwrite", (ins
|
|
|
2569
2596
|
};
|
|
2570
2597
|
});
|
|
2571
2598
|
|
|
2572
|
-
// node_modules/zod/v4/core/doc.js
|
|
2599
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/doc.js
|
|
2573
2600
|
var Doc = class {
|
|
2574
2601
|
constructor(args = [], closed = {}) {
|
|
2575
2602
|
this.content = [];
|
|
@@ -2610,14 +2637,14 @@ ${content.join("\n")}
|
|
|
2610
2637
|
}
|
|
2611
2638
|
};
|
|
2612
2639
|
|
|
2613
|
-
// node_modules/zod/v4/core/versions.js
|
|
2640
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/versions.js
|
|
2614
2641
|
var version = {
|
|
2615
2642
|
major: 4,
|
|
2616
2643
|
minor: 6,
|
|
2617
|
-
patch:
|
|
2644
|
+
patch: 5
|
|
2618
2645
|
};
|
|
2619
2646
|
|
|
2620
|
-
// node_modules/zod/v4/core/schemas.js
|
|
2647
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/schemas.js
|
|
2621
2648
|
var $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => {
|
|
2622
2649
|
var _a3;
|
|
2623
2650
|
inst ?? (inst = {});
|
|
@@ -2802,11 +2829,32 @@ var $ZodEmail = /* @__PURE__ */ $constructor("$ZodEmail", (inst, def) => {
|
|
|
2802
2829
|
});
|
|
2803
2830
|
var URL_BAD_FORMAT = 1;
|
|
2804
2831
|
var URL_UNPARSEABLE = 2;
|
|
2832
|
+
function canParseURL(input2) {
|
|
2833
|
+
try {
|
|
2834
|
+
if (typeof URL !== "undefined" && typeof URL.canParse === "function")
|
|
2835
|
+
return URL.canParse(input2);
|
|
2836
|
+
new URL(input2);
|
|
2837
|
+
return true;
|
|
2838
|
+
} catch {
|
|
2839
|
+
return false;
|
|
2840
|
+
}
|
|
2841
|
+
}
|
|
2842
|
+
function validateURL(trimmed, def) {
|
|
2843
|
+
if (!("normalize" in def) && !("hostname" in def) && !("protocol" in def)) {
|
|
2844
|
+
return canParseURL(trimmed) || URL_UNPARSEABLE;
|
|
2845
|
+
}
|
|
2846
|
+
return parseURLObject(trimmed, def);
|
|
2847
|
+
}
|
|
2805
2848
|
function parseURLObject(trimmed, def) {
|
|
2806
2849
|
if (!def.normalize && def.protocol?.source === httpProtocol.source && !/^https?:\/\//i.test(trimmed)) {
|
|
2807
2850
|
return URL_BAD_FORMAT;
|
|
2808
2851
|
}
|
|
2809
2852
|
try {
|
|
2853
|
+
if (typeof URL !== "undefined") {
|
|
2854
|
+
const URLStatic = URL;
|
|
2855
|
+
if (typeof URLStatic.parse === "function")
|
|
2856
|
+
return URLStatic.parse(trimmed) ?? URL_UNPARSEABLE;
|
|
2857
|
+
}
|
|
2810
2858
|
return new URL(trimmed);
|
|
2811
2859
|
} catch {
|
|
2812
2860
|
return URL_UNPARSEABLE;
|
|
@@ -2829,7 +2877,7 @@ var $ZodURL = /* @__PURE__ */ $constructor("$ZodURL", (inst, def) => {
|
|
|
2829
2877
|
inst._zod.check = (payload) => {
|
|
2830
2878
|
try {
|
|
2831
2879
|
const trimmed = payload.value.trim();
|
|
2832
|
-
const url2 =
|
|
2880
|
+
const url2 = validateURL(trimmed, def);
|
|
2833
2881
|
if (url2 === URL_BAD_FORMAT) {
|
|
2834
2882
|
payload.issues.push({
|
|
2835
2883
|
code: "invalid_format",
|
|
@@ -2851,6 +2899,10 @@ var $ZodURL = /* @__PURE__ */ $constructor("$ZodURL", (inst, def) => {
|
|
|
2851
2899
|
});
|
|
2852
2900
|
return;
|
|
2853
2901
|
}
|
|
2902
|
+
if (url2 === true) {
|
|
2903
|
+
payload.value = stripTabAndNewline(trimmed);
|
|
2904
|
+
return;
|
|
2905
|
+
}
|
|
2854
2906
|
if (def.hostname && !urlHostnameOk(url2, def.hostname)) {
|
|
2855
2907
|
payload.issues.push({
|
|
2856
2908
|
code: "invalid_format",
|
|
@@ -2940,12 +2992,7 @@ var ipv6Alphabet = /^[0-9a-fA-F:.]+$/;
|
|
|
2940
2992
|
function isValidIPv6(value) {
|
|
2941
2993
|
if (!ipv6Alphabet.test(value))
|
|
2942
2994
|
return false;
|
|
2943
|
-
|
|
2944
|
-
new URL(`http://[${value}]`);
|
|
2945
|
-
return true;
|
|
2946
|
-
} catch {
|
|
2947
|
-
return false;
|
|
2948
|
-
}
|
|
2995
|
+
return canParseURL(`http://[${value}]`);
|
|
2949
2996
|
}
|
|
2950
2997
|
var $ZodIPv6 = /* @__PURE__ */ $constructor("$ZodIPv6", (inst, def) => {
|
|
2951
2998
|
def.pattern ?? (def.pattern = ipv6);
|
|
@@ -5010,61 +5057,8 @@ function handleRefineResult(result, payload, input2, inst) {
|
|
|
5010
5057
|
payload.issues.push(issue(_iss));
|
|
5011
5058
|
}
|
|
5012
5059
|
}
|
|
5013
|
-
function handlePropertiesResult(result, payload, key) {
|
|
5014
|
-
if (result.issues.length) {
|
|
5015
|
-
payload.issues.push(...prefixIssues(key, result.issues));
|
|
5016
|
-
}
|
|
5017
|
-
}
|
|
5018
|
-
var $ZodProperties = /* @__PURE__ */ $constructor("$ZodProperties", (inst, def) => {
|
|
5019
|
-
$ZodType.init(inst, def);
|
|
5020
|
-
$ZodCheck.init(inst, def);
|
|
5021
|
-
const memo2 = globalConfig.memoizer;
|
|
5022
|
-
memo2?.attach(inst);
|
|
5023
|
-
let entries;
|
|
5024
|
-
const runShape = (payload, ctx) => {
|
|
5025
|
-
entries ?? (entries = Reflect.ownKeys(def.shape).map((key) => [key, def.shape[key]]));
|
|
5026
|
-
const input2 = payload.value;
|
|
5027
|
-
let proms;
|
|
5028
|
-
for (const [key, schema] of entries) {
|
|
5029
|
-
const result = schema._zod.run({ value: input2[key], issues: [] }, ctx);
|
|
5030
|
-
if (result instanceof Promise) {
|
|
5031
|
-
proms ?? (proms = []);
|
|
5032
|
-
proms.push(result.then((result2) => handlePropertiesResult(result2, payload, key)));
|
|
5033
|
-
} else {
|
|
5034
|
-
handlePropertiesResult(result, payload, key);
|
|
5035
|
-
}
|
|
5036
|
-
}
|
|
5037
|
-
if (proms)
|
|
5038
|
-
return Promise.all(proms).then(() => void 0);
|
|
5039
|
-
return void 0;
|
|
5040
|
-
};
|
|
5041
|
-
inst._zod.parse = (payload, ctx) => {
|
|
5042
|
-
const input2 = payload.value;
|
|
5043
|
-
if (input2 === null || typeof input2 !== "object" && typeof input2 !== "function") {
|
|
5044
|
-
payload.issues.push({ expected: "object", code: "invalid_type", input: input2, inst });
|
|
5045
|
-
return payload;
|
|
5046
|
-
}
|
|
5047
|
-
if (ctx.direction === "backward")
|
|
5048
|
-
ctx = { ...ctx, direction: "forward" };
|
|
5049
|
-
if (memo2)
|
|
5050
|
-
memo2.alloc(inst, payload, input2, ctx);
|
|
5051
|
-
const result = runShape(payload, ctx);
|
|
5052
|
-
return result instanceof Promise ? result.then(() => payload) : payload;
|
|
5053
|
-
};
|
|
5054
|
-
inst._zod.check = (payload) => {
|
|
5055
|
-
if (payload.value == null) {
|
|
5056
|
-
payload.issues.push({ expected: "object", code: "invalid_type", input: payload.value, inst });
|
|
5057
|
-
return void 0;
|
|
5058
|
-
}
|
|
5059
|
-
return runShape(payload, {});
|
|
5060
|
-
};
|
|
5061
|
-
}, {
|
|
5062
|
-
*[Symbol.iterator]() {
|
|
5063
|
-
yield this;
|
|
5064
|
-
}
|
|
5065
|
-
});
|
|
5066
5060
|
|
|
5067
|
-
// node_modules/zod/v4/core/memoizer.js
|
|
5061
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/memoizer.js
|
|
5068
5062
|
var $ZodCyclicError = class extends Error {
|
|
5069
5063
|
constructor() {
|
|
5070
5064
|
super(`Cannot parse a reference cycle that closes through a transform`);
|
|
@@ -5074,7 +5068,7 @@ var $ZodCyclicError = class extends Error {
|
|
|
5074
5068
|
var STATE = "~memo";
|
|
5075
5069
|
var NO_ISSUES = [];
|
|
5076
5070
|
function isRef(value) {
|
|
5077
|
-
return value !== null &&
|
|
5071
|
+
return value !== null && typeof value === "object";
|
|
5078
5072
|
}
|
|
5079
5073
|
function cloneIssues(issues) {
|
|
5080
5074
|
return issues.map((iss) => iss.path ? { ...iss, path: iss.path.slice() } : { ...iss });
|
|
@@ -5123,9 +5117,6 @@ function isRecursive(inst, stack, resolve) {
|
|
|
5123
5117
|
check2(def.catchall);
|
|
5124
5118
|
break;
|
|
5125
5119
|
}
|
|
5126
|
-
case "properties":
|
|
5127
|
-
merge2(shape(def.shape, false));
|
|
5128
|
-
break;
|
|
5129
5120
|
case "array":
|
|
5130
5121
|
check2(def.element);
|
|
5131
5122
|
break;
|
|
@@ -5344,7 +5335,7 @@ function isBackEdge(ctx, value) {
|
|
|
5344
5335
|
return backEdges !== void 0 && isRef(value) && backEdges.has(value);
|
|
5345
5336
|
}
|
|
5346
5337
|
|
|
5347
|
-
// node_modules/zod/v4/locales/index.js
|
|
5338
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/index.js
|
|
5348
5339
|
var locales_exports = {};
|
|
5349
5340
|
__export(locales_exports, {
|
|
5350
5341
|
ar: () => ar_default,
|
|
@@ -5412,7 +5403,7 @@ __export(locales_exports, {
|
|
|
5412
5403
|
zhTW: () => zh_TW_default
|
|
5413
5404
|
});
|
|
5414
5405
|
|
|
5415
|
-
// node_modules/zod/v4/locales/ar.js
|
|
5406
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ar.js
|
|
5416
5407
|
var error = () => {
|
|
5417
5408
|
const Sizable = {
|
|
5418
5409
|
string: { unit: "\u062D\u0631\u0641", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" },
|
|
@@ -5453,6 +5444,7 @@ var error = () => {
|
|
|
5453
5444
|
json_string: "\u0646\u064E\u0635 \u0639\u0644\u0649 \u0647\u064A\u0626\u0629 JSON",
|
|
5454
5445
|
e164: "\u0631\u0642\u0645 \u0647\u0627\u062A\u0641 \u0628\u0645\u0639\u064A\u0627\u0631 E.164",
|
|
5455
5446
|
credit_card: "\u0631\u0642\u0645 \u0628\u0637\u0627\u0642\u0629 \u0627\u0644\u0627\u0626\u062A\u0645\u0627\u0646",
|
|
5447
|
+
currency_code: "\u0631\u0645\u0632 \u0627\u0644\u0639\u0645\u0644\u0629",
|
|
5456
5448
|
iban: "IBAN",
|
|
5457
5449
|
jwt: "JWT",
|
|
5458
5450
|
template_literal: "\u0645\u062F\u062E\u0644"
|
|
@@ -5523,7 +5515,7 @@ function ar_default() {
|
|
|
5523
5515
|
};
|
|
5524
5516
|
}
|
|
5525
5517
|
|
|
5526
|
-
// node_modules/zod/v4/locales/az.js
|
|
5518
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/az.js
|
|
5527
5519
|
var error2 = () => {
|
|
5528
5520
|
const Sizable = {
|
|
5529
5521
|
string: { unit: "simvol", verb: "olmal\u0131d\u0131r" },
|
|
@@ -5564,6 +5556,7 @@ var error2 = () => {
|
|
|
5564
5556
|
json_string: "JSON string",
|
|
5565
5557
|
e164: "E.164 number",
|
|
5566
5558
|
credit_card: "kredit kart\u0131 n\xF6mr\u0259si",
|
|
5559
|
+
currency_code: "valyuta kodu",
|
|
5567
5560
|
iban: "IBAN",
|
|
5568
5561
|
jwt: "JWT",
|
|
5569
5562
|
template_literal: "input"
|
|
@@ -5633,7 +5626,7 @@ function az_default() {
|
|
|
5633
5626
|
};
|
|
5634
5627
|
}
|
|
5635
5628
|
|
|
5636
|
-
// node_modules/zod/v4/locales/be.js
|
|
5629
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/be.js
|
|
5637
5630
|
function getBelarusianPlural(count, one, few, many) {
|
|
5638
5631
|
const absCount = Math.abs(count);
|
|
5639
5632
|
const lastDigit = absCount % 10;
|
|
@@ -5724,6 +5717,7 @@ var error3 = () => {
|
|
|
5724
5717
|
json_string: "JSON \u0440\u0430\u0434\u043E\u043A",
|
|
5725
5718
|
e164: "\u043D\u0443\u043C\u0430\u0440 E.164",
|
|
5726
5719
|
credit_card: "\u043D\u0443\u043C\u0430\u0440 \u043A\u0440\u044D\u0434\u044B\u0442\u043D\u0430\u0439 \u043A\u0430\u0440\u0442\u044B",
|
|
5720
|
+
currency_code: "\u043A\u043E\u0434 \u0432\u0430\u043B\u044E\u0442\u044B",
|
|
5727
5721
|
iban: "IBAN",
|
|
5728
5722
|
jwt: "JWT",
|
|
5729
5723
|
template_literal: "\u0443\u0432\u043E\u0434"
|
|
@@ -5801,7 +5795,7 @@ function be_default() {
|
|
|
5801
5795
|
};
|
|
5802
5796
|
}
|
|
5803
5797
|
|
|
5804
|
-
// node_modules/zod/v4/locales/bg.js
|
|
5798
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bg.js
|
|
5805
5799
|
var error4 = () => {
|
|
5806
5800
|
const Sizable = {
|
|
5807
5801
|
string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0430", verb: "\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430" },
|
|
@@ -5842,6 +5836,7 @@ var error4 = () => {
|
|
|
5842
5836
|
json_string: "JSON \u043D\u0438\u0437",
|
|
5843
5837
|
e164: "E.164 \u043D\u043E\u043C\u0435\u0440",
|
|
5844
5838
|
credit_card: "\u043D\u043E\u043C\u0435\u0440 \u043D\u0430 \u043A\u0440\u0435\u0434\u0438\u0442\u043D\u0430 \u043A\u0430\u0440\u0442\u0430",
|
|
5839
|
+
currency_code: "\u043A\u043E\u0434 \u043D\u0430 \u0432\u0430\u043B\u0443\u0442\u0430",
|
|
5845
5840
|
iban: "IBAN",
|
|
5846
5841
|
jwt: "JWT",
|
|
5847
5842
|
template_literal: "\u0432\u0445\u043E\u0434"
|
|
@@ -5926,7 +5921,7 @@ function bg_default() {
|
|
|
5926
5921
|
};
|
|
5927
5922
|
}
|
|
5928
5923
|
|
|
5929
|
-
// node_modules/zod/v4/locales/bn.js
|
|
5924
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bn.js
|
|
5930
5925
|
var error5 = () => {
|
|
5931
5926
|
const Sizable = {
|
|
5932
5927
|
string: { unit: "\u0985\u0995\u09CD\u09B7\u09B0", verb: "\u09A5\u09BE\u0995\u09A4\u09C7 \u09B9\u09AC\u09C7" },
|
|
@@ -5967,6 +5962,7 @@ var error5 = () => {
|
|
|
5967
5962
|
json_string: "JSON \u09B8\u09CD\u099F\u09CD\u09B0\u09BF\u0982",
|
|
5968
5963
|
e164: "E.164 \u09A8\u09AE\u09CD\u09AC\u09B0",
|
|
5969
5964
|
credit_card: "\u0995\u09CD\u09B0\u09C7\u09A1\u09BF\u099F \u0995\u09BE\u09B0\u09CD\u09A1 \u09A8\u09AE\u09CD\u09AC\u09B0",
|
|
5965
|
+
currency_code: "\u09AE\u09C1\u09A6\u09CD\u09B0\u09BE \u0995\u09CB\u09A1",
|
|
5970
5966
|
iban: "IBAN",
|
|
5971
5967
|
jwt: "JWT",
|
|
5972
5968
|
template_literal: "\u0987\u09A8\u09AA\u09C1\u099F"
|
|
@@ -6039,7 +6035,7 @@ function bn_default() {
|
|
|
6039
6035
|
};
|
|
6040
6036
|
}
|
|
6041
6037
|
|
|
6042
|
-
// node_modules/zod/v4/locales/ca.js
|
|
6038
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ca.js
|
|
6043
6039
|
var error6 = () => {
|
|
6044
6040
|
const Sizable = {
|
|
6045
6041
|
string: { unit: "car\xE0cters", verb: "contenir" },
|
|
@@ -6080,6 +6076,7 @@ var error6 = () => {
|
|
|
6080
6076
|
json_string: "cadena JSON",
|
|
6081
6077
|
e164: "n\xFAmero E.164",
|
|
6082
6078
|
credit_card: "n\xFAmero de targeta de cr\xE8dit",
|
|
6079
|
+
currency_code: "codi de moneda",
|
|
6083
6080
|
iban: "IBAN",
|
|
6084
6081
|
jwt: "JWT",
|
|
6085
6082
|
template_literal: "entrada"
|
|
@@ -6152,7 +6149,7 @@ function ca_default() {
|
|
|
6152
6149
|
};
|
|
6153
6150
|
}
|
|
6154
6151
|
|
|
6155
|
-
// node_modules/zod/v4/locales/ckb.js
|
|
6152
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ckb.js
|
|
6156
6153
|
var error7 = () => {
|
|
6157
6154
|
const Sizable = {
|
|
6158
6155
|
string: { unit: "\u067E\u06CC\u062A", verb: "\u0628\u06CE\u062A" },
|
|
@@ -6193,6 +6190,7 @@ var error7 = () => {
|
|
|
6193
6190
|
json_string: "\u062F\u06D5\u0642\u06CC JSON",
|
|
6194
6191
|
e164: "\u0698\u0645\u0627\u0631\u06D5\u06CC E.164",
|
|
6195
6192
|
credit_card: "\u0698\u0645\u0627\u0631\u06D5\u06CC \u06A9\u0627\u0631\u062A\u06CC \u06A9\u0631\u06CE\u062F\u06CC\u062A",
|
|
6193
|
+
currency_code: "\u06A9\u06C6\u062F\u06CC \u062F\u0631\u0627\u0648",
|
|
6196
6194
|
iban: "IBAN",
|
|
6197
6195
|
jwt: "JWT",
|
|
6198
6196
|
template_literal: "\u062A\u06CE\u06A9\u0631\u062F\u06D5"
|
|
@@ -6284,7 +6282,7 @@ function ckb_default() {
|
|
|
6284
6282
|
};
|
|
6285
6283
|
}
|
|
6286
6284
|
|
|
6287
|
-
// node_modules/zod/v4/locales/cs.js
|
|
6285
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/cs.js
|
|
6288
6286
|
var error8 = () => {
|
|
6289
6287
|
const Sizable = {
|
|
6290
6288
|
string: { unit: "znak\u016F", verb: "m\xEDt" },
|
|
@@ -6325,6 +6323,7 @@ var error8 = () => {
|
|
|
6325
6323
|
json_string: "\u0159et\u011Bzec ve form\xE1tu JSON",
|
|
6326
6324
|
e164: "\u010D\xEDslo E.164",
|
|
6327
6325
|
credit_card: "\u010D\xEDslo kreditn\xED karty",
|
|
6326
|
+
currency_code: "k\xF3d m\u011Bny",
|
|
6328
6327
|
iban: "IBAN",
|
|
6329
6328
|
jwt: "JWT",
|
|
6330
6329
|
template_literal: "vstup"
|
|
@@ -6400,7 +6399,7 @@ function cs_default() {
|
|
|
6400
6399
|
};
|
|
6401
6400
|
}
|
|
6402
6401
|
|
|
6403
|
-
// node_modules/zod/v4/locales/da.js
|
|
6402
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/da.js
|
|
6404
6403
|
var error9 = () => {
|
|
6405
6404
|
const Sizable = {
|
|
6406
6405
|
string: { unit: "tegn", verb: "havde" },
|
|
@@ -6441,6 +6440,7 @@ var error9 = () => {
|
|
|
6441
6440
|
json_string: "JSON-streng",
|
|
6442
6441
|
e164: "E.164-nummer",
|
|
6443
6442
|
credit_card: "kreditkortnummer",
|
|
6443
|
+
currency_code: "valutakode",
|
|
6444
6444
|
iban: "IBAN",
|
|
6445
6445
|
jwt: "JWT",
|
|
6446
6446
|
template_literal: "input"
|
|
@@ -6520,7 +6520,7 @@ function da_default() {
|
|
|
6520
6520
|
};
|
|
6521
6521
|
}
|
|
6522
6522
|
|
|
6523
|
-
// node_modules/zod/v4/locales/de.js
|
|
6523
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/de.js
|
|
6524
6524
|
var error10 = () => {
|
|
6525
6525
|
const Sizable = {
|
|
6526
6526
|
string: { unit: "Zeichen", verb: "zu haben" },
|
|
@@ -6561,6 +6561,7 @@ var error10 = () => {
|
|
|
6561
6561
|
json_string: "JSON-String",
|
|
6562
6562
|
e164: "E.164-Nummer",
|
|
6563
6563
|
credit_card: "Kreditkartennummer",
|
|
6564
|
+
currency_code: "W\xE4hrungscode",
|
|
6564
6565
|
iban: "IBAN",
|
|
6565
6566
|
jwt: "JWT",
|
|
6566
6567
|
template_literal: "Eingabe"
|
|
@@ -6633,7 +6634,7 @@ function de_default() {
|
|
|
6633
6634
|
};
|
|
6634
6635
|
}
|
|
6635
6636
|
|
|
6636
|
-
// node_modules/zod/v4/locales/el.js
|
|
6637
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/el.js
|
|
6637
6638
|
var error11 = () => {
|
|
6638
6639
|
const Sizable = {
|
|
6639
6640
|
string: { unit: "\u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2", verb: "\u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9" },
|
|
@@ -6674,6 +6675,7 @@ var error11 = () => {
|
|
|
6674
6675
|
json_string: "\u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC JSON",
|
|
6675
6676
|
e164: "\u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 E.164",
|
|
6676
6677
|
credit_card: "\u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C0\u03B9\u03C3\u03C4\u03C9\u03C4\u03B9\u03BA\u03AE\u03C2 \u03BA\u03AC\u03C1\u03C4\u03B1\u03C2",
|
|
6678
|
+
currency_code: "\u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03BD\u03BF\u03BC\u03AF\u03C3\u03BC\u03B1\u03C4\u03BF\u03C2",
|
|
6677
6679
|
iban: "IBAN",
|
|
6678
6680
|
jwt: "JWT",
|
|
6679
6681
|
template_literal: "\u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2"
|
|
@@ -6745,7 +6747,7 @@ function el_default() {
|
|
|
6745
6747
|
};
|
|
6746
6748
|
}
|
|
6747
6749
|
|
|
6748
|
-
// node_modules/zod/v4/locales/en.js
|
|
6750
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/en.js
|
|
6749
6751
|
var error12 = () => {
|
|
6750
6752
|
const Sizable = {
|
|
6751
6753
|
string: { unit: "characters", verb: "to have" },
|
|
@@ -6785,6 +6787,7 @@ var error12 = () => {
|
|
|
6785
6787
|
base64url: "base64url-encoded string",
|
|
6786
6788
|
json_string: "JSON string",
|
|
6787
6789
|
e164: "E.164 number",
|
|
6790
|
+
currency_code: "currency code",
|
|
6788
6791
|
credit_card: "credit card number",
|
|
6789
6792
|
iban: "IBAN",
|
|
6790
6793
|
jwt: "JWT",
|
|
@@ -6869,7 +6872,7 @@ function en_default() {
|
|
|
6869
6872
|
};
|
|
6870
6873
|
}
|
|
6871
6874
|
|
|
6872
|
-
// node_modules/zod/v4/locales/eo.js
|
|
6875
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/eo.js
|
|
6873
6876
|
var error13 = () => {
|
|
6874
6877
|
const Sizable = {
|
|
6875
6878
|
string: { unit: "karaktrojn", verb: "havi" },
|
|
@@ -6910,6 +6913,7 @@ var error13 = () => {
|
|
|
6910
6913
|
json_string: "JSON-karaktraro",
|
|
6911
6914
|
e164: "E.164-nombro",
|
|
6912
6915
|
credit_card: "kreditkarta numero",
|
|
6916
|
+
currency_code: "valuta kodo",
|
|
6913
6917
|
iban: "IBAN",
|
|
6914
6918
|
jwt: "JWT",
|
|
6915
6919
|
template_literal: "enigo"
|
|
@@ -6983,7 +6987,7 @@ function eo_default() {
|
|
|
6983
6987
|
};
|
|
6984
6988
|
}
|
|
6985
6989
|
|
|
6986
|
-
// node_modules/zod/v4/locales/es.js
|
|
6990
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/es.js
|
|
6987
6991
|
var error14 = () => {
|
|
6988
6992
|
const Sizable = {
|
|
6989
6993
|
string: { unit: "caracteres", verb: "tener" },
|
|
@@ -7023,6 +7027,7 @@ var error14 = () => {
|
|
|
7023
7027
|
json_string: "cadena JSON",
|
|
7024
7028
|
e164: "n\xFAmero E.164",
|
|
7025
7029
|
credit_card: "n\xFAmero de tarjeta de cr\xE9dito",
|
|
7030
|
+
currency_code: "c\xF3digo de moneda",
|
|
7026
7031
|
iban: "IBAN",
|
|
7027
7032
|
jwt: "JWT",
|
|
7028
7033
|
template_literal: "entrada"
|
|
@@ -7119,7 +7124,7 @@ function es_default() {
|
|
|
7119
7124
|
};
|
|
7120
7125
|
}
|
|
7121
7126
|
|
|
7122
|
-
// node_modules/zod/v4/locales/fa.js
|
|
7127
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fa.js
|
|
7123
7128
|
var error15 = () => {
|
|
7124
7129
|
const Sizable = {
|
|
7125
7130
|
string: { unit: "\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" },
|
|
@@ -7160,6 +7165,7 @@ var error15 = () => {
|
|
|
7160
7165
|
json_string: "JSON \u0631\u0634\u062A\u0647",
|
|
7161
7166
|
e164: "E.164 \u0639\u062F\u062F",
|
|
7162
7167
|
credit_card: "\u0634\u0645\u0627\u0631\u0647 \u06A9\u0627\u0631\u062A \u0627\u0639\u062A\u0628\u0627\u0631\u06CC",
|
|
7168
|
+
currency_code: "\u06A9\u062F \u0627\u0631\u0632",
|
|
7163
7169
|
iban: "IBAN",
|
|
7164
7170
|
jwt: "JWT",
|
|
7165
7171
|
template_literal: "\u0648\u0631\u0648\u062F\u06CC"
|
|
@@ -7238,7 +7244,7 @@ function fa_default() {
|
|
|
7238
7244
|
};
|
|
7239
7245
|
}
|
|
7240
7246
|
|
|
7241
|
-
// node_modules/zod/v4/locales/fi.js
|
|
7247
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fi.js
|
|
7242
7248
|
var error16 = () => {
|
|
7243
7249
|
const Sizable = {
|
|
7244
7250
|
string: { unit: "merkki\xE4", subject: "merkkijonon" },
|
|
@@ -7283,6 +7289,7 @@ var error16 = () => {
|
|
|
7283
7289
|
json_string: "JSON-merkkijono",
|
|
7284
7290
|
e164: "E.164-luku",
|
|
7285
7291
|
credit_card: "luottokortin numero",
|
|
7292
|
+
currency_code: "valuuttakoodi",
|
|
7286
7293
|
iban: "IBAN",
|
|
7287
7294
|
jwt: "JWT",
|
|
7288
7295
|
template_literal: "templaattimerkkijono"
|
|
@@ -7355,7 +7362,7 @@ function fi_default() {
|
|
|
7355
7362
|
};
|
|
7356
7363
|
}
|
|
7357
7364
|
|
|
7358
|
-
// node_modules/zod/v4/locales/fr.js
|
|
7365
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr.js
|
|
7359
7366
|
var error17 = () => {
|
|
7360
7367
|
const Sizable = {
|
|
7361
7368
|
string: { unit: "caract\xE8res", verb: "avoir" },
|
|
@@ -7395,6 +7402,7 @@ var error17 = () => {
|
|
|
7395
7402
|
json_string: "cha\xEEne de caract\xE8res JSON",
|
|
7396
7403
|
e164: "num\xE9ro au format E.164",
|
|
7397
7404
|
credit_card: "num\xE9ro de carte de cr\xE9dit",
|
|
7405
|
+
currency_code: "code de devise",
|
|
7398
7406
|
iban: "IBAN",
|
|
7399
7407
|
jwt: "JWT",
|
|
7400
7408
|
template_literal: "entr\xE9e"
|
|
@@ -7484,7 +7492,7 @@ function fr_default() {
|
|
|
7484
7492
|
};
|
|
7485
7493
|
}
|
|
7486
7494
|
|
|
7487
|
-
// node_modules/zod/v4/locales/fr-CA.js
|
|
7495
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr-CA.js
|
|
7488
7496
|
var error18 = () => {
|
|
7489
7497
|
const Sizable = {
|
|
7490
7498
|
string: { unit: "caract\xE8res", verb: "avoir" },
|
|
@@ -7525,6 +7533,7 @@ var error18 = () => {
|
|
|
7525
7533
|
json_string: "cha\xEEne JSON",
|
|
7526
7534
|
e164: "num\xE9ro E.164",
|
|
7527
7535
|
credit_card: "num\xE9ro de carte de cr\xE9dit",
|
|
7536
|
+
currency_code: "code de devise",
|
|
7528
7537
|
iban: "IBAN",
|
|
7529
7538
|
jwt: "JWT",
|
|
7530
7539
|
template_literal: "entr\xE9e"
|
|
@@ -7596,7 +7605,7 @@ function fr_CA_default() {
|
|
|
7596
7605
|
};
|
|
7597
7606
|
}
|
|
7598
7607
|
|
|
7599
|
-
// node_modules/zod/v4/locales/gu.js
|
|
7608
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/gu.js
|
|
7600
7609
|
var error19 = () => {
|
|
7601
7610
|
const Sizable = {
|
|
7602
7611
|
string: { unit: "\u0A85\u0A95\u0ACD\u0AB7\u0AB0", verb: "\u0AB9\u0ACB\u0AB5\u0ABE \u0A9C\u0ACB\u0A88\u0A8F" },
|
|
@@ -7637,6 +7646,7 @@ var error19 = () => {
|
|
|
7637
7646
|
json_string: "JSON \u0AB8\u0ACD\u0A9F\u0ACD\u0AB0\u0ABF\u0A82\u0A97",
|
|
7638
7647
|
e164: "E.164 \u0AA8\u0A82\u0AAC\u0AB0",
|
|
7639
7648
|
credit_card: "\u0A95\u0ACD\u0AB0\u0AC7\u0AA1\u0ABF\u0A9F \u0A95\u0ABE\u0AB0\u0ACD\u0AA1 \u0AA8\u0A82\u0AAC\u0AB0",
|
|
7649
|
+
currency_code: "\u0A9A\u0AB2\u0AA3 \u0A95\u0ACB\u0AA1",
|
|
7640
7650
|
iban: "IBAN",
|
|
7641
7651
|
jwt: "JWT",
|
|
7642
7652
|
template_literal: "\u0A87\u0AA8\u0AAA\u0AC1\u0A9F"
|
|
@@ -7709,7 +7719,7 @@ function gu_default() {
|
|
|
7709
7719
|
};
|
|
7710
7720
|
}
|
|
7711
7721
|
|
|
7712
|
-
// node_modules/zod/v4/locales/he.js
|
|
7722
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/he.js
|
|
7713
7723
|
var error20 = () => {
|
|
7714
7724
|
const TypeNames = {
|
|
7715
7725
|
string: { label: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA", gender: "f" },
|
|
@@ -7786,6 +7796,7 @@ var error20 = () => {
|
|
|
7786
7796
|
json_string: { label: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA JSON", gender: "f" },
|
|
7787
7797
|
e164: { label: "\u05DE\u05E1\u05E4\u05E8 E.164", gender: "m" },
|
|
7788
7798
|
credit_card: { label: "\u05DE\u05E1\u05E4\u05E8 \u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9", gender: "m" },
|
|
7799
|
+
currency_code: { label: "\u05E7\u05D5\u05D3 \u05DE\u05D8\u05D1\u05E2", gender: "m" },
|
|
7789
7800
|
iban: { label: "IBAN", gender: "m" },
|
|
7790
7801
|
jwt: { label: "JWT", gender: "m" },
|
|
7791
7802
|
template_literal: { label: "\u05E7\u05DC\u05D8", gender: "m" },
|
|
@@ -7910,7 +7921,7 @@ function he_default() {
|
|
|
7910
7921
|
};
|
|
7911
7922
|
}
|
|
7912
7923
|
|
|
7913
|
-
// node_modules/zod/v4/locales/hi.js
|
|
7924
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hi.js
|
|
7914
7925
|
var error21 = () => {
|
|
7915
7926
|
const Sizable = {
|
|
7916
7927
|
string: { unit: "\u0905\u0915\u094D\u0937\u0930", verb: "\u0930\u0916\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F" },
|
|
@@ -7951,6 +7962,7 @@ var error21 = () => {
|
|
|
7951
7962
|
json_string: "JSON \u0938\u094D\u091F\u094D\u0930\u093F\u0902\u0917",
|
|
7952
7963
|
e164: "E.164 \u0938\u0902\u0916\u094D\u092F\u093E",
|
|
7953
7964
|
credit_card: "\u0915\u094D\u0930\u0947\u0921\u093F\u091F \u0915\u093E\u0930\u094D\u0921 \u0938\u0902\u0916\u094D\u092F\u093E",
|
|
7965
|
+
currency_code: "\u092E\u0941\u0926\u094D\u0930\u093E \u0915\u094B\u0921",
|
|
7954
7966
|
iban: "IBAN",
|
|
7955
7967
|
jwt: "JWT",
|
|
7956
7968
|
template_literal: "\u0907\u0928\u092A\u0941\u091F"
|
|
@@ -8021,7 +8033,7 @@ function hi_default() {
|
|
|
8021
8033
|
};
|
|
8022
8034
|
}
|
|
8023
8035
|
|
|
8024
|
-
// node_modules/zod/v4/locales/hr.js
|
|
8036
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hr.js
|
|
8025
8037
|
var error22 = () => {
|
|
8026
8038
|
const Sizable = {
|
|
8027
8039
|
string: { unit: "znakova", verb: "imati" },
|
|
@@ -8061,6 +8073,7 @@ var error22 = () => {
|
|
|
8061
8073
|
json_string: "JSON tekst",
|
|
8062
8074
|
e164: "E.164 broj",
|
|
8063
8075
|
credit_card: "broj kreditne kartice",
|
|
8076
|
+
currency_code: "kod valute",
|
|
8064
8077
|
iban: "IBAN",
|
|
8065
8078
|
jwt: "JWT",
|
|
8066
8079
|
template_literal: "unos"
|
|
@@ -8147,7 +8160,7 @@ function hr_default() {
|
|
|
8147
8160
|
};
|
|
8148
8161
|
}
|
|
8149
8162
|
|
|
8150
|
-
// node_modules/zod/v4/locales/hu.js
|
|
8163
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hu.js
|
|
8151
8164
|
var error23 = () => {
|
|
8152
8165
|
const Sizable = {
|
|
8153
8166
|
string: { unit: "karakter", verb: "legyen" },
|
|
@@ -8188,6 +8201,7 @@ var error23 = () => {
|
|
|
8188
8201
|
json_string: "JSON string",
|
|
8189
8202
|
e164: "E.164 sz\xE1m",
|
|
8190
8203
|
credit_card: "hitelk\xE1rtyasz\xE1m",
|
|
8204
|
+
currency_code: "p\xE9nznemk\xF3d",
|
|
8191
8205
|
iban: "IBAN",
|
|
8192
8206
|
jwt: "JWT",
|
|
8193
8207
|
template_literal: "bemenet"
|
|
@@ -8260,7 +8274,7 @@ function hu_default() {
|
|
|
8260
8274
|
};
|
|
8261
8275
|
}
|
|
8262
8276
|
|
|
8263
|
-
// node_modules/zod/v4/locales/hy.js
|
|
8277
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hy.js
|
|
8264
8278
|
function getArmenianPlural(count, one, many) {
|
|
8265
8279
|
return Math.abs(count) === 1 ? one : many;
|
|
8266
8280
|
}
|
|
@@ -8341,6 +8355,7 @@ var error24 = () => {
|
|
|
8341
8355
|
json_string: "JSON \u057F\u0578\u0572",
|
|
8342
8356
|
e164: "E.164 \u0570\u0561\u0574\u0561\u0580",
|
|
8343
8357
|
credit_card: "\u056F\u0580\u0565\u0564\u056B\u057F \u0584\u0561\u0580\u057F\u056B \u0570\u0561\u0574\u0561\u0580",
|
|
8358
|
+
currency_code: "\u0561\u0580\u056A\u0578\u0582\u0575\u0569\u056B \u056F\u0578\u0564",
|
|
8344
8359
|
iban: "IBAN",
|
|
8345
8360
|
jwt: "JWT",
|
|
8346
8361
|
template_literal: "\u0574\u0578\u0582\u057F\u0584"
|
|
@@ -8418,7 +8433,7 @@ function hy_default() {
|
|
|
8418
8433
|
};
|
|
8419
8434
|
}
|
|
8420
8435
|
|
|
8421
|
-
// node_modules/zod/v4/locales/id.js
|
|
8436
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/id.js
|
|
8422
8437
|
var error25 = () => {
|
|
8423
8438
|
const Sizable = {
|
|
8424
8439
|
string: { unit: "karakter", verb: "memiliki" },
|
|
@@ -8459,6 +8474,7 @@ var error25 = () => {
|
|
|
8459
8474
|
json_string: "string JSON",
|
|
8460
8475
|
e164: "angka E.164",
|
|
8461
8476
|
credit_card: "nomor kartu kredit",
|
|
8477
|
+
currency_code: "kode mata uang",
|
|
8462
8478
|
iban: "IBAN",
|
|
8463
8479
|
jwt: "JWT",
|
|
8464
8480
|
template_literal: "input"
|
|
@@ -8529,7 +8545,7 @@ function id_default() {
|
|
|
8529
8545
|
};
|
|
8530
8546
|
}
|
|
8531
8547
|
|
|
8532
|
-
// node_modules/zod/v4/locales/is.js
|
|
8548
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/is.js
|
|
8533
8549
|
var error26 = () => {
|
|
8534
8550
|
const Sizable = {
|
|
8535
8551
|
string: { unit: "stafi", verb: "a\xF0 hafa" },
|
|
@@ -8570,6 +8586,7 @@ var error26 = () => {
|
|
|
8570
8586
|
json_string: "JSON strengur",
|
|
8571
8587
|
e164: "E.164 t\xF6lugildi",
|
|
8572
8588
|
credit_card: "kreditkortan\xFAmer",
|
|
8589
|
+
currency_code: "gjaldmi\xF0ilsk\xF3\xF0i",
|
|
8573
8590
|
iban: "IBAN",
|
|
8574
8591
|
jwt: "JWT",
|
|
8575
8592
|
template_literal: "gildi"
|
|
@@ -8643,7 +8660,7 @@ function is_default() {
|
|
|
8643
8660
|
};
|
|
8644
8661
|
}
|
|
8645
8662
|
|
|
8646
|
-
// node_modules/zod/v4/locales/it.js
|
|
8663
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/it.js
|
|
8647
8664
|
var error27 = () => {
|
|
8648
8665
|
const Sizable = {
|
|
8649
8666
|
string: { unit: "caratteri", verb: "avere" },
|
|
@@ -8684,6 +8701,7 @@ var error27 = () => {
|
|
|
8684
8701
|
json_string: "stringa JSON",
|
|
8685
8702
|
e164: "numero E.164",
|
|
8686
8703
|
credit_card: "numero di carta di credito",
|
|
8704
|
+
currency_code: "codice valuta",
|
|
8687
8705
|
iban: "IBAN",
|
|
8688
8706
|
jwt: "JWT",
|
|
8689
8707
|
template_literal: "input"
|
|
@@ -8756,7 +8774,7 @@ function it_default() {
|
|
|
8756
8774
|
};
|
|
8757
8775
|
}
|
|
8758
8776
|
|
|
8759
|
-
// node_modules/zod/v4/locales/ja.js
|
|
8777
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ja.js
|
|
8760
8778
|
var error28 = () => {
|
|
8761
8779
|
const Sizable = {
|
|
8762
8780
|
string: { unit: "\u6587\u5B57", verb: "\u3067\u3042\u308B" },
|
|
@@ -8797,6 +8815,7 @@ var error28 = () => {
|
|
|
8797
8815
|
json_string: "JSON\u6587\u5B57\u5217",
|
|
8798
8816
|
e164: "E.164\u756A\u53F7",
|
|
8799
8817
|
credit_card: "\u30AF\u30EC\u30B8\u30C3\u30C8\u30AB\u30FC\u30C9\u756A\u53F7",
|
|
8818
|
+
currency_code: "\u901A\u8CA8\u30B3\u30FC\u30C9",
|
|
8800
8819
|
iban: "IBAN",
|
|
8801
8820
|
jwt: "JWT",
|
|
8802
8821
|
template_literal: "\u5165\u529B\u5024"
|
|
@@ -8868,7 +8887,7 @@ function ja_default() {
|
|
|
8868
8887
|
};
|
|
8869
8888
|
}
|
|
8870
8889
|
|
|
8871
|
-
// node_modules/zod/v4/locales/ka.js
|
|
8890
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ka.js
|
|
8872
8891
|
var error29 = () => {
|
|
8873
8892
|
const Sizable = {
|
|
8874
8893
|
string: { unit: "\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD", verb: "\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1" },
|
|
@@ -8909,6 +8928,7 @@ var error29 = () => {
|
|
|
8909
8928
|
json_string: "JSON \u10D5\u10D4\u10DA\u10D8",
|
|
8910
8929
|
e164: "E.164 \u10DC\u10DD\u10DB\u10D4\u10E0\u10D8",
|
|
8911
8930
|
credit_card: "\u10E1\u10D0\u10D9\u10E0\u10D4\u10D3\u10D8\u10E2\u10DD \u10D1\u10D0\u10E0\u10D0\u10D7\u10D8\u10E1 \u10DC\u10DD\u10DB\u10D4\u10E0\u10D8",
|
|
8931
|
+
currency_code: "\u10D5\u10D0\u10DA\u10E3\u10E2\u10D8\u10E1 \u10D9\u10DD\u10D3\u10D8",
|
|
8912
8932
|
iban: "IBAN",
|
|
8913
8933
|
jwt: "JWT",
|
|
8914
8934
|
template_literal: "\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0"
|
|
@@ -8985,7 +9005,7 @@ function ka_default() {
|
|
|
8985
9005
|
};
|
|
8986
9006
|
}
|
|
8987
9007
|
|
|
8988
|
-
// node_modules/zod/v4/locales/km.js
|
|
9008
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/km.js
|
|
8989
9009
|
var error30 = () => {
|
|
8990
9010
|
const Sizable = {
|
|
8991
9011
|
string: { unit: "\u178F\u17BD\u17A2\u1780\u17D2\u179F\u179A", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" },
|
|
@@ -9026,6 +9046,7 @@ var error30 = () => {
|
|
|
9026
9046
|
json_string: "\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A JSON",
|
|
9027
9047
|
e164: "\u179B\u17C1\u1781 E.164",
|
|
9028
9048
|
credit_card: "\u179B\u17C1\u1781\u1794\u17D0\u178E\u17D2\u178E\u17A5\u178E\u1791\u17B6\u1793",
|
|
9049
|
+
currency_code: "\u1780\u17BC\u178A\u179A\u17BC\u1794\u17B7\u1799\u1794\u17D0\u178E\u17D2\u178E",
|
|
9029
9050
|
iban: "IBAN",
|
|
9030
9051
|
jwt: "JWT",
|
|
9031
9052
|
template_literal: "\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B"
|
|
@@ -9100,12 +9121,12 @@ function km_default() {
|
|
|
9100
9121
|
};
|
|
9101
9122
|
}
|
|
9102
9123
|
|
|
9103
|
-
// node_modules/zod/v4/locales/kh.js
|
|
9124
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kh.js
|
|
9104
9125
|
function kh_default() {
|
|
9105
9126
|
return km_default();
|
|
9106
9127
|
}
|
|
9107
9128
|
|
|
9108
|
-
// node_modules/zod/v4/locales/kn.js
|
|
9129
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kn.js
|
|
9109
9130
|
var error31 = () => {
|
|
9110
9131
|
const Sizable = {
|
|
9111
9132
|
string: { unit: "\u0C85\u0C95\u0CCD\u0CB7\u0CB0\u0C97\u0CB3\u0CC1", verb: "\u0CB9\u0CCA\u0C82\u0CA6\u0CB2\u0CC1" },
|
|
@@ -9146,6 +9167,7 @@ var error31 = () => {
|
|
|
9146
9167
|
json_string: "JSON\u0CB8\u0CCD\u0C9F\u0CCD\u0CB0\u0CBF\u0C82\u0C97\u0CCD",
|
|
9147
9168
|
e164: "E.164 \u0CB8\u0C82\u0C96\u0CCD\u0CAF\u0CC6",
|
|
9148
9169
|
credit_card: "\u0C95\u0CCD\u0CB0\u0CC6\u0CA1\u0CBF\u0C9F\u0CCD \u0C95\u0CBE\u0CB0\u0CCD\u0CA1\u0CCD \u0CB8\u0C82\u0C96\u0CCD\u0CAF\u0CC6",
|
|
9170
|
+
currency_code: "\u0C95\u0CB0\u0CC6\u0CA8\u0CCD\u0CB8\u0CBF \u0C95\u0CCB\u0CA1\u0CCD",
|
|
9149
9171
|
iban: "IBAN",
|
|
9150
9172
|
jwt: "JWT",
|
|
9151
9173
|
template_literal: "\u0C87\u0CA8\u0CCD\u0CAA\u0CC1\u0C9F\u0CCD"
|
|
@@ -9220,7 +9242,7 @@ function kn_default() {
|
|
|
9220
9242
|
};
|
|
9221
9243
|
}
|
|
9222
9244
|
|
|
9223
|
-
// node_modules/zod/v4/locales/ko.js
|
|
9245
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ko.js
|
|
9224
9246
|
var error32 = () => {
|
|
9225
9247
|
const Sizable = {
|
|
9226
9248
|
string: { unit: "\uBB38\uC790", verb: "to have" },
|
|
@@ -9261,6 +9283,7 @@ var error32 = () => {
|
|
|
9261
9283
|
json_string: "JSON \uBB38\uC790\uC5F4",
|
|
9262
9284
|
e164: "E.164 \uBC88\uD638",
|
|
9263
9285
|
credit_card: "\uC2E0\uC6A9\uCE74\uB4DC \uBC88\uD638",
|
|
9286
|
+
currency_code: "\uD1B5\uD654 \uCF54\uB4DC",
|
|
9264
9287
|
iban: "IBAN",
|
|
9265
9288
|
jwt: "JWT",
|
|
9266
9289
|
template_literal: "\uC785\uB825"
|
|
@@ -9336,7 +9359,7 @@ function ko_default() {
|
|
|
9336
9359
|
};
|
|
9337
9360
|
}
|
|
9338
9361
|
|
|
9339
|
-
// node_modules/zod/v4/locales/lt.js
|
|
9362
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/lt.js
|
|
9340
9363
|
var capitalizeFirstCharacter = (text) => {
|
|
9341
9364
|
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
9342
9365
|
};
|
|
@@ -9459,6 +9482,7 @@ var error33 = () => {
|
|
|
9459
9482
|
json_string: "JSON eilut\u0117",
|
|
9460
9483
|
e164: "E.164 numeris",
|
|
9461
9484
|
credit_card: "kredito kortel\u0117s numeris",
|
|
9485
|
+
currency_code: "valiutos kodas",
|
|
9462
9486
|
iban: "IBAN",
|
|
9463
9487
|
jwt: "JWT",
|
|
9464
9488
|
template_literal: "\u012Fvestis"
|
|
@@ -9543,7 +9567,7 @@ function lt_default() {
|
|
|
9543
9567
|
};
|
|
9544
9568
|
}
|
|
9545
9569
|
|
|
9546
|
-
// node_modules/zod/v4/locales/mk.js
|
|
9570
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/mk.js
|
|
9547
9571
|
var error34 = () => {
|
|
9548
9572
|
const Sizable = {
|
|
9549
9573
|
string: { unit: "\u0437\u043D\u0430\u0446\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" },
|
|
@@ -9584,6 +9608,7 @@ var error34 = () => {
|
|
|
9584
9608
|
json_string: "JSON \u043D\u0438\u0437\u0430",
|
|
9585
9609
|
e164: "E.164 \u0431\u0440\u043E\u0458",
|
|
9586
9610
|
credit_card: "\u0431\u0440\u043E\u0458 \u043D\u0430 \u043A\u0440\u0435\u0434\u0438\u0442\u043D\u0430 \u043A\u0430\u0440\u0442\u0438\u0447\u043A\u0430",
|
|
9611
|
+
currency_code: "\u043A\u043E\u0434 \u043D\u0430 \u0432\u0430\u043B\u0443\u0442\u0430",
|
|
9587
9612
|
iban: "IBAN",
|
|
9588
9613
|
jwt: "JWT",
|
|
9589
9614
|
template_literal: "\u0432\u043D\u0435\u0441"
|
|
@@ -9657,7 +9682,7 @@ function mk_default() {
|
|
|
9657
9682
|
};
|
|
9658
9683
|
}
|
|
9659
9684
|
|
|
9660
|
-
// node_modules/zod/v4/locales/ms.js
|
|
9685
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ms.js
|
|
9661
9686
|
var error35 = () => {
|
|
9662
9687
|
const Sizable = {
|
|
9663
9688
|
string: { unit: "aksara", verb: "mempunyai" },
|
|
@@ -9698,6 +9723,7 @@ var error35 = () => {
|
|
|
9698
9723
|
json_string: "string JSON",
|
|
9699
9724
|
e164: "nombor E.164",
|
|
9700
9725
|
credit_card: "nombor kad kredit",
|
|
9726
|
+
currency_code: "kod mata wang",
|
|
9701
9727
|
iban: "IBAN",
|
|
9702
9728
|
jwt: "JWT",
|
|
9703
9729
|
template_literal: "input"
|
|
@@ -9769,7 +9795,7 @@ function ms_default() {
|
|
|
9769
9795
|
};
|
|
9770
9796
|
}
|
|
9771
9797
|
|
|
9772
|
-
// node_modules/zod/v4/locales/ne.js
|
|
9798
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ne.js
|
|
9773
9799
|
var error36 = () => {
|
|
9774
9800
|
const Sizable = {
|
|
9775
9801
|
string: { unit: "\u0905\u0915\u094D\u0937\u0930", verb: "\u0939\u0941\u0928\u0941\u092A\u0930\u094D\u091B" },
|
|
@@ -9810,6 +9836,7 @@ var error36 = () => {
|
|
|
9810
9836
|
json_string: "JSON \u0938\u094D\u091F\u094D\u0930\u093F\u0919",
|
|
9811
9837
|
e164: "E.164 \u0928\u092E\u094D\u092C\u0930",
|
|
9812
9838
|
credit_card: "\u0915\u094D\u0930\u0947\u0921\u093F\u091F \u0915\u093E\u0930\u094D\u0921 \u0928\u092E\u094D\u092C\u0930",
|
|
9839
|
+
currency_code: "\u092E\u0941\u0926\u094D\u0930\u093E \u0915\u094B\u0921",
|
|
9813
9840
|
iban: "IBAN",
|
|
9814
9841
|
jwt: "JWT",
|
|
9815
9842
|
template_literal: "\u0907\u0928\u092A\u0941\u091F"
|
|
@@ -9880,7 +9907,7 @@ function ne_default() {
|
|
|
9880
9907
|
};
|
|
9881
9908
|
}
|
|
9882
9909
|
|
|
9883
|
-
// node_modules/zod/v4/locales/nl.js
|
|
9910
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nl.js
|
|
9884
9911
|
var error37 = () => {
|
|
9885
9912
|
const Sizable = {
|
|
9886
9913
|
string: { unit: "tekens", verb: "heeft" },
|
|
@@ -9921,6 +9948,7 @@ var error37 = () => {
|
|
|
9921
9948
|
json_string: "JSON string",
|
|
9922
9949
|
e164: "E.164-nummer",
|
|
9923
9950
|
credit_card: "creditcardnummer",
|
|
9951
|
+
currency_code: "valutacode",
|
|
9924
9952
|
iban: "IBAN",
|
|
9925
9953
|
jwt: "JWT",
|
|
9926
9954
|
template_literal: "invoer"
|
|
@@ -9995,7 +10023,7 @@ function nl_default() {
|
|
|
9995
10023
|
};
|
|
9996
10024
|
}
|
|
9997
10025
|
|
|
9998
|
-
// node_modules/zod/v4/locales/nn.js
|
|
10026
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nn.js
|
|
9999
10027
|
var error38 = () => {
|
|
10000
10028
|
const Sizable = {
|
|
10001
10029
|
string: { unit: "teikn", verb: "\xE5 ha" },
|
|
@@ -10036,6 +10064,7 @@ var error38 = () => {
|
|
|
10036
10064
|
json_string: "JSON-streng",
|
|
10037
10065
|
e164: "E.164-nummer",
|
|
10038
10066
|
credit_card: "kredittkortnummer",
|
|
10067
|
+
currency_code: "valutakode",
|
|
10039
10068
|
iban: "IBAN",
|
|
10040
10069
|
jwt: "JWT",
|
|
10041
10070
|
template_literal: "input"
|
|
@@ -10108,7 +10137,7 @@ function nn_default() {
|
|
|
10108
10137
|
};
|
|
10109
10138
|
}
|
|
10110
10139
|
|
|
10111
|
-
// node_modules/zod/v4/locales/no.js
|
|
10140
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/no.js
|
|
10112
10141
|
var error39 = () => {
|
|
10113
10142
|
const Sizable = {
|
|
10114
10143
|
string: { unit: "tegn", verb: "\xE5 ha" },
|
|
@@ -10149,6 +10178,7 @@ var error39 = () => {
|
|
|
10149
10178
|
json_string: "JSON-streng",
|
|
10150
10179
|
e164: "E.164-nummer",
|
|
10151
10180
|
credit_card: "kredittkortnummer",
|
|
10181
|
+
currency_code: "valutakode",
|
|
10152
10182
|
iban: "IBAN",
|
|
10153
10183
|
jwt: "JWT",
|
|
10154
10184
|
template_literal: "input"
|
|
@@ -10221,7 +10251,7 @@ function no_default() {
|
|
|
10221
10251
|
};
|
|
10222
10252
|
}
|
|
10223
10253
|
|
|
10224
|
-
// node_modules/zod/v4/locales/ota.js
|
|
10254
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ota.js
|
|
10225
10255
|
var error40 = () => {
|
|
10226
10256
|
const Sizable = {
|
|
10227
10257
|
string: { unit: "harf", verb: "olmal\u0131d\u0131r" },
|
|
@@ -10262,6 +10292,7 @@ var error40 = () => {
|
|
|
10262
10292
|
json_string: "JSON metin",
|
|
10263
10293
|
e164: "E.164 say\u0131s\u0131",
|
|
10264
10294
|
credit_card: "i'tib\xE2r kart\u0131 numaras\u0131",
|
|
10295
|
+
currency_code: "para birimi kodu",
|
|
10265
10296
|
iban: "IBAN",
|
|
10266
10297
|
jwt: "JWT",
|
|
10267
10298
|
template_literal: "giren"
|
|
@@ -10335,7 +10366,7 @@ function ota_default() {
|
|
|
10335
10366
|
};
|
|
10336
10367
|
}
|
|
10337
10368
|
|
|
10338
|
-
// node_modules/zod/v4/locales/ps.js
|
|
10369
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ps.js
|
|
10339
10370
|
var error41 = () => {
|
|
10340
10371
|
const Sizable = {
|
|
10341
10372
|
string: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" },
|
|
@@ -10376,6 +10407,7 @@ var error41 = () => {
|
|
|
10376
10407
|
json_string: "JSON \u0645\u062A\u0646",
|
|
10377
10408
|
e164: "\u062F E.164 \u0634\u0645\u06D0\u0631\u0647",
|
|
10378
10409
|
credit_card: "\u062F \u06A9\u0631\u06CC\u0689\u06CC\u067C \u06A9\u0627\u0631\u062A \u0634\u0645\u06CC\u0631\u0647",
|
|
10410
|
+
currency_code: "\u062F \u0627\u0633\u0639\u0627\u0631\u0648 \u06A9\u0648\u0689",
|
|
10379
10411
|
iban: "IBAN",
|
|
10380
10412
|
jwt: "JWT",
|
|
10381
10413
|
template_literal: "\u0648\u0631\u0648\u062F\u064A"
|
|
@@ -10454,7 +10486,7 @@ function ps_default() {
|
|
|
10454
10486
|
};
|
|
10455
10487
|
}
|
|
10456
10488
|
|
|
10457
|
-
// node_modules/zod/v4/locales/pl.js
|
|
10489
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pl.js
|
|
10458
10490
|
var error42 = () => {
|
|
10459
10491
|
const Sizable = {
|
|
10460
10492
|
string: { unit: "znak\xF3w", verb: "mie\u0107" },
|
|
@@ -10495,6 +10527,7 @@ var error42 = () => {
|
|
|
10495
10527
|
json_string: "ci\u0105g znak\xF3w w formacie JSON",
|
|
10496
10528
|
e164: "liczba E.164",
|
|
10497
10529
|
credit_card: "numer karty kredytowej",
|
|
10530
|
+
currency_code: "kod waluty",
|
|
10498
10531
|
iban: "IBAN",
|
|
10499
10532
|
jwt: "JWT",
|
|
10500
10533
|
template_literal: "wej\u015Bcie"
|
|
@@ -10568,7 +10601,7 @@ function pl_default() {
|
|
|
10568
10601
|
};
|
|
10569
10602
|
}
|
|
10570
10603
|
|
|
10571
|
-
// node_modules/zod/v4/locales/pt.js
|
|
10604
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt.js
|
|
10572
10605
|
var error43 = () => {
|
|
10573
10606
|
const Sizable = {
|
|
10574
10607
|
string: { unit: "caracteres" },
|
|
@@ -10609,6 +10642,7 @@ var error43 = () => {
|
|
|
10609
10642
|
json_string: "o texto JSON",
|
|
10610
10643
|
e164: "o n\xFAmero E.164",
|
|
10611
10644
|
credit_card: "o n\xFAmero de cart\xE3o de cr\xE9dito",
|
|
10645
|
+
currency_code: "o c\xF3digo de moeda",
|
|
10612
10646
|
iban: "o IBAN",
|
|
10613
10647
|
jwt: "o JWT",
|
|
10614
10648
|
template_literal: "a entrada"
|
|
@@ -10711,7 +10745,7 @@ function pt_default() {
|
|
|
10711
10745
|
};
|
|
10712
10746
|
}
|
|
10713
10747
|
|
|
10714
|
-
// node_modules/zod/v4/locales/pt-BR.js
|
|
10748
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt-BR.js
|
|
10715
10749
|
var error44 = () => {
|
|
10716
10750
|
const Sizable = {
|
|
10717
10751
|
string: { unit: "caracteres" },
|
|
@@ -10752,6 +10786,7 @@ var error44 = () => {
|
|
|
10752
10786
|
json_string: "o texto JSON",
|
|
10753
10787
|
e164: "o n\xFAmero E.164",
|
|
10754
10788
|
credit_card: "o n\xFAmero de cart\xE3o de cr\xE9dito",
|
|
10789
|
+
currency_code: "o c\xF3digo de moeda",
|
|
10755
10790
|
iban: "o IBAN",
|
|
10756
10791
|
jwt: "o JWT",
|
|
10757
10792
|
template_literal: "a entrada"
|
|
@@ -10855,7 +10890,7 @@ function pt_BR_default() {
|
|
|
10855
10890
|
};
|
|
10856
10891
|
}
|
|
10857
10892
|
|
|
10858
|
-
// node_modules/zod/v4/locales/ro.js
|
|
10893
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ro.js
|
|
10859
10894
|
var error45 = () => {
|
|
10860
10895
|
const Sizable = {
|
|
10861
10896
|
string: { unit: "caractere", verb: "s\u0103 aib\u0103" },
|
|
@@ -10896,6 +10931,7 @@ var error45 = () => {
|
|
|
10896
10931
|
json_string: "\u0219ir JSON",
|
|
10897
10932
|
e164: "num\u0103r E.164",
|
|
10898
10933
|
credit_card: "num\u0103r de card de credit",
|
|
10934
|
+
currency_code: "cod valutar",
|
|
10899
10935
|
iban: "IBAN",
|
|
10900
10936
|
jwt: "JWT",
|
|
10901
10937
|
template_literal: "intrare"
|
|
@@ -10977,7 +11013,7 @@ function ro_default() {
|
|
|
10977
11013
|
};
|
|
10978
11014
|
}
|
|
10979
11015
|
|
|
10980
|
-
// node_modules/zod/v4/locales/ru.js
|
|
11016
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ru.js
|
|
10981
11017
|
function getRussianPlural(count, one, few, many) {
|
|
10982
11018
|
const absCount = Math.abs(count);
|
|
10983
11019
|
const lastDigit = absCount % 10;
|
|
@@ -11068,6 +11104,7 @@ var error46 = () => {
|
|
|
11068
11104
|
json_string: "JSON \u0441\u0442\u0440\u043E\u043A\u0430",
|
|
11069
11105
|
e164: "\u043D\u043E\u043C\u0435\u0440 E.164",
|
|
11070
11106
|
credit_card: "\u043D\u043E\u043C\u0435\u0440 \u043A\u0440\u0435\u0434\u0438\u0442\u043D\u043E\u0439 \u043A\u0430\u0440\u0442\u044B",
|
|
11107
|
+
currency_code: "\u043A\u043E\u0434 \u0432\u0430\u043B\u044E\u0442\u044B",
|
|
11071
11108
|
iban: "IBAN",
|
|
11072
11109
|
jwt: "JWT",
|
|
11073
11110
|
template_literal: "\u0432\u0432\u043E\u0434"
|
|
@@ -11145,7 +11182,7 @@ function ru_default() {
|
|
|
11145
11182
|
};
|
|
11146
11183
|
}
|
|
11147
11184
|
|
|
11148
|
-
// node_modules/zod/v4/locales/sk.js
|
|
11185
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sk.js
|
|
11149
11186
|
var error47 = () => {
|
|
11150
11187
|
const Sizable = {
|
|
11151
11188
|
string: { unit: "znakov", verb: "ma\u0165" },
|
|
@@ -11186,6 +11223,7 @@ var error47 = () => {
|
|
|
11186
11223
|
json_string: "re\u0165azec vo form\xE1te JSON",
|
|
11187
11224
|
e164: "\u010D\xEDslo E.164",
|
|
11188
11225
|
credit_card: "\u010D\xEDslo kreditnej karty",
|
|
11226
|
+
currency_code: "k\xF3d meny",
|
|
11189
11227
|
iban: "IBAN",
|
|
11190
11228
|
jwt: "JWT",
|
|
11191
11229
|
template_literal: "vstup"
|
|
@@ -11261,7 +11299,7 @@ function sk_default() {
|
|
|
11261
11299
|
};
|
|
11262
11300
|
}
|
|
11263
11301
|
|
|
11264
|
-
// node_modules/zod/v4/locales/sl.js
|
|
11302
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sl.js
|
|
11265
11303
|
var error48 = () => {
|
|
11266
11304
|
const Sizable = {
|
|
11267
11305
|
string: { unit: "znakov", verb: "imeti" },
|
|
@@ -11302,6 +11340,7 @@ var error48 = () => {
|
|
|
11302
11340
|
json_string: "JSON niz",
|
|
11303
11341
|
e164: "E.164 \u0161tevilka",
|
|
11304
11342
|
credit_card: "\u0161tevilka kreditne kartice",
|
|
11343
|
+
currency_code: "koda valute",
|
|
11305
11344
|
iban: "IBAN",
|
|
11306
11345
|
jwt: "JWT",
|
|
11307
11346
|
template_literal: "vnos"
|
|
@@ -11375,7 +11414,7 @@ function sl_default() {
|
|
|
11375
11414
|
};
|
|
11376
11415
|
}
|
|
11377
11416
|
|
|
11378
|
-
// node_modules/zod/v4/locales/sv.js
|
|
11417
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sv.js
|
|
11379
11418
|
var error49 = () => {
|
|
11380
11419
|
const Sizable = {
|
|
11381
11420
|
string: { unit: "tecken", verb: "att ha" },
|
|
@@ -11416,6 +11455,7 @@ var error49 = () => {
|
|
|
11416
11455
|
json_string: "JSON-str\xE4ng",
|
|
11417
11456
|
e164: "E.164-nummer",
|
|
11418
11457
|
credit_card: "kreditkortsnummer",
|
|
11458
|
+
currency_code: "valutakod",
|
|
11419
11459
|
iban: "IBAN",
|
|
11420
11460
|
jwt: "JWT",
|
|
11421
11461
|
template_literal: "mall-literal"
|
|
@@ -11490,7 +11530,7 @@ function sv_default() {
|
|
|
11490
11530
|
};
|
|
11491
11531
|
}
|
|
11492
11532
|
|
|
11493
|
-
// node_modules/zod/v4/locales/ta.js
|
|
11533
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ta.js
|
|
11494
11534
|
var error50 = () => {
|
|
11495
11535
|
const Sizable = {
|
|
11496
11536
|
string: { unit: "\u0B8E\u0BB4\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BCD\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" },
|
|
@@ -11531,6 +11571,7 @@ var error50 = () => {
|
|
|
11531
11571
|
json_string: "JSON \u0B9A\u0BB0\u0BAE\u0BCD",
|
|
11532
11572
|
e164: "E.164 \u0B8E\u0BA3\u0BCD",
|
|
11533
11573
|
credit_card: "\u0B95\u0B9F\u0BA9\u0BCD \u0B85\u0B9F\u0BCD\u0B9F\u0BC8 \u0B8E\u0BA3\u0BCD",
|
|
11574
|
+
currency_code: "\u0BA8\u0BBE\u0BA3\u0BAF\u0B95\u0BCD \u0B95\u0BC1\u0BB1\u0BBF\u0BAF\u0BC0\u0B9F\u0BC1",
|
|
11534
11575
|
iban: "IBAN",
|
|
11535
11576
|
jwt: "JWT",
|
|
11536
11577
|
template_literal: "input"
|
|
@@ -11605,7 +11646,7 @@ function ta_default() {
|
|
|
11605
11646
|
};
|
|
11606
11647
|
}
|
|
11607
11648
|
|
|
11608
|
-
// node_modules/zod/v4/locales/tg.js
|
|
11649
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tg.js
|
|
11609
11650
|
var error51 = () => {
|
|
11610
11651
|
const Sizable = {
|
|
11611
11652
|
string: { unit: "\u0430\u043B\u043E\u043C\u0430\u0442", verb: "\u0434\u043E\u0448\u0442\u0430 \u0431\u043E\u0448\u0430\u0434" },
|
|
@@ -11646,6 +11687,7 @@ var error51 = () => {
|
|
|
11646
11687
|
json_string: "\u0441\u0430\u0442\u0440\u0438 JSON",
|
|
11647
11688
|
e164: "\u0440\u0430\u049B\u0430\u043C\u0438 E.164",
|
|
11648
11689
|
credit_card: "\u0440\u0430\u049B\u0430\u043C\u0438 \u043A\u043E\u0440\u0442\u0438 \u043A\u0440\u0435\u0434\u0438\u0442\u04E3",
|
|
11690
|
+
currency_code: "\u0440\u0430\u043C\u0437\u0438 \u0430\u0441\u044A\u043E\u0440",
|
|
11649
11691
|
iban: "IBAN",
|
|
11650
11692
|
jwt: "JWT",
|
|
11651
11693
|
template_literal: "\u0432\u0443\u0440\u0443\u0434"
|
|
@@ -11721,7 +11763,7 @@ function tg_default() {
|
|
|
11721
11763
|
};
|
|
11722
11764
|
}
|
|
11723
11765
|
|
|
11724
|
-
// node_modules/zod/v4/locales/th.js
|
|
11766
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/th.js
|
|
11725
11767
|
var error52 = () => {
|
|
11726
11768
|
const Sizable = {
|
|
11727
11769
|
string: { unit: "\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" },
|
|
@@ -11762,6 +11804,7 @@ var error52 = () => {
|
|
|
11762
11804
|
json_string: "\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A JSON",
|
|
11763
11805
|
e164: "\u0E40\u0E1A\u0E2D\u0E23\u0E4C\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E23\u0E30\u0E2B\u0E27\u0E48\u0E32\u0E07\u0E1B\u0E23\u0E30\u0E40\u0E17\u0E28 (E.164)",
|
|
11764
11806
|
credit_card: "\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E25\u0E02\u0E1A\u0E31\u0E15\u0E23\u0E40\u0E04\u0E23\u0E14\u0E34\u0E15",
|
|
11807
|
+
currency_code: "\u0E23\u0E2B\u0E31\u0E2A\u0E2A\u0E01\u0E38\u0E25\u0E40\u0E07\u0E34\u0E19",
|
|
11765
11808
|
iban: "IBAN",
|
|
11766
11809
|
jwt: "\u0E42\u0E17\u0E40\u0E04\u0E19 JWT",
|
|
11767
11810
|
template_literal: "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19"
|
|
@@ -11836,7 +11879,7 @@ function th_default() {
|
|
|
11836
11879
|
};
|
|
11837
11880
|
}
|
|
11838
11881
|
|
|
11839
|
-
// node_modules/zod/v4/locales/tk.js
|
|
11882
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tk.js
|
|
11840
11883
|
var error53 = () => {
|
|
11841
11884
|
const Sizable = {
|
|
11842
11885
|
string: { unit: "simwol", verb: "bolmaly" },
|
|
@@ -11877,6 +11920,7 @@ var error53 = () => {
|
|
|
11877
11920
|
json_string: "JSON setiri",
|
|
11878
11921
|
e164: "E.164 nomeri",
|
|
11879
11922
|
credit_card: "kredit kartyny\u0148 nomeri",
|
|
11923
|
+
currency_code: "wal\xFDuta kody",
|
|
11880
11924
|
iban: "IBAN",
|
|
11881
11925
|
jwt: "JWT",
|
|
11882
11926
|
template_literal: "\u015Fablon"
|
|
@@ -11943,7 +11987,7 @@ function tk_default() {
|
|
|
11943
11987
|
};
|
|
11944
11988
|
}
|
|
11945
11989
|
|
|
11946
|
-
// node_modules/zod/v4/locales/tr.js
|
|
11990
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tr.js
|
|
11947
11991
|
var error54 = () => {
|
|
11948
11992
|
const Sizable = {
|
|
11949
11993
|
string: { unit: "karakter", verb: "olmal\u0131" },
|
|
@@ -11984,6 +12028,7 @@ var error54 = () => {
|
|
|
11984
12028
|
json_string: "JSON dizesi",
|
|
11985
12029
|
e164: "E.164 say\u0131s\u0131",
|
|
11986
12030
|
credit_card: "kredi kart\u0131 numaras\u0131",
|
|
12031
|
+
currency_code: "para birimi kodu",
|
|
11987
12032
|
iban: "IBAN",
|
|
11988
12033
|
jwt: "JWT",
|
|
11989
12034
|
template_literal: "\u015Eablon dizesi"
|
|
@@ -12053,7 +12098,7 @@ function tr_default() {
|
|
|
12053
12098
|
};
|
|
12054
12099
|
}
|
|
12055
12100
|
|
|
12056
|
-
// node_modules/zod/v4/locales/uk.js
|
|
12101
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uk.js
|
|
12057
12102
|
var error55 = () => {
|
|
12058
12103
|
const Sizable = {
|
|
12059
12104
|
string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" },
|
|
@@ -12094,6 +12139,7 @@ var error55 = () => {
|
|
|
12094
12139
|
json_string: "\u0440\u044F\u0434\u043E\u043A JSON",
|
|
12095
12140
|
e164: "\u043D\u043E\u043C\u0435\u0440 E.164",
|
|
12096
12141
|
credit_card: "\u043D\u043E\u043C\u0435\u0440 \u043A\u0440\u0435\u0434\u0438\u0442\u043D\u043E\u0457 \u043A\u0430\u0440\u0442\u043A\u0438",
|
|
12142
|
+
currency_code: "\u043A\u043E\u0434 \u0432\u0430\u043B\u044E\u0442\u0438",
|
|
12097
12143
|
iban: "IBAN",
|
|
12098
12144
|
jwt: "JWT",
|
|
12099
12145
|
template_literal: "\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456"
|
|
@@ -12166,12 +12212,12 @@ function uk_default() {
|
|
|
12166
12212
|
};
|
|
12167
12213
|
}
|
|
12168
12214
|
|
|
12169
|
-
// node_modules/zod/v4/locales/ua.js
|
|
12215
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ua.js
|
|
12170
12216
|
function ua_default() {
|
|
12171
12217
|
return uk_default();
|
|
12172
12218
|
}
|
|
12173
12219
|
|
|
12174
|
-
// node_modules/zod/v4/locales/ur.js
|
|
12220
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ur.js
|
|
12175
12221
|
var error56 = () => {
|
|
12176
12222
|
const Sizable = {
|
|
12177
12223
|
string: { unit: "\u062D\u0631\u0648\u0641", verb: "\u06C1\u0648\u0646\u0627" },
|
|
@@ -12212,6 +12258,7 @@ var error56 = () => {
|
|
|
12212
12258
|
json_string: "\u062C\u06D2 \u0627\u06CC\u0633 \u0627\u0648 \u0627\u06CC\u0646 \u0633\u0679\u0631\u0646\u06AF",
|
|
12213
12259
|
e164: "\u0627\u06CC 164 \u0646\u0645\u0628\u0631",
|
|
12214
12260
|
credit_card: "\u06A9\u0631\u06CC\u0688\u0679 \u06A9\u0627\u0631\u0688 \u0646\u0645\u0628\u0631",
|
|
12261
|
+
currency_code: "\u06A9\u0631\u0646\u0633\u06CC \u06A9\u0648\u0688",
|
|
12215
12262
|
iban: "IBAN",
|
|
12216
12263
|
jwt: "\u062C\u06D2 \u0688\u0628\u0644\u06CC\u0648 \u0679\u06CC",
|
|
12217
12264
|
template_literal: "\u0627\u0646 \u067E\u0679"
|
|
@@ -12286,7 +12333,7 @@ function ur_default() {
|
|
|
12286
12333
|
};
|
|
12287
12334
|
}
|
|
12288
12335
|
|
|
12289
|
-
// node_modules/zod/v4/locales/uz.js
|
|
12336
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uz.js
|
|
12290
12337
|
var error57 = () => {
|
|
12291
12338
|
const Sizable = {
|
|
12292
12339
|
string: { unit: "belgi", verb: "bo\u2018lishi kerak" },
|
|
@@ -12327,6 +12374,7 @@ var error57 = () => {
|
|
|
12327
12374
|
json_string: "JSON satr",
|
|
12328
12375
|
e164: "E.164 raqam",
|
|
12329
12376
|
credit_card: "kredit karta raqami",
|
|
12377
|
+
currency_code: "valyuta kodi",
|
|
12330
12378
|
iban: "IBAN",
|
|
12331
12379
|
jwt: "JWT",
|
|
12332
12380
|
template_literal: "kirish"
|
|
@@ -12399,7 +12447,7 @@ function uz_default() {
|
|
|
12399
12447
|
};
|
|
12400
12448
|
}
|
|
12401
12449
|
|
|
12402
|
-
// node_modules/zod/v4/locales/vi.js
|
|
12450
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/vi.js
|
|
12403
12451
|
var error58 = () => {
|
|
12404
12452
|
const Sizable = {
|
|
12405
12453
|
string: { unit: "k\xFD t\u1EF1", verb: "c\xF3" },
|
|
@@ -12440,6 +12488,7 @@ var error58 = () => {
|
|
|
12440
12488
|
json_string: "chu\u1ED7i JSON",
|
|
12441
12489
|
e164: "s\u1ED1 E.164",
|
|
12442
12490
|
credit_card: "s\u1ED1 th\u1EBB t\xEDn d\u1EE5ng",
|
|
12491
|
+
currency_code: "m\xE3 ti\u1EC1n t\u1EC7",
|
|
12443
12492
|
iban: "IBAN",
|
|
12444
12493
|
jwt: "JWT",
|
|
12445
12494
|
template_literal: "\u0111\u1EA7u v\xE0o"
|
|
@@ -12512,7 +12561,7 @@ function vi_default() {
|
|
|
12512
12561
|
};
|
|
12513
12562
|
}
|
|
12514
12563
|
|
|
12515
|
-
// node_modules/zod/v4/locales/zh-CN.js
|
|
12564
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-CN.js
|
|
12516
12565
|
var error59 = () => {
|
|
12517
12566
|
const Sizable = {
|
|
12518
12567
|
string: { unit: "\u5B57\u7B26", verb: "\u5305\u542B" },
|
|
@@ -12553,6 +12602,7 @@ var error59 = () => {
|
|
|
12553
12602
|
json_string: "JSON\u5B57\u7B26\u4E32",
|
|
12554
12603
|
e164: "E.164\u53F7\u7801",
|
|
12555
12604
|
credit_card: "\u4FE1\u7528\u5361\u53F7",
|
|
12605
|
+
currency_code: "\u8D27\u5E01\u4EE3\u7801",
|
|
12556
12606
|
iban: "IBAN",
|
|
12557
12607
|
jwt: "JWT",
|
|
12558
12608
|
template_literal: "\u8F93\u5165"
|
|
@@ -12626,7 +12676,7 @@ function zh_CN_default() {
|
|
|
12626
12676
|
};
|
|
12627
12677
|
}
|
|
12628
12678
|
|
|
12629
|
-
// node_modules/zod/v4/locales/zh-TW.js
|
|
12679
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-TW.js
|
|
12630
12680
|
var error60 = () => {
|
|
12631
12681
|
const Sizable = {
|
|
12632
12682
|
string: { unit: "\u5B57\u5143", verb: "\u64C1\u6709" },
|
|
@@ -12667,6 +12717,7 @@ var error60 = () => {
|
|
|
12667
12717
|
json_string: "JSON \u5B57\u4E32",
|
|
12668
12718
|
e164: "E.164 \u6578\u503C",
|
|
12669
12719
|
credit_card: "\u4FE1\u7528\u5361\u865F",
|
|
12720
|
+
currency_code: "\u8CA8\u5E63\u4EE3\u78BC",
|
|
12670
12721
|
iban: "IBAN",
|
|
12671
12722
|
jwt: "JWT",
|
|
12672
12723
|
template_literal: "\u8F38\u5165"
|
|
@@ -12738,7 +12789,7 @@ function zh_TW_default() {
|
|
|
12738
12789
|
};
|
|
12739
12790
|
}
|
|
12740
12791
|
|
|
12741
|
-
// node_modules/zod/v4/locales/yo.js
|
|
12792
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/yo.js
|
|
12742
12793
|
var error61 = () => {
|
|
12743
12794
|
const Sizable = {
|
|
12744
12795
|
string: { unit: "\xE0mi", verb: "n\xED" },
|
|
@@ -12779,6 +12830,7 @@ var error61 = () => {
|
|
|
12779
12830
|
json_string: "\u1ECD\u0300r\u1ECD\u0300 JSON",
|
|
12780
12831
|
e164: "n\u1ECD\u0301mb\xE0 E.164",
|
|
12781
12832
|
credit_card: "n\u1ECDmba kaadi gbese",
|
|
12833
|
+
currency_code: "koodu ow\xF3",
|
|
12782
12834
|
iban: "IBAN",
|
|
12783
12835
|
jwt: "JWT",
|
|
12784
12836
|
template_literal: "\u1EB9\u0300r\u1ECD \xECb\xE1w\u1ECDl\xE9"
|
|
@@ -12850,7 +12902,7 @@ function yo_default() {
|
|
|
12850
12902
|
};
|
|
12851
12903
|
}
|
|
12852
12904
|
|
|
12853
|
-
// node_modules/zod/v4/core/registries.js
|
|
12905
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/registries.js
|
|
12854
12906
|
var _a2;
|
|
12855
12907
|
var $output = /* @__PURE__ */ Symbol("ZodOutput");
|
|
12856
12908
|
var $input = /* @__PURE__ */ Symbol("ZodInput");
|
|
@@ -12900,7 +12952,7 @@ function registry() {
|
|
|
12900
12952
|
(_a2 = globalThis).__zod_globalRegistry ?? (_a2.__zod_globalRegistry = registry());
|
|
12901
12953
|
var globalRegistry = globalThis.__zod_globalRegistry;
|
|
12902
12954
|
|
|
12903
|
-
// node_modules/zod/v4/core/compile.js
|
|
12955
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/compile.js
|
|
12904
12956
|
var INVALID = Symbol.for("zod.compile.invalid");
|
|
12905
12957
|
var FALLBACK_FLAG = Symbol.for("zod.compile.fallback");
|
|
12906
12958
|
var ZodCompileAsyncError = class extends Error {
|
|
@@ -13157,7 +13209,7 @@ function generateChecks(doc, ctx, schema, accessor) {
|
|
|
13157
13209
|
generatePropertyCheck(doc, ctx, def, currentAccessor);
|
|
13158
13210
|
break;
|
|
13159
13211
|
case "properties":
|
|
13160
|
-
generatePropertiesChecks(doc, ctx, def, currentAccessor
|
|
13212
|
+
generatePropertiesChecks(doc, ctx, def, currentAccessor);
|
|
13161
13213
|
break;
|
|
13162
13214
|
case "overwrite": {
|
|
13163
13215
|
const newAccessor = newVar(ctx);
|
|
@@ -13267,11 +13319,11 @@ function generateMimeTypeCheck(doc, ctx, def, accessor) {
|
|
|
13267
13319
|
doc.write(`if (!${mimeSet}.has(${accessor}.type)) return INVALID;`);
|
|
13268
13320
|
}
|
|
13269
13321
|
}
|
|
13270
|
-
function generatePropertiesChecks(doc, ctx, def, accessor
|
|
13322
|
+
function generatePropertiesChecks(doc, ctx, def, accessor) {
|
|
13271
13323
|
if (def.when) {
|
|
13272
13324
|
throw new ZodCompileUnsupportedError(`check with a custom "when" condition`);
|
|
13273
13325
|
}
|
|
13274
|
-
doc.write(
|
|
13326
|
+
doc.write(`if (${accessor} == null) return INVALID;`);
|
|
13275
13327
|
const shape = def.shape;
|
|
13276
13328
|
for (const key of Reflect.ownKeys(shape)) {
|
|
13277
13329
|
const keyExpr = typeof key === "symbol" ? addConstant(ctx, key) : esc(key);
|
|
@@ -13361,7 +13413,7 @@ var PATTERN_IS_COMPLETE = /* @__PURE__ */ new Set([
|
|
|
13361
13413
|
"uuid",
|
|
13362
13414
|
"xid"
|
|
13363
13415
|
]);
|
|
13364
|
-
function generateStringFormatCheck(doc, ctx, def, accessor) {
|
|
13416
|
+
function generateStringFormatCheck(doc, ctx, def, accessor, needsValue = true) {
|
|
13365
13417
|
const fmt = def.format;
|
|
13366
13418
|
if (fmt === "base64") {
|
|
13367
13419
|
const validator = addConstant(ctx, isValidBase64);
|
|
@@ -13401,7 +13453,7 @@ function generateStringFormatCheck(doc, ctx, def, accessor) {
|
|
|
13401
13453
|
}
|
|
13402
13454
|
const formatDef = def;
|
|
13403
13455
|
if (fmt === "url" || fmt === "httpurl" || formatDef.normalize || formatDef.hostname !== void 0 || formatDef.protocol !== void 0) {
|
|
13404
|
-
const parseConst = addConstant(ctx,
|
|
13456
|
+
const parseConst = addConstant(ctx, validateURL);
|
|
13405
13457
|
const defConst = addConstant(ctx, def);
|
|
13406
13458
|
const trimVar = newVar(ctx);
|
|
13407
13459
|
const urlVar = newVar(ctx);
|
|
@@ -13416,6 +13468,8 @@ function generateStringFormatCheck(doc, ctx, def, accessor) {
|
|
|
13416
13468
|
const protocolConst = addConstant(ctx, urlProtocolOk);
|
|
13417
13469
|
doc.write(`if (!${protocolConst}(${urlVar}, ${defConst}.protocol)) return INVALID;`);
|
|
13418
13470
|
}
|
|
13471
|
+
if (!needsValue)
|
|
13472
|
+
return null;
|
|
13419
13473
|
const outputVar = newVar(ctx);
|
|
13420
13474
|
const outputExpr = formatDef.normalize ? `${urlVar}.href` : `${addConstant(ctx, stripTabAndNewline)}(${trimVar})`;
|
|
13421
13475
|
doc.write(`const ${outputVar} = ${outputExpr};`);
|
|
@@ -13475,7 +13529,7 @@ function generateCheck(doc, ctx, schema, accessor, needsValue = true) {
|
|
|
13475
13529
|
let typeAccessor;
|
|
13476
13530
|
switch (type) {
|
|
13477
13531
|
case "string":
|
|
13478
|
-
typeAccessor = generateStringCheck(doc, ctx, schema, accessor);
|
|
13532
|
+
typeAccessor = generateStringCheck(doc, ctx, schema, accessor, buildsValue);
|
|
13479
13533
|
break;
|
|
13480
13534
|
case "number":
|
|
13481
13535
|
typeAccessor = generateNumberCheck(doc, schema, accessor);
|
|
@@ -13581,10 +13635,6 @@ function generateCheck(doc, ctx, schema, accessor, needsValue = true) {
|
|
|
13581
13635
|
case "custom":
|
|
13582
13636
|
typeAccessor = generateCustomCheck(doc, ctx, schema, accessor);
|
|
13583
13637
|
break;
|
|
13584
|
-
case "properties":
|
|
13585
|
-
generatePropertiesChecks(doc, ctx, schema._zod.def, accessor, true);
|
|
13586
|
-
typeAccessor = accessor;
|
|
13587
|
-
break;
|
|
13588
13638
|
case "transform":
|
|
13589
13639
|
typeAccessor = generateTransformCheck(doc, ctx, schema, accessor);
|
|
13590
13640
|
break;
|
|
@@ -13600,12 +13650,12 @@ function generateCheck(doc, ctx, schema, accessor, needsValue = true) {
|
|
|
13600
13650
|
return null;
|
|
13601
13651
|
return generateChecks(doc, ctx, schema, typeAccessor);
|
|
13602
13652
|
}
|
|
13603
|
-
function generateStringCheck(doc, ctx, schema, accessor) {
|
|
13653
|
+
function generateStringCheck(doc, ctx, schema, accessor, needsValue = true) {
|
|
13604
13654
|
doc.write(`if (typeof ${accessor} !== "string") return INVALID;`);
|
|
13605
13655
|
const def = schema._zod.def;
|
|
13606
13656
|
if (def.format === void 0)
|
|
13607
13657
|
return accessor;
|
|
13608
|
-
return generateStringFormatCheck(doc, ctx, def, accessor);
|
|
13658
|
+
return generateStringFormatCheck(doc, ctx, def, accessor, needsValue);
|
|
13609
13659
|
}
|
|
13610
13660
|
function generateNumberCheck(doc, schema, accessor) {
|
|
13611
13661
|
doc.write(`if (typeof ${accessor} !== "number" || !Number.isFinite(${accessor})) return INVALID;`);
|
|
@@ -14504,21 +14554,19 @@ function generateTransformCheck(doc, ctx, schema, accessor) {
|
|
|
14504
14554
|
return accessor;
|
|
14505
14555
|
}
|
|
14506
14556
|
|
|
14507
|
-
// node_modules/zod/v4/core/api.js
|
|
14557
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/api.js
|
|
14558
|
+
function snapshotChecks(def) {
|
|
14559
|
+
if (def.checks)
|
|
14560
|
+
def.checks = [...def.checks];
|
|
14561
|
+
return def;
|
|
14562
|
+
}
|
|
14508
14563
|
// @__NO_SIDE_EFFECTS__
|
|
14509
14564
|
function _string(Class2, params) {
|
|
14510
|
-
return new Class2({
|
|
14511
|
-
type: "string",
|
|
14512
|
-
...normalizeParams(params)
|
|
14513
|
-
});
|
|
14565
|
+
return new Class2(snapshotChecks({ type: "string", ...normalizeParams(params) }));
|
|
14514
14566
|
}
|
|
14515
14567
|
// @__NO_SIDE_EFFECTS__
|
|
14516
14568
|
function _coercedString(Class2, params) {
|
|
14517
|
-
return new Class2({
|
|
14518
|
-
type: "string",
|
|
14519
|
-
coerce: true,
|
|
14520
|
-
...normalizeParams(params)
|
|
14521
|
-
});
|
|
14569
|
+
return new Class2(snapshotChecks({ type: "string", coerce: true, ...normalizeParams(params) }));
|
|
14522
14570
|
}
|
|
14523
14571
|
// @__NO_SIDE_EFFECTS__
|
|
14524
14572
|
function _email(Class2, params) {
|
|
@@ -14822,20 +14870,11 @@ function _isoDuration(Class2, params) {
|
|
|
14822
14870
|
}
|
|
14823
14871
|
// @__NO_SIDE_EFFECTS__
|
|
14824
14872
|
function _number(Class2, params) {
|
|
14825
|
-
return new Class2({
|
|
14826
|
-
type: "number",
|
|
14827
|
-
checks: [],
|
|
14828
|
-
...normalizeParams(params)
|
|
14829
|
-
});
|
|
14873
|
+
return new Class2(snapshotChecks({ type: "number", checks: [], ...normalizeParams(params) }));
|
|
14830
14874
|
}
|
|
14831
14875
|
// @__NO_SIDE_EFFECTS__
|
|
14832
14876
|
function _coercedNumber(Class2, params) {
|
|
14833
|
-
return new Class2({
|
|
14834
|
-
type: "number",
|
|
14835
|
-
coerce: true,
|
|
14836
|
-
checks: [],
|
|
14837
|
-
...normalizeParams(params)
|
|
14838
|
-
});
|
|
14877
|
+
return new Class2(snapshotChecks({ type: "number", coerce: true, checks: [], ...normalizeParams(params) }));
|
|
14839
14878
|
}
|
|
14840
14879
|
// @__NO_SIDE_EFFECTS__
|
|
14841
14880
|
function _int(Class2, params) {
|
|
@@ -15177,9 +15216,8 @@ function _property(property, schema, params) {
|
|
|
15177
15216
|
});
|
|
15178
15217
|
}
|
|
15179
15218
|
// @__NO_SIDE_EFFECTS__
|
|
15180
|
-
function _properties(
|
|
15181
|
-
return new
|
|
15182
|
-
type: "properties",
|
|
15219
|
+
function _properties(shape, params) {
|
|
15220
|
+
return new $ZodCheckProperties({
|
|
15183
15221
|
check: "properties",
|
|
15184
15222
|
shape,
|
|
15185
15223
|
...normalizeParams(params)
|
|
@@ -15575,7 +15613,7 @@ function _stringFormat(Class2, format, fnOrRegex, _params = {}) {
|
|
|
15575
15613
|
return inst;
|
|
15576
15614
|
}
|
|
15577
15615
|
|
|
15578
|
-
// node_modules/zod/v4/core/to-json-schema.js
|
|
15616
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/to-json-schema.js
|
|
15579
15617
|
function assignProps(target, ...sources) {
|
|
15580
15618
|
for (const source of sources) {
|
|
15581
15619
|
for (const key of Reflect.ownKeys(source)) {
|
|
@@ -15814,11 +15852,11 @@ function foldObjects(members2) {
|
|
|
15814
15852
|
}
|
|
15815
15853
|
objects.push(member);
|
|
15816
15854
|
}
|
|
15817
|
-
const
|
|
15855
|
+
const properties = {};
|
|
15818
15856
|
const required2 = /* @__PURE__ */ new Set();
|
|
15819
15857
|
for (const object2 of objects) {
|
|
15820
15858
|
for (const key in object2.properties) {
|
|
15821
|
-
if (Object.prototype.hasOwnProperty.call(
|
|
15859
|
+
if (Object.prototype.hasOwnProperty.call(properties, key))
|
|
15822
15860
|
continue;
|
|
15823
15861
|
const parts = [];
|
|
15824
15862
|
for (const other of objects) {
|
|
@@ -15829,12 +15867,12 @@ function foldObjects(members2) {
|
|
|
15829
15867
|
parts.push(part);
|
|
15830
15868
|
}
|
|
15831
15869
|
const merged = parts.length === 1 ? parts[0] : foldObjects(parts) ?? { allOf: parts };
|
|
15832
|
-
assignProp(
|
|
15870
|
+
assignProp(properties, key, merged);
|
|
15833
15871
|
}
|
|
15834
15872
|
for (const key of object2.required ?? [])
|
|
15835
15873
|
required2.add(key);
|
|
15836
15874
|
}
|
|
15837
|
-
const folded = { type: "object", properties
|
|
15875
|
+
const folded = { type: "object", properties };
|
|
15838
15876
|
if (required2.size)
|
|
15839
15877
|
folded.required = [...required2];
|
|
15840
15878
|
if (objects.every((object2) => object2.additionalProperties === false)) {
|
|
@@ -16105,7 +16143,7 @@ var createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) =
|
|
|
16105
16143
|
return finalize(ctx, schema);
|
|
16106
16144
|
};
|
|
16107
16145
|
|
|
16108
|
-
// node_modules/zod/v4/core/json-schema-processors.js
|
|
16146
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-processors.js
|
|
16109
16147
|
var narrowMin = (agg, key, value) => {
|
|
16110
16148
|
if (agg[key] === void 0 || value > agg[key])
|
|
16111
16149
|
agg[key] = value;
|
|
@@ -16456,17 +16494,15 @@ var objectProcessor = (schema, ctx, _json, params) => {
|
|
|
16456
16494
|
path: [...params.path, "properties", key]
|
|
16457
16495
|
}));
|
|
16458
16496
|
}
|
|
16459
|
-
const
|
|
16460
|
-
const
|
|
16497
|
+
const requiredKeys = [];
|
|
16498
|
+
for (const key of Object.keys(shape)) {
|
|
16461
16499
|
const field = def.shape[key];
|
|
16462
|
-
if (ctx.io === "input") {
|
|
16463
|
-
|
|
16464
|
-
} else {
|
|
16465
|
-
return field._zod.optout === void 0;
|
|
16500
|
+
if (ctx.io === "input" ? inputOptin(field) === void 0 : field._zod.optout === void 0) {
|
|
16501
|
+
requiredKeys.push(key);
|
|
16466
16502
|
}
|
|
16467
|
-
}
|
|
16468
|
-
if (requiredKeys.
|
|
16469
|
-
json2.required =
|
|
16503
|
+
}
|
|
16504
|
+
if (requiredKeys.length > 0) {
|
|
16505
|
+
json2.required = requiredKeys;
|
|
16470
16506
|
}
|
|
16471
16507
|
if (def.catchall?._zod.def.type === "never") {
|
|
16472
16508
|
json2.additionalProperties = false;
|
|
@@ -16480,31 +16516,6 @@ var objectProcessor = (schema, ctx, _json, params) => {
|
|
|
16480
16516
|
});
|
|
16481
16517
|
}
|
|
16482
16518
|
};
|
|
16483
|
-
var propertiesProcessor = (schema, ctx, _json, params) => {
|
|
16484
|
-
const json2 = _json;
|
|
16485
|
-
const def = schema._zod.def;
|
|
16486
|
-
if (Object.getOwnPropertySymbols(def.shape).length && handleUnrepresentable(schema, ctx, json2, params, "Symbol keys cannot be represented in JSON Schema")) {
|
|
16487
|
-
return;
|
|
16488
|
-
}
|
|
16489
|
-
if (ctx.io === "output") {
|
|
16490
|
-
for (const key in def.shape) {
|
|
16491
|
-
if (isTransforming(def.shape[key]) && handleUnrepresentable(schema, ctx, json2, params, `z.properties() returns its input, so the output of a transforming schema at key "${key}" cannot be represented in JSON Schema`)) {
|
|
16492
|
-
return;
|
|
16493
|
-
}
|
|
16494
|
-
}
|
|
16495
|
-
}
|
|
16496
|
-
json2.type = "object";
|
|
16497
|
-
json2.properties = {};
|
|
16498
|
-
for (const key in def.shape) {
|
|
16499
|
-
assignProp(json2.properties, key, processSchema(def.shape[key], ctx, {
|
|
16500
|
-
...params,
|
|
16501
|
-
path: [...params.path, "properties", key]
|
|
16502
|
-
}));
|
|
16503
|
-
}
|
|
16504
|
-
const required2 = Object.keys(def.shape).filter((key) => inputOptin(def.shape[key]) === void 0);
|
|
16505
|
-
if (required2.length > 0)
|
|
16506
|
-
json2.required = required2;
|
|
16507
|
-
};
|
|
16508
16519
|
var unionProcessor = (schema, ctx, json2, params) => {
|
|
16509
16520
|
const def = schema._zod.def;
|
|
16510
16521
|
const isExclusive = def.inclusive === false;
|
|
@@ -16824,7 +16835,6 @@ var allProcessors = {
|
|
|
16824
16835
|
file: fileProcessor,
|
|
16825
16836
|
success: successProcessor,
|
|
16826
16837
|
custom: customProcessor,
|
|
16827
|
-
properties: propertiesProcessor,
|
|
16828
16838
|
function: functionProcessor,
|
|
16829
16839
|
transform: transformProcessor,
|
|
16830
16840
|
map: mapProcessor,
|
|
@@ -16881,7 +16891,7 @@ function toJSONSchema(input2, params) {
|
|
|
16881
16891
|
return finalize(ctx, input2);
|
|
16882
16892
|
}
|
|
16883
16893
|
|
|
16884
|
-
// node_modules/zod/v4/core/json-schema-generator.js
|
|
16894
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-generator.js
|
|
16885
16895
|
var JSONSchemaGenerator = class {
|
|
16886
16896
|
/** @deprecated Access via ctx instead */
|
|
16887
16897
|
get metadataRegistry() {
|
|
@@ -16959,10 +16969,10 @@ var JSONSchemaGenerator = class {
|
|
|
16959
16969
|
}
|
|
16960
16970
|
};
|
|
16961
16971
|
|
|
16962
|
-
// node_modules/zod/v4/core/json-schema.js
|
|
16972
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema.js
|
|
16963
16973
|
var json_schema_exports = {};
|
|
16964
16974
|
|
|
16965
|
-
// node_modules/zod/v4/classic/schemas.js
|
|
16975
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/schemas.js
|
|
16966
16976
|
var schemas_exports2 = {};
|
|
16967
16977
|
__export(schemas_exports2, {
|
|
16968
16978
|
ZodAny: () => ZodAny,
|
|
@@ -17021,7 +17031,6 @@ __export(schemas_exports2, {
|
|
|
17021
17031
|
ZodPrefault: () => ZodPrefault,
|
|
17022
17032
|
ZodPreprocess: () => ZodPreprocess,
|
|
17023
17033
|
ZodPromise: () => ZodPromise,
|
|
17024
|
-
ZodProperties: () => ZodProperties,
|
|
17025
17034
|
ZodReadonly: () => ZodReadonly,
|
|
17026
17035
|
ZodRecord: () => ZodRecord,
|
|
17027
17036
|
ZodSet: () => ZodSet,
|
|
@@ -17059,6 +17068,7 @@ __export(schemas_exports2, {
|
|
|
17059
17068
|
creditCard: () => creditCard2,
|
|
17060
17069
|
cuid: () => cuid3,
|
|
17061
17070
|
cuid2: () => cuid22,
|
|
17071
|
+
currencyCode: () => currencyCode2,
|
|
17062
17072
|
custom: () => custom,
|
|
17063
17073
|
date: () => date2,
|
|
17064
17074
|
describe: () => describe2,
|
|
@@ -17113,7 +17123,6 @@ __export(schemas_exports2, {
|
|
|
17113
17123
|
prefault: () => prefault,
|
|
17114
17124
|
preprocess: () => preprocess,
|
|
17115
17125
|
promise: () => promise,
|
|
17116
|
-
properties: () => properties,
|
|
17117
17126
|
readonly: () => readonly,
|
|
17118
17127
|
record: () => record,
|
|
17119
17128
|
refine: () => refine,
|
|
@@ -17144,7 +17153,7 @@ __export(schemas_exports2, {
|
|
|
17144
17153
|
xor: () => xor
|
|
17145
17154
|
});
|
|
17146
17155
|
|
|
17147
|
-
// node_modules/zod/v4/classic/checks.js
|
|
17156
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/checks.js
|
|
17148
17157
|
var checks_exports2 = {};
|
|
17149
17158
|
__export(checks_exports2, {
|
|
17150
17159
|
endsWith: () => _endsWith,
|
|
@@ -17167,6 +17176,7 @@ __export(checks_exports2, {
|
|
|
17167
17176
|
normalize: () => _normalize,
|
|
17168
17177
|
overwrite: () => _overwrite,
|
|
17169
17178
|
positive: () => _positive,
|
|
17179
|
+
properties: () => _properties,
|
|
17170
17180
|
property: () => _property,
|
|
17171
17181
|
regex: () => _regex,
|
|
17172
17182
|
size: () => _size,
|
|
@@ -17178,7 +17188,7 @@ __export(checks_exports2, {
|
|
|
17178
17188
|
uppercase: () => _uppercase
|
|
17179
17189
|
});
|
|
17180
17190
|
|
|
17181
|
-
// node_modules/zod/v4/classic/errors.js
|
|
17191
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/errors.js
|
|
17182
17192
|
var _installedErrorProtos = /* @__PURE__ */ new WeakSet([Object.prototype, Error.prototype]);
|
|
17183
17193
|
function _lazyMethod(proto, key, make) {
|
|
17184
17194
|
Object.defineProperty(proto, key, {
|
|
@@ -17224,7 +17234,7 @@ var ZodRealError = /* @__PURE__ */ $constructor("ZodError", initializer2, void 0
|
|
|
17224
17234
|
Parent: Error
|
|
17225
17235
|
});
|
|
17226
17236
|
|
|
17227
|
-
// node_modules/zod/v4/classic/parse.js
|
|
17237
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/parse.js
|
|
17228
17238
|
var parse2 = /* @__PURE__ */ _parse(ZodRealError);
|
|
17229
17239
|
var parseAsync2 = /* @__PURE__ */ _parseAsync(ZodRealError);
|
|
17230
17240
|
var safeParse2 = /* @__PURE__ */ _safeParse(ZodRealError);
|
|
@@ -17238,7 +17248,7 @@ var safeDecode2 = /* @__PURE__ */ _safeDecode(ZodRealError);
|
|
|
17238
17248
|
var safeEncodeAsync2 = /* @__PURE__ */ _safeEncodeAsync(ZodRealError);
|
|
17239
17249
|
var safeDecodeAsync2 = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
|
|
17240
17250
|
|
|
17241
|
-
// node_modules/zod/v4/classic/schemas.js
|
|
17251
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/schemas.js
|
|
17242
17252
|
function _ensureDefaultLocale() {
|
|
17243
17253
|
if (!globalConfig.localeError)
|
|
17244
17254
|
config(en_default());
|
|
@@ -17626,8 +17636,8 @@ function url(params) {
|
|
|
17626
17636
|
}
|
|
17627
17637
|
function httpUrl(params) {
|
|
17628
17638
|
return _url(ZodURL, {
|
|
17629
|
-
protocol:
|
|
17630
|
-
hostname:
|
|
17639
|
+
protocol: httpProtocol,
|
|
17640
|
+
hostname: domain,
|
|
17631
17641
|
...util_exports.normalizeParams(params)
|
|
17632
17642
|
});
|
|
17633
17643
|
}
|
|
@@ -17765,10 +17775,13 @@ function stringFormat(format, fnOrRegex, _params = {}) {
|
|
|
17765
17775
|
return _stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params);
|
|
17766
17776
|
}
|
|
17767
17777
|
function hostname2(_params) {
|
|
17768
|
-
return _stringFormat(ZodCustomStringFormat, "hostname",
|
|
17778
|
+
return _stringFormat(ZodCustomStringFormat, "hostname", hostname, _params);
|
|
17769
17779
|
}
|
|
17770
17780
|
function hex2(_params) {
|
|
17771
|
-
return _stringFormat(ZodCustomStringFormat, "hex",
|
|
17781
|
+
return _stringFormat(ZodCustomStringFormat, "hex", hex, _params);
|
|
17782
|
+
}
|
|
17783
|
+
function currencyCode2(_params) {
|
|
17784
|
+
return _stringFormat(ZodCustomStringFormat, "currency_code", currencyCode, _params);
|
|
17772
17785
|
}
|
|
17773
17786
|
function hash(alg, params) {
|
|
17774
17787
|
const enc = params?.enc ?? "hex";
|
|
@@ -18633,14 +18646,6 @@ var ZodCustom = /* @__PURE__ */ $constructor("ZodCustom", (inst, def) => {
|
|
|
18633
18646
|
ZodType.init(inst, def);
|
|
18634
18647
|
inst._zod.processJSONSchema = (ctx, json2, params) => customProcessor(inst, ctx, json2, params);
|
|
18635
18648
|
});
|
|
18636
|
-
var ZodProperties = /* @__PURE__ */ $constructor("ZodProperties", (inst, def) => {
|
|
18637
|
-
_ensureDefaultMemoizer();
|
|
18638
|
-
$ZodProperties.init(inst, def);
|
|
18639
|
-
ZodType.init(inst, def);
|
|
18640
|
-
});
|
|
18641
|
-
function properties(shape, params) {
|
|
18642
|
-
return _properties(ZodProperties, shape, params);
|
|
18643
|
-
}
|
|
18644
18649
|
function check(fn) {
|
|
18645
18650
|
const ch = new $ZodCheck({
|
|
18646
18651
|
check: "custom"
|
|
@@ -18664,7 +18669,7 @@ var ZodInstanceOf = /* @__PURE__ */ $constructor("ZodInstanceOf", (inst, def) =>
|
|
|
18664
18669
|
ZodCustom.init(inst, def);
|
|
18665
18670
|
}, {
|
|
18666
18671
|
properties(shape, params) {
|
|
18667
|
-
return this.check(
|
|
18672
|
+
return this.check(_properties(shape, params));
|
|
18668
18673
|
}
|
|
18669
18674
|
});
|
|
18670
18675
|
function _instanceof(cls, params = {}) {
|
|
@@ -18708,7 +18713,7 @@ function preprocess(fn, schema) {
|
|
|
18708
18713
|
});
|
|
18709
18714
|
}
|
|
18710
18715
|
|
|
18711
|
-
// node_modules/zod/v4/classic/compat.js
|
|
18716
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/compat.js
|
|
18712
18717
|
var ZodIssueCode = {
|
|
18713
18718
|
invalid_type: "invalid_type",
|
|
18714
18719
|
too_big: "too_big",
|
|
@@ -18734,7 +18739,7 @@ var ZodFirstPartyTypeKind;
|
|
|
18734
18739
|
/* @__PURE__ */ (function(ZodFirstPartyTypeKind2) {
|
|
18735
18740
|
})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));
|
|
18736
18741
|
|
|
18737
|
-
// node_modules/zod/v4/classic/iso.js
|
|
18742
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/iso.js
|
|
18738
18743
|
var iso_exports = {};
|
|
18739
18744
|
__export(iso_exports, {
|
|
18740
18745
|
ZodISODate: () => ZodISODate,
|
|
@@ -18759,7 +18764,7 @@ function duration2(params) {
|
|
|
18759
18764
|
return _isoDuration(ZodISODuration, params);
|
|
18760
18765
|
}
|
|
18761
18766
|
|
|
18762
|
-
// node_modules/zod/v4/classic/from-json-schema.js
|
|
18767
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/from-json-schema.js
|
|
18763
18768
|
var z = {
|
|
18764
18769
|
...schemas_exports2,
|
|
18765
18770
|
...checks_exports2,
|
|
@@ -19251,10 +19256,10 @@ function convertBaseSchema(schema, ctx) {
|
|
|
19251
19256
|
}
|
|
19252
19257
|
case "object": {
|
|
19253
19258
|
const shape = {};
|
|
19254
|
-
const
|
|
19259
|
+
const properties = schema.properties || {};
|
|
19255
19260
|
const requiredSet = new Set(schema.required || []);
|
|
19256
19261
|
const additionalSchema = typeof schema.additionalProperties === "object" ? convertSchema(schema.additionalProperties, ctx) : void 0;
|
|
19257
|
-
for (const [key, propSchema] of Object.entries(
|
|
19262
|
+
for (const [key, propSchema] of Object.entries(properties)) {
|
|
19258
19263
|
const propZodSchema = convertSchema(propSchema, ctx);
|
|
19259
19264
|
assignProp(shape, key, requiredSet.has(key) ? propZodSchema : propZodSchema.optional());
|
|
19260
19265
|
}
|
|
@@ -19492,7 +19497,7 @@ function fromJSONSchema(schema, params) {
|
|
|
19492
19497
|
return convertSchema(normalized, ctx);
|
|
19493
19498
|
}
|
|
19494
19499
|
|
|
19495
|
-
// node_modules/zod/v4/core/visit.js
|
|
19500
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/visit.js
|
|
19496
19501
|
var RESOLVING = Symbol("z.visit/resolving");
|
|
19497
19502
|
function visit(schema, fnOrHandlers) {
|
|
19498
19503
|
const fn = typeof fnOrHandlers === "function" ? fnOrHandlers : (node2, rewritten) => {
|
|
@@ -19615,18 +19620,6 @@ function visit(schema, fnOrHandlers) {
|
|
|
19615
19620
|
const { _cachedInner, ...rest } = def;
|
|
19616
19621
|
return clone(s, { ...rest, getter: () => run(original()) });
|
|
19617
19622
|
}
|
|
19618
|
-
case "properties": {
|
|
19619
|
-
const oldShape = def.shape;
|
|
19620
|
-
let changed = false;
|
|
19621
|
-
const newShape = {};
|
|
19622
|
-
for (const k of Reflect.ownKeys(oldShape)) {
|
|
19623
|
-
const mapped = run(oldShape[k]);
|
|
19624
|
-
if (mapped !== oldShape[k])
|
|
19625
|
-
changed = true;
|
|
19626
|
-
newShape[k] = mapped;
|
|
19627
|
-
}
|
|
19628
|
-
return changed ? clone(s, { ...def, shape: newShape }) : s;
|
|
19629
|
-
}
|
|
19630
19623
|
// A leaf by choice: `parts` are regex fragments, not data positions.
|
|
19631
19624
|
case "template_literal":
|
|
19632
19625
|
// Leaves.
|
|
@@ -19659,7 +19652,7 @@ function visit(schema, fnOrHandlers) {
|
|
|
19659
19652
|
return run(schema);
|
|
19660
19653
|
}
|
|
19661
19654
|
|
|
19662
|
-
// node_modules/zod/v4/classic/deep-partial.js
|
|
19655
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/deep-partial.js
|
|
19663
19656
|
function deepPartial(schema) {
|
|
19664
19657
|
return visit(schema, {
|
|
19665
19658
|
object: (s) => s.partial(),
|
|
@@ -19671,7 +19664,7 @@ function deepPartial(schema) {
|
|
|
19671
19664
|
});
|
|
19672
19665
|
}
|
|
19673
19666
|
|
|
19674
|
-
// node_modules/zod/v4/classic/in-out.js
|
|
19667
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/in-out.js
|
|
19675
19668
|
function withChecks(side, checks) {
|
|
19676
19669
|
if (!checks?.length)
|
|
19677
19670
|
return side;
|
|
@@ -19701,7 +19694,7 @@ function output(schema) {
|
|
|
19701
19694
|
});
|
|
19702
19695
|
}
|
|
19703
19696
|
|
|
19704
|
-
// node_modules/zod/v4/classic/coerce.js
|
|
19697
|
+
// node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/coerce.js
|
|
19705
19698
|
var coerce_exports = {};
|
|
19706
19699
|
__export(coerce_exports, {
|
|
19707
19700
|
bigint: () => bigint3,
|
|
@@ -19729,7 +19722,7 @@ function date4(params) {
|
|
|
19729
19722
|
// src/client/state.js
|
|
19730
19723
|
var import_react = __toESM(require("react"), 1);
|
|
19731
19724
|
var NS = "t-team";
|
|
19732
|
-
var CLIENT_BUILD_VERSION = "0.3.
|
|
19725
|
+
var CLIENT_BUILD_VERSION = "0.3.88";
|
|
19733
19726
|
var uiPrefs = { showTaskBadge: true, showScheduleButton: true, showActivePulse: true };
|
|
19734
19727
|
var UI_PREF_KEYS = Object.keys(uiPrefs);
|
|
19735
19728
|
var uiPrefsListeners = /* @__PURE__ */ new Set();
|
|
@@ -19978,7 +19971,7 @@ function direct(method, parameters, typeSymbol, schema) {
|
|
|
19978
19971
|
method,
|
|
19979
19972
|
invocation: { kind: "direct" },
|
|
19980
19973
|
parameters,
|
|
19981
|
-
result: { mode: "strict", typeSymbol, schema }
|
|
19974
|
+
result: { mode: "strict", typeSymbol, schema, create: () => schema }
|
|
19982
19975
|
};
|
|
19983
19976
|
}
|
|
19984
19977
|
var TYPERT_REMOTE = {
|
|
@@ -19986,84 +19979,84 @@ var TYPERT_REMOTE = {
|
|
|
19986
19979
|
descriptors: [
|
|
19987
19980
|
direct("getCatalog", [], "TTeamCatalog", catalogSnapshotSchema),
|
|
19988
19981
|
direct("setEnabled", [
|
|
19989
|
-
{ name: "enabled", wire: "enabled", source: "json", codec: { mode: "strict", typeSymbol: "string[]", schema: external_exports.array(external_exports.string()) } },
|
|
19990
|
-
{ name: "expectedRevision", wire: "expectedRevision", source: "json", codec: { mode: "strict", typeSymbol: "number", schema: external_exports.number().int().min(0) } }
|
|
19982
|
+
{ name: "enabled", wire: "enabled", source: "json", codec: { mode: "strict", typeSymbol: "string[]", schema: external_exports.array(external_exports.string()), create: () => external_exports.array(external_exports.string()) } },
|
|
19983
|
+
{ name: "expectedRevision", wire: "expectedRevision", source: "json", codec: { mode: "strict", typeSymbol: "number", schema: external_exports.number().int().min(0), create: () => external_exports.number().int().min(0) } }
|
|
19991
19984
|
], "TTeamEnabledState", enabledStateSchema),
|
|
19992
19985
|
direct("getPrompt", [
|
|
19993
|
-
{ name: "slug", wire: "slug", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
19994
|
-
{ name: "division", wire: "division", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(64) } }
|
|
19986
|
+
{ name: "slug", wire: "slug", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
19987
|
+
{ name: "division", wire: "division", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(64), create: () => external_exports.string().min(1).max(64) } }
|
|
19995
19988
|
], "TTeamPrompt", promptSchema),
|
|
19996
19989
|
direct("getUiPrefs", [], "TTeamUiPrefs", uiPrefsSchema),
|
|
19997
19990
|
// 入参是 patch 对象(与 host 侧 descriptor 一致):界面偏好不再只有任务徽章一项,
|
|
19998
19991
|
// 加键不必再加方法。
|
|
19999
19992
|
direct("setUiPrefs", [
|
|
20000
|
-
{ name: "patch", wire: "patch", source: "json", codec: { mode: "strict", typeSymbol: "TTeamUiPrefsPatch", schema: uiPrefsPatchSchema } }
|
|
19993
|
+
{ name: "patch", wire: "patch", source: "json", codec: { mode: "strict", typeSymbol: "TTeamUiPrefsPatch", schema: uiPrefsPatchSchema, create: () => uiPrefsPatchSchema } }
|
|
20001
19994
|
], "TTeamUiPrefs", uiPrefsSchema),
|
|
20002
19995
|
// 定时任务:读一份快照;写操作全部回传刷新后的整份快照,面板拿到直接重绘。
|
|
20003
19996
|
direct("getSchedule", [], "TTeamSchedule", scheduleSnapshotSchema),
|
|
20004
19997
|
direct("createScheduleItem", [
|
|
20005
|
-
{ name: "input", wire: "input", source: "json", codec: { mode: "strict", typeSymbol: "TTeamScheduleInput", schema: scheduleInputSchema } }
|
|
19998
|
+
{ name: "input", wire: "input", source: "json", codec: { mode: "strict", typeSymbol: "TTeamScheduleInput", schema: scheduleInputSchema, create: () => scheduleInputSchema } }
|
|
20006
19999
|
], "TTeamSchedule", scheduleSnapshotSchema),
|
|
20007
20000
|
direct("updateScheduleItem", [
|
|
20008
|
-
{ name: "id", wire: "id", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
20009
|
-
{ name: "patch", wire: "patch", source: "json", codec: { mode: "strict", typeSymbol: "TTeamSchedulePatch", schema: schedulePatchSchema } }
|
|
20001
|
+
{ name: "id", wire: "id", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
20002
|
+
{ name: "patch", wire: "patch", source: "json", codec: { mode: "strict", typeSymbol: "TTeamSchedulePatch", schema: schedulePatchSchema, create: () => schedulePatchSchema } }
|
|
20010
20003
|
], "TTeamSchedule", scheduleSnapshotSchema),
|
|
20011
20004
|
direct("deleteScheduleItem", [
|
|
20012
|
-
{ name: "id", wire: "id", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } }
|
|
20005
|
+
{ name: "id", wire: "id", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } }
|
|
20013
20006
|
], "TTeamSchedule", scheduleSnapshotSchema),
|
|
20014
20007
|
direct("runScheduleItem", [
|
|
20015
|
-
{ name: "id", wire: "id", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } }
|
|
20008
|
+
{ name: "id", wire: "id", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } }
|
|
20016
20009
|
], "TTeamSchedule", scheduleSnapshotSchema),
|
|
20017
20010
|
direct("ensureScheduleWorkspace", [
|
|
20018
|
-
{ name: "path", wire: "path", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(1024) } }
|
|
20011
|
+
{ name: "path", wire: "path", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(1024), create: () => external_exports.string().max(1024) } }
|
|
20019
20012
|
], "TTeamScheduleWorkspace", scheduleWorkspaceSchema),
|
|
20020
20013
|
direct("previewSchedule", [
|
|
20021
|
-
{ name: "cron", wire: "cron", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(120) } }
|
|
20014
|
+
{ name: "cron", wire: "cron", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(120), create: () => external_exports.string().min(1).max(120) } }
|
|
20022
20015
|
], "TTeamSchedulePreview", schedulePreviewSchema),
|
|
20023
20016
|
direct("getSquads", [], "TTeamSquads", squadsSnapshotSchema),
|
|
20024
20017
|
direct("saveSquads", [
|
|
20025
|
-
{ name: "squads", wire: "squads", source: "json", codec: { mode: "strict", typeSymbol: "TTeamSquadInput[]", schema: external_exports.array(squadInputSchema).min(1).max(48) } },
|
|
20026
|
-
{ name: "expectedRevision", wire: "expectedRevision", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(64) } }
|
|
20018
|
+
{ name: "squads", wire: "squads", source: "json", codec: { mode: "strict", typeSymbol: "TTeamSquadInput[]", schema: external_exports.array(squadInputSchema).min(1).max(48), create: () => external_exports.array(squadInputSchema).min(1).max(48) } },
|
|
20019
|
+
{ name: "expectedRevision", wire: "expectedRevision", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(64), create: () => external_exports.string().max(64) } }
|
|
20027
20020
|
], "TTeamSquads", squadsSnapshotSchema),
|
|
20028
20021
|
direct("startSquad", [
|
|
20029
|
-
{ name: "profileKey", wire: "profileKey", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(64) } },
|
|
20030
|
-
{ name: "sessionId", wire: "sessionId", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(128) } }
|
|
20022
|
+
{ name: "profileKey", wire: "profileKey", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(64), create: () => external_exports.string().min(1).max(64) } },
|
|
20023
|
+
{ name: "sessionId", wire: "sessionId", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(128), create: () => external_exports.string().max(128) } }
|
|
20031
20024
|
], "TTeamStartResult", startResultSchema),
|
|
20032
20025
|
direct("getTeams", [
|
|
20033
|
-
{ name: "archived", wire: "archived", source: "json", codec: { mode: "strict", typeSymbol: "boolean", schema: external_exports.boolean() } }
|
|
20026
|
+
{ name: "archived", wire: "archived", source: "json", codec: { mode: "strict", typeSymbol: "boolean", schema: external_exports.boolean(), create: () => external_exports.boolean() } }
|
|
20034
20027
|
], "TTeamTeams", teamsSnapshotSchema),
|
|
20035
20028
|
// workspacePath 标 acceptsUndefined:host 若是旧版(快照里没这个字段),这里就是 undefined,
|
|
20036
20029
|
// 请求里不带该键,宿主退回全量遍历;不带标记会在 gateway 侧被判 arguments-invalid。
|
|
20037
20030
|
direct("stopTeam", [
|
|
20038
|
-
{ name: "teamId", wire: "teamId", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
20039
|
-
{ name: "workspacePath", wire: "workspacePath", source: "json", acceptsUndefined: true, codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(1024) } }
|
|
20031
|
+
{ name: "teamId", wire: "teamId", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
20032
|
+
{ name: "workspacePath", wire: "workspacePath", source: "json", acceptsUndefined: true, codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(1024), create: () => external_exports.string().max(1024) } }
|
|
20040
20033
|
], "TTeamStopResult", stopResultSchema),
|
|
20041
20034
|
direct("deleteTeam", [
|
|
20042
|
-
{ name: "teamId", wire: "teamId", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
20043
|
-
{ name: "workspacePath", wire: "workspacePath", source: "json", acceptsUndefined: true, codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(1024) } }
|
|
20035
|
+
{ name: "teamId", wire: "teamId", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
20036
|
+
{ name: "workspacePath", wire: "workspacePath", source: "json", acceptsUndefined: true, codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(1024), create: () => external_exports.string().max(1024) } }
|
|
20044
20037
|
], "TTeamDeleteResult", deleteTeamResultSchema),
|
|
20045
20038
|
direct("createExpert", [
|
|
20046
|
-
{ name: "expert", wire: "expert", source: "json", codec: { mode: "strict", typeSymbol: "TTeamCustomExpertInput", schema: customExpertInputSchema } }
|
|
20039
|
+
{ name: "expert", wire: "expert", source: "json", codec: { mode: "strict", typeSymbol: "TTeamCustomExpertInput", schema: customExpertInputSchema, create: () => customExpertInputSchema } }
|
|
20047
20040
|
], "TTeamCatalog", catalogSnapshotSchema),
|
|
20048
20041
|
direct("updateExpert", [
|
|
20049
|
-
{ name: "slug", wire: "slug", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
20050
|
-
{ name: "expert", wire: "expert", source: "json", codec: { mode: "strict", typeSymbol: "TTeamCustomExpertInput", schema: customExpertInputSchema } },
|
|
20051
|
-
{ name: "expectedHash", wire: "expectedHash", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(64) } }
|
|
20042
|
+
{ name: "slug", wire: "slug", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
20043
|
+
{ name: "expert", wire: "expert", source: "json", codec: { mode: "strict", typeSymbol: "TTeamCustomExpertInput", schema: customExpertInputSchema, create: () => customExpertInputSchema } },
|
|
20044
|
+
{ name: "expectedHash", wire: "expectedHash", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(64), create: () => external_exports.string().max(64) } }
|
|
20052
20045
|
], "TTeamCatalog", catalogSnapshotSchema),
|
|
20053
20046
|
direct("deleteExpert", [
|
|
20054
|
-
{ name: "slug", wire: "slug", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
20055
|
-
{ name: "expectedHash", wire: "expectedHash", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(64) } }
|
|
20047
|
+
{ name: "slug", wire: "slug", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
20048
|
+
{ name: "expectedHash", wire: "expectedHash", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(64), create: () => external_exports.string().max(64) } }
|
|
20056
20049
|
], "TTeamCatalog", catalogSnapshotSchema),
|
|
20057
20050
|
direct("createCategory", [
|
|
20058
|
-
{ name: "key", wire: "key", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
20059
|
-
{ name: "label", wire: "label", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(40) } }
|
|
20051
|
+
{ name: "key", wire: "key", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
20052
|
+
{ name: "label", wire: "label", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(40), create: () => external_exports.string().max(40) } }
|
|
20060
20053
|
], "TTeamCatalog", catalogSnapshotSchema),
|
|
20061
20054
|
direct("updateCategory", [
|
|
20062
|
-
{ name: "key", wire: "key", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } },
|
|
20063
|
-
{ name: "label", wire: "label", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(40) } }
|
|
20055
|
+
{ name: "key", wire: "key", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } },
|
|
20056
|
+
{ name: "label", wire: "label", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().max(40), create: () => external_exports.string().max(40) } }
|
|
20064
20057
|
], "TTeamCatalog", catalogSnapshotSchema),
|
|
20065
20058
|
direct("deleteCategory", [
|
|
20066
|
-
{ name: "key", wire: "key", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128) } }
|
|
20059
|
+
{ name: "key", wire: "key", source: "json", codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string().min(1).max(128), create: () => external_exports.string().min(1).max(128) } }
|
|
20067
20060
|
], "TTeamCatalog", catalogSnapshotSchema)
|
|
20068
20061
|
]
|
|
20069
20062
|
};
|
|
@@ -20257,17 +20250,52 @@ function JobsTab({ t, ctx, compact }) {
|
|
|
20257
20250
|
const multiOwner = new Set(rows.map((row) => row.ownerSessionId)).size > 1;
|
|
20258
20251
|
return /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-tabbody" }, compact !== true && /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-note" }, t("tasks.hint")), /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-team-meta" }, liveCount > 0 ? t("tasks.countRunning", { running: liveCount, total: rows.length }) : t("tasks.count", { total: rows.length })), /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-section-head" }, t("tasks.subagents")), subagents.length === 0 ? /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-meta" }, t("tasks.noSubagents")) : renderSubagentRows({ subagents, t, onOpen: (item) => openSubagentSession(ctx, item) }), /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-section-head" }, t("tab.tasks")), renderJobRows({ rows, now, multiOwner, t }));
|
|
20259
20252
|
}
|
|
20253
|
+
function lookupUiWorkspace(ctx) {
|
|
20254
|
+
if (typeof ctx?.get !== "function") return void 0;
|
|
20255
|
+
try {
|
|
20256
|
+
return ctx.get("uiWorkspace");
|
|
20257
|
+
} catch {
|
|
20258
|
+
return void 0;
|
|
20259
|
+
}
|
|
20260
|
+
}
|
|
20261
|
+
function openHostSession(ctx, target, slotOpen) {
|
|
20262
|
+
if (target === void 0 || target === null || target === "") return;
|
|
20263
|
+
if (typeof target === "string" && typeof slotOpen === "function") {
|
|
20264
|
+
try {
|
|
20265
|
+
slotOpen(target);
|
|
20266
|
+
return;
|
|
20267
|
+
} catch (error62) {
|
|
20268
|
+
console.error("[t-team] \u6253\u5F00\u4F1A\u8BDD\u5931\u8D25\uFF1A", error62);
|
|
20269
|
+
}
|
|
20270
|
+
}
|
|
20271
|
+
try {
|
|
20272
|
+
const uiWorkspace = lookupUiWorkspace(ctx);
|
|
20273
|
+
if (typeof uiWorkspace?.openSession === "function") {
|
|
20274
|
+
uiWorkspace.openSession(target);
|
|
20275
|
+
return;
|
|
20276
|
+
}
|
|
20277
|
+
if (typeof target === "string") {
|
|
20278
|
+
ctx?.sessions?.open?.(target);
|
|
20279
|
+
ctx?.layout?.selectPanel?.(null);
|
|
20280
|
+
return;
|
|
20281
|
+
}
|
|
20282
|
+
if (typeof ctx?.sessions?.openSubagent === "function") {
|
|
20283
|
+
ctx.sessions.openSubagent(target);
|
|
20284
|
+
return;
|
|
20285
|
+
}
|
|
20286
|
+
const childId = target?.childSessionId;
|
|
20287
|
+
if (typeof childId === "string") ctx?.sessions?.open?.(childId);
|
|
20288
|
+
} catch (error62) {
|
|
20289
|
+
console.error("[t-team] \u6253\u5F00\u4F1A\u8BDD\u5931\u8D25\uFF1A", error62);
|
|
20290
|
+
}
|
|
20291
|
+
}
|
|
20260
20292
|
function openSubagentSession(ctx, item) {
|
|
20261
20293
|
const sessions = ctx?.sessions;
|
|
20262
20294
|
if (sessions === void 0 || item?.id === void 0) return;
|
|
20263
20295
|
const resolved = sessions.subagentAddress?.(item.id);
|
|
20264
20296
|
const address = resolved ?? (item.parentId === void 0 ? void 0 : { parentSessionId: item.parentId, childSessionId: item.id, mode: item.mode ?? "continuable" });
|
|
20265
20297
|
if (address === void 0) return;
|
|
20266
|
-
|
|
20267
|
-
sessions.openSubagent?.(address);
|
|
20268
|
-
} catch (error62) {
|
|
20269
|
-
console.error("[t-team] \u6253\u5F00\u5B50\u4EE3\u7406\u4F1A\u8BDD\u5931\u8D25\uFF1A", error62);
|
|
20270
|
-
}
|
|
20298
|
+
openHostSession(ctx, address);
|
|
20271
20299
|
}
|
|
20272
20300
|
var JOB_DOCK_POS_KEY = "t-team:jobs-dock:v1";
|
|
20273
20301
|
var JOB_DOCK_CLOSED_KEY = "t-team:jobs-closed:v1";
|
|
@@ -20352,12 +20380,12 @@ function jobDockPerfReset() {
|
|
|
20352
20380
|
} catch {
|
|
20353
20381
|
}
|
|
20354
20382
|
}
|
|
20355
|
-
function jobDockPerfReport(
|
|
20383
|
+
function jobDockPerfReport(stage2) {
|
|
20356
20384
|
try {
|
|
20357
20385
|
const marks = performance.getEntriesByName("t-team-jobs-open", "mark");
|
|
20358
20386
|
const start = marks[marks.length - 1];
|
|
20359
20387
|
if (start === void 0) return;
|
|
20360
|
-
console.debug(`[t-team] \u4EFB\u52A1\u9762\u677F${
|
|
20388
|
+
console.debug(`[t-team] \u4EFB\u52A1\u9762\u677F${stage2} ${Math.round(performance.now() - start.startTime)}ms`);
|
|
20361
20389
|
} catch {
|
|
20362
20390
|
}
|
|
20363
20391
|
}
|
|
@@ -20406,7 +20434,7 @@ function JobsBadge({ t, ctx }) {
|
|
|
20406
20434
|
/* @__PURE__ */ import_react2.default.createElement("span", { className: "t-team-job-badge-count" }, badgeText)
|
|
20407
20435
|
);
|
|
20408
20436
|
}
|
|
20409
|
-
function JobsDock({ t, ctx, preview }) {
|
|
20437
|
+
function JobsDock({ t, ctx, hostCtx, preview }) {
|
|
20410
20438
|
const { rows, liveCount, subagents, subagentsRunning, now } = useJobRows(ctx);
|
|
20411
20439
|
const showDock = useShowTaskBadge();
|
|
20412
20440
|
const ui = useDockUi();
|
|
@@ -20503,7 +20531,7 @@ function JobsDock({ t, ctx, preview }) {
|
|
|
20503
20531
|
)), /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-job-panel-tabs", role: "tablist" }, [
|
|
20504
20532
|
["subagents", "tasks.subagents", subagentsRunning > 0 ? `${subagents.length} \xB7 ${subagentsRunning}` : String(subagents.length)],
|
|
20505
20533
|
["jobs", "tab.tasks", liveCount > 0 ? `${rows.length} \xB7 ${liveCount}` : String(rows.length)]
|
|
20506
|
-
].map(([key, labelKey, count]) => /* @__PURE__ */ import_react2.default.createElement("button", { className: "t-team-tab", type: "button", role: "tab", key, "data-active": panelTab === key, "aria-selected": panelTab === key, onClick: () => setPanelTab(key) }, t(labelKey), " ", /* @__PURE__ */ import_react2.default.createElement("span", { className: "t-team-job-tab-count" }, count)))), /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-job-panel-body" }, panelTab === "subagents" ? subagents.length === 0 ? /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-meta" }, t("tasks.noSubagents")) : renderSubagentRows({ subagents, t, onOpen: (item) => openSubagentSession(ctx, item) }) : renderJobRows({ rows, now, multiOwner, t })));
|
|
20534
|
+
].map(([key, labelKey, count]) => /* @__PURE__ */ import_react2.default.createElement("button", { className: "t-team-tab", type: "button", role: "tab", key, "data-active": panelTab === key, "aria-selected": panelTab === key, onClick: () => setPanelTab(key) }, t(labelKey), " ", /* @__PURE__ */ import_react2.default.createElement("span", { className: "t-team-job-tab-count" }, count)))), /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-job-panel-body" }, panelTab === "subagents" ? subagents.length === 0 ? /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-meta" }, t("tasks.noSubagents")) : renderSubagentRows({ subagents, t, onOpen: (item) => openSubagentSession(hostCtx ?? ctx, item) }) : renderJobRows({ rows, now, multiOwner, t })));
|
|
20507
20535
|
}
|
|
20508
20536
|
|
|
20509
20537
|
// src/client/attention.jsx
|
|
@@ -20588,7 +20616,48 @@ function expandOwningWorkspaceGroup(ctx, sessionId) {
|
|
|
20588
20616
|
reportExpandFailure(error62);
|
|
20589
20617
|
}
|
|
20590
20618
|
}
|
|
20591
|
-
function
|
|
20619
|
+
function copyAttentionText(value) {
|
|
20620
|
+
try {
|
|
20621
|
+
if (typeof navigator !== "undefined" && typeof navigator.clipboard?.writeText === "function") {
|
|
20622
|
+
navigator.clipboard.writeText(value).catch(() => fallbackAttentionCopy(value));
|
|
20623
|
+
return true;
|
|
20624
|
+
}
|
|
20625
|
+
} catch {
|
|
20626
|
+
}
|
|
20627
|
+
return fallbackAttentionCopy(value);
|
|
20628
|
+
}
|
|
20629
|
+
function fallbackAttentionCopy(value) {
|
|
20630
|
+
try {
|
|
20631
|
+
const ta = document.createElement("textarea");
|
|
20632
|
+
ta.value = value;
|
|
20633
|
+
ta.setAttribute("readonly", "");
|
|
20634
|
+
ta.style.position = "fixed";
|
|
20635
|
+
ta.style.top = "0";
|
|
20636
|
+
ta.style.opacity = "0";
|
|
20637
|
+
document.body.appendChild(ta);
|
|
20638
|
+
ta.select();
|
|
20639
|
+
const ok = document.execCommand("copy");
|
|
20640
|
+
document.body.removeChild(ta);
|
|
20641
|
+
return ok;
|
|
20642
|
+
} catch {
|
|
20643
|
+
return false;
|
|
20644
|
+
}
|
|
20645
|
+
}
|
|
20646
|
+
function deriveCurrentSession({ sessionId, sessionSnapshot, listEntry }) {
|
|
20647
|
+
const id = typeof sessionId === "string" && sessionId !== "" ? sessionId : "";
|
|
20648
|
+
const entry = id !== "" ? listEntry : void 0;
|
|
20649
|
+
const snap = sessionSnapshot ?? entry ?? void 0;
|
|
20650
|
+
const title = (snap && (snap.displayTitle ?? snap.title)) ?? (entry && (entry.displayTitle ?? entry.title)) ?? "";
|
|
20651
|
+
const running = snap && snap.running === true || entry && entry.running === true || false;
|
|
20652
|
+
return { ready: id !== "", id, title, running };
|
|
20653
|
+
}
|
|
20654
|
+
function AttentionPanel({ t, sessions, anchor: anchor2, onClose, onOpen, current }) {
|
|
20655
|
+
const [currentCopied, setCurrentCopied] = import_react3.default.useState(false);
|
|
20656
|
+
import_react3.default.useEffect(() => {
|
|
20657
|
+
if (!currentCopied) return void 0;
|
|
20658
|
+
const timer = window.setTimeout(() => setCurrentCopied(false), 1500);
|
|
20659
|
+
return () => window.clearTimeout(timer);
|
|
20660
|
+
}, [currentCopied]);
|
|
20592
20661
|
import_react3.default.useEffect(() => {
|
|
20593
20662
|
const onKey = (event) => {
|
|
20594
20663
|
if (event.key === "Escape") onClose();
|
|
@@ -20605,11 +20674,68 @@ function AttentionPanel({ t, sessions, anchor: anchor2, onClose, onOpen }) {
|
|
|
20605
20674
|
window.removeEventListener("mousedown", onDown, true);
|
|
20606
20675
|
};
|
|
20607
20676
|
}, [onClose]);
|
|
20608
|
-
|
|
20677
|
+
const safeCurrent = current ?? { ready: false, id: "", title: "", running: false };
|
|
20678
|
+
const currentDisplayId = safeCurrent.id !== "" ? safeCurrent.id : safeCurrent.ready ? "\u2014" : "\xB7";
|
|
20679
|
+
const currentHintKey = safeCurrent.id === "" ? "pulse.idPending" : currentCopied ? "pulse.copied" : "pulse.copy";
|
|
20680
|
+
return /* @__PURE__ */ import_react3.default.createElement("div", { className: "t-team-pulse-pop", style: { right: anchor2.right, top: anchor2.top }, role: "dialog", "aria-label": t("pulse.title") }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "t-team-pulse-pop-head" }, t("pulse.title")), /* @__PURE__ */ import_react3.default.createElement(
|
|
20681
|
+
"button",
|
|
20682
|
+
{
|
|
20683
|
+
type: "button",
|
|
20684
|
+
className: "t-team-pulse-pop-current",
|
|
20685
|
+
"data-copied": currentCopied,
|
|
20686
|
+
"data-pending": safeCurrent.id === "",
|
|
20687
|
+
onClick: () => {
|
|
20688
|
+
if (safeCurrent.id === "") return;
|
|
20689
|
+
const ok = copyAttentionText(safeCurrent.id);
|
|
20690
|
+
if (ok) setCurrentCopied(true);
|
|
20691
|
+
},
|
|
20692
|
+
title: safeCurrent.id === "" ? t("pulse.idPendingHint") : t("pulse.copyHint")
|
|
20693
|
+
},
|
|
20694
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-current-label" }, t("pulse.current")),
|
|
20695
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-id", "data-monospace": "true" }, currentDisplayId),
|
|
20696
|
+
safeCurrent.title !== "" && /* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-current-title", title: safeCurrent.title }, safeCurrent.title),
|
|
20697
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-current-hint" }, t(currentHintKey))
|
|
20698
|
+
), sessions.length === 0 ? /* @__PURE__ */ import_react3.default.createElement("div", { className: "t-team-pulse-pop-empty" }, t("pulse.empty")) : sessions.map((row) => /* @__PURE__ */ import_react3.default.createElement("div", { key: row.id, className: "t-team-pulse-pop-item" }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "t-team-pulse-pop-row", onClick: () => onOpen(row.id), title: row.title }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-dot", "data-state": row.running ? "running" : "pending", "aria-hidden": "true" }), /* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-title" }, row.title), /* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-tag" }, t(row.running ? "pulse.running" : "pulse.pending"))), /* @__PURE__ */ import_react3.default.createElement(
|
|
20699
|
+
"button",
|
|
20700
|
+
{
|
|
20701
|
+
type: "button",
|
|
20702
|
+
className: "t-team-pulse-pop-id-btn",
|
|
20703
|
+
onClick: (event) => {
|
|
20704
|
+
event.stopPropagation();
|
|
20705
|
+
copyAttentionText(row.id);
|
|
20706
|
+
},
|
|
20707
|
+
title: t("pulse.copyHint")
|
|
20708
|
+
},
|
|
20709
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "t-team-pulse-pop-id", "data-monospace": "true" }, row.id)
|
|
20710
|
+
))));
|
|
20609
20711
|
}
|
|
20610
|
-
function ActivePulse({ ctx, t }) {
|
|
20712
|
+
function ActivePulse({ ctx, hostCtx, t, sessionId, useSession, open: open2 }) {
|
|
20611
20713
|
const show = useShowActivePulse();
|
|
20612
20714
|
const sessions = useAttentionSessions(ctx);
|
|
20715
|
+
let current = { ready: false, id: "", title: "", running: false };
|
|
20716
|
+
if (typeof sessionId === "string" && sessionId !== "") {
|
|
20717
|
+
let snap;
|
|
20718
|
+
if (typeof useSession === "function") {
|
|
20719
|
+
try {
|
|
20720
|
+
const got = useSession((s) => s ?? null);
|
|
20721
|
+
if (got && typeof got === "object") snap = got;
|
|
20722
|
+
} catch {
|
|
20723
|
+
}
|
|
20724
|
+
}
|
|
20725
|
+
let entry;
|
|
20726
|
+
if (snap === void 0) {
|
|
20727
|
+
const byId = ctx?.sessions?.list?.getSnapshot?.()?.byId ?? {};
|
|
20728
|
+
entry = byId[sessionId];
|
|
20729
|
+
}
|
|
20730
|
+
current = deriveCurrentSession({ sessionId, sessionSnapshot: snap, listEntry: entry });
|
|
20731
|
+
} else if (ctx?.sessions?.list?.getSnapshot !== void 0) {
|
|
20732
|
+
const snap = ctx.sessions.list.getSnapshot();
|
|
20733
|
+
const byId = snap?.byId ?? {};
|
|
20734
|
+
const first = Object.values(byId).find((e) => e?.origin !== "subagent");
|
|
20735
|
+
if (first !== void 0) {
|
|
20736
|
+
current = deriveCurrentSession({ sessionId: first.id, listEntry: first });
|
|
20737
|
+
}
|
|
20738
|
+
}
|
|
20613
20739
|
const [anchor2, setAnchor] = import_react3.default.useState(null);
|
|
20614
20740
|
import_react3.default.useEffect(() => subscribePopoverClaims((owner) => {
|
|
20615
20741
|
if (owner !== "pulse") setAnchor(null);
|
|
@@ -20663,10 +20789,12 @@ function ActivePulse({ ctx, t }) {
|
|
|
20663
20789
|
t,
|
|
20664
20790
|
sessions,
|
|
20665
20791
|
anchor: anchor2,
|
|
20792
|
+
current,
|
|
20666
20793
|
onClose: close,
|
|
20667
20794
|
onOpen: (id) => {
|
|
20668
|
-
|
|
20669
|
-
|
|
20795
|
+
const navCtx = hostCtx ?? ctx;
|
|
20796
|
+
expandOwningWorkspaceGroup(navCtx, id);
|
|
20797
|
+
openHostSession(navCtx, id, open2);
|
|
20670
20798
|
close();
|
|
20671
20799
|
}
|
|
20672
20800
|
}
|
|
@@ -20894,6 +21022,24 @@ var CSS = `
|
|
|
20894
21022
|
.t-team-pulse-pop-dot[data-state="pending"]{background:var(--dsw-alias-state-warn-primary)}
|
|
20895
21023
|
.t-team-pulse-pop-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
20896
21024
|
.t-team-pulse-pop-tag{flex:none;font-size:11px;color:var(--dsw-alias-label-caption)}
|
|
21025
|
+
/* \u6BCF\u6761\u4F1A\u8BDD\u7684\u5BB9\u5668\uFF1A\u6807\u9898\u884C + id \u884C\u7EB5\u5411\u53E0\u653E\u3002 */
|
|
21026
|
+
.t-team-pulse-pop-item{display:flex;flex-direction:column;gap:0;border-radius:8px;overflow:hidden}
|
|
21027
|
+
.t-team-pulse-pop-item:hover{background:var(--dsw-alias-interactive-bg-hover)}
|
|
21028
|
+
/* \u5355\u6761\u4F1A\u8BDD\u4E0B\u65B9\u7684\u5C0F id \u884C\uFF1A\u7B49\u5BBD\u3001\u4F4E\u5BF9\u6BD4\uFF0C\u70B9\u51FB\u89E6\u53D1\u590D\u5236\uFF08\u4E0E\u6807\u9898\u884C\u540C hover \u533A\u57DF\uFF09\u3002 */
|
|
21029
|
+
.t-team-pulse-pop-id-btn{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;border:0;background:transparent;color:inherit;font:inherit;padding:0 8px 6px 22px;text-align:left;border-radius:0;cursor:copy}
|
|
21030
|
+
.t-team-pulse-pop-id{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:14px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}
|
|
21031
|
+
.t-team-pulse-pop-id[data-monospace="true"]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
21032
|
+
/* \u9762\u677F head \u4E0B\u7684"\u5F53\u524D\u4F1A\u8BDD"\u884C\uFF1A\u5DE6\u6807\u7B7E + \u7B49\u5BBD id + \u6807\u9898(\u6324\u538B) + \u53F3 hint\uFF0C\u6574\u884C\u53EF\u70B9\u590D\u5236\uFF1B\u4E0D\u8BBA\u4E0B\u9762\u6709\u6CA1\u6709\u300C\u9700\u8981\u6CE8\u610F\u300D\u7684\u4F1A\u8BDD\u90FD\u663E\u793A\u3002
|
|
21033
|
+
\u5F53\u524D\u4F1A\u8BDD id \u8FD8\u6CA1\u5C31\u7EEA\u65F6\u6574\u884C\u70B9 cursor:default\uFF0C\u4E14\u7528\u70B9\u72B6\u8FB9\u6846 + \u7425\u73C0\u8272 hint\uFF0C\u660E\u663E\u533A\u522B\u4E8E"\u5DF2\u5C31\u7EEA\u53EF\u590D\u5236"\u3002*/
|
|
21034
|
+
.t-team-pulse-pop-current{display:flex;align-items:center;gap:6px;width:calc(100% - 4px);margin:0 2px 6px;box-sizing:border-box;border:1px dashed color-mix(in srgb,var(--dsw-alias-border-l2) 70%,transparent);background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 60%,transparent);color:inherit;font:inherit;padding:5px 8px;border-radius:8px;cursor:copy;text-align:left}
|
|
21035
|
+
.t-team-pulse-pop-current:hover{border-color:color-mix(in srgb,var(--dsw-alias-border-l3) 80%,transparent)}
|
|
21036
|
+
.t-team-pulse-pop-current[data-copied="true"]{border-style:solid;border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary) 50%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent)}
|
|
21037
|
+
.t-team-pulse-pop-current[data-pending="true"]{cursor:default;border-style:dotted;background:transparent}
|
|
21038
|
+
.t-team-pulse-pop-current-label{flex:none;font-size:11px;color:var(--dsw-alias-label-secondary)}
|
|
21039
|
+
.t-team-pulse-pop-current-title{flex:1;min-width:0;font-size:11.5px;line-height:14px;color:var(--dsw-alias-label-caption);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
21040
|
+
.t-team-pulse-pop-current-hint{flex:none;font-size:11px;color:var(--dsw-alias-label-caption);white-space:nowrap}
|
|
21041
|
+
.t-team-pulse-pop-current[data-copied="true"] .t-team-pulse-pop-current-hint{color:var(--dsw-alias-state-success-primary)}
|
|
21042
|
+
.t-team-pulse-pop-current[data-pending="true"] .t-team-pulse-pop-current-hint{color:var(--dsw-alias-state-warn-primary)}
|
|
20897
21043
|
/* \u6D3B\u52A8\u6001\u52A8\u6548\uFF1A\u4E00\u6BB5\u9AD8\u4EAE\u6CBF\u5FC3\u7535\u56FE\u8DEF\u5F84\u6EDA\u52A8\uFF08\u8D70\u7EB8\uFF0F\u76D1\u62A4\u4EEA\u626B\u8FC7\u90A3\u4E00\u4E0B\uFF09\uFF0C\u53EA\u5BF9\u6709\u6D3B\u52A8\u6216\u6709\u5F85\u770B\u65F6\u751F\u6548\uFF1B
|
|
20898
21044
|
pathLength=100 \u8BA9\u8FD9\u91CC\u7684 100 \u5C31\u662F"\u6574\u6761\u8DEF\u5F84"\uFF0C\u4E0D\u5FC5\u77E5\u9053\u771F\u5B9E\u957F\u5EA6\u3002\u7A7A\u95F2\uFF08\u7070\uFF09\u65F6\u662F\u9759\u6B62\u5B9E\u7EBF\u3002
|
|
20899
21045
|
\u53C2\u6570\uFF08\u7528\u6237 2026-09-15 \u8C03\u8FC7\u4E24\u8F6E\uFF09\uFF1A\u9AD8\u4EAE\u7EA6\u5360\u4E00\u534A\u8DEF\u5F84\u30011.2s \u8DD1\u5B8C\u4E00\u5708 \u2014\u2014 \u60F3\u518D\u8C03\u5C31\u6539\u8FD9\u4E24\u4E2A\u6570\u3002
|
|
@@ -20970,10 +21116,12 @@ var CSS = `
|
|
|
20970
21116
|
.t-team-error{font-size:12px;color:var(--dsw-alias-state-error-primary)}
|
|
20971
21117
|
.t-team-btn{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;white-space:nowrap;cursor:pointer}
|
|
20972
21118
|
.t-team-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
|
|
20973
|
-
|
|
21119
|
+
/* \u6D6E\u5C42\u9AD8\u5EA6\u4E0A\u9650\uFF1A2026-09-20 \u7528\u6237\u8981\u6C42\u300C\u592A\u9AD8\u4E86\uFF0C\u7EDF\u4E00\u8C03\u77EE\u4E00\u70B9\u300D\u2014\u2014590px \u2192 460px\u3002
|
|
21120
|
+
\u4E94\u4E2A\u6807\u7B7E\uFF08\u4E13\u5BB6/\u6280\u80FD/\u5C0F\u961F/\u56E2\u961F/\u4EFB\u52A1\uFF09\u5171\u7528\u8FD9\u4E00\u4E2A\u6570\u5B57\uFF0C\u4E09\u5904 max-height \u4E00\u8D77\u6539\uFF08\u672C\u4F53 + squads/teams + tasks\uFF09\u3002 */
|
|
21121
|
+
.t-team-pop{position:fixed;z-index:60;width:720px;max-width:calc(100vw - 16px);max-height:min(460px, calc(100vh - 16px));overflow:hidden;box-sizing:border-box;display:flex;flex-direction:column;gap:8px;padding:10px;border-radius:12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-specific-menu, var(--dsw-alias-bg-layer-3));box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary)}
|
|
20974
21122
|
.t-team-pop .t-team-input{flex:0 0 auto;width:100%;min-width:0}
|
|
20975
21123
|
/* \u5F39\u7A97\u91CC\u7684\u4E09\u4E2A\u6807\u7B7E\uFF1A\u5C0F\u961F/\u56E2\u961F\u5185\u5BB9\u66F4\u5BBD\u66F4\u9AD8\uFF0C\u7528 data-tab \u653E\u5BBD\u5EA6 */
|
|
20976
|
-
.t-team-pop[data-tab="squads"],.t-team-pop[data-tab="teams"]{width:720px;max-height:min(
|
|
21124
|
+
.t-team-pop[data-tab="squads"],.t-team-pop[data-tab="teams"]{width:720px;max-height:min(460px, calc(100vh - 16px))}
|
|
20977
21125
|
.t-team-pop .t-team-tabs{gap:2px;padding-bottom:4px}
|
|
20978
21126
|
.t-team-pop .t-team-tab{font-size:12px;padding:3px 8px}
|
|
20979
21127
|
/* \u6807\u7B7E\u4E0A\u7684\u8BA1\u6570\uFF1A\u6BD4\u6807\u7B7E\u5C0F\u4E00\u53F7\u3001\u7A0D\u6DE1\uFF0Ctabular-nums \u8BA9\u6570\u5B57\u7B49\u5BBD \u2014\u2014 \u5426\u5219 401 \u2192 99 \u65F6\u6807\u7B7E\u5BBD\u5EA6\u4F1A\u8DF3\u3002 */
|
|
@@ -21016,7 +21164,7 @@ var CSS = `
|
|
|
21016
21164
|
.t-team-job-panel-body .t-team-job-row{padding:3px 6px;gap:6px;border-radius:6px;background:color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent)}
|
|
21017
21165
|
.t-team-job-panel-body .t-team-job-meta{gap:2px}
|
|
21018
21166
|
.t-team-job-panel-body .t-team-section-head{margin-top:2px}
|
|
21019
|
-
.t-team-pop[data-tab="tasks"]{width:720px;max-height:min(
|
|
21167
|
+
.t-team-pop[data-tab="tasks"]{width:720px;max-height:min(460px, calc(100vh - 16px))}
|
|
21020
21168
|
.t-team-pop .t-team-picker-list{max-height:150px}
|
|
21021
21169
|
.t-team-pop-list{display:flex;flex-direction:column;gap:6px;overflow:auto;min-height:0}
|
|
21022
21170
|
/* \u4E13\u5BB6 tab\uFF1A\u4E00\u6392 3 \u4E2A\uFF082026-09-16 \u7528\u6237\u8981\u6C42 \u2014\u2014 \u539F\u6765\u5355\u5217 + 320px \u592A\u7A84\uFF09\u3002
|
|
@@ -21030,16 +21178,28 @@ var CSS = `
|
|
|
21030
21178
|
.t-team-pop[data-tab="skills"] .t-team-pop-item{min-width:0}
|
|
21031
21179
|
/* \u4E13\u5BB6\u5361\u7247\uFF082026-09-16 \u7528\u6237\u6309\u53C2\u8003\u56FE\u5B9A\u7684\u98CE\u683C\uFF09\uFF1A\u5706\u5F62\u5934\u50CF + \u540D\u5B57/\u5BF9\u7167\u540D + \u591A\u884C\u7B80\u4ECB\uFF0C\u5361\u7247\u63CF\u8FB9\u3002
|
|
21032
21180
|
\u53C2\u8003\u56FE\u91CC\u7684\u5E95\u90E8\u6807\u7B7E\u6309\u7528\u6237\u8981\u6C42\u4E0D\u505A\uFF1B\u300C\u53EC\u5524\u300D\u4E5F\u6CA1\u505A\u6210\u6309\u94AE \u2014\u2014 \u6574\u5F20\u5361\u7247\u53EF\u70B9\u5373\u53EC\u5524
|
|
21033
|
-
\uFF08\u4E09\u5217\u4E0B\u6BCF\u5217\u7EA6 190px\uFF0C\u585E\u4E0D\u4E0B\u4E00\u4E2A\u80F6\u56CA\u6309\u94AE\uFF09\u3002
|
|
21034
|
-
|
|
21181
|
+
\uFF08\u4E09\u5217\u4E0B\u6BCF\u5217\u7EA6 190px\uFF0C\u585E\u4E0D\u4E0B\u4E00\u4E2A\u80F6\u56CA\u6309\u94AE\uFF09\u3002
|
|
21182
|
+
2026-09-20 \u7528\u6237\u8981\u6C42\u300C\u4E13\u5BB6\u6807\u7B7E\u7684\u5361\u7247\u548C\u6280\u80FD\u91CC\u4E00\u6837\u5927\u300D\uFF1A\u4E24\u4E2A tab \u672C\u6765\u5C31\u5171\u7528\u8FD9\u5F20\u5361\u7247\uFF0C
|
|
21183
|
+
\u5DEE\u522B\u5168\u5728\u5185\u5BB9 \u2014\u2014 \u4E13\u5BB6\u6BD4\u6280\u80FD\u591A\u4E00\u884C\u5BF9\u7167\u540D\u3001\u7B80\u4ECB\u53C8\u603B\u662F\u5360\u6EE1\u4E09\u884C\uFF0C\u4E8E\u662F\u6BD4\u6280\u80FD\u5361\u9AD8\u51FA\u4E00\u622A\u3002
|
|
21184
|
+
\u73B0\u5728\u5934\u90E8\u9AD8\u5EA6\u5199\u6B7B 32px\uFF08=\u5934\u50CF\u9AD8\uFF0C\u6B63\u597D\u5BB9\u5F97\u4E0B\u540D\u5B57 + \u5BF9\u7167\u540D\u4E24\u884C\uFF09\u3001\u7B80\u4ECB\u56FA\u5B9A\u4E24\u884C\u5360\u4F4D\uFF0C
|
|
21185
|
+
\u5361\u7247\u9AD8\u5EA6\u56E0\u6B64\u6052\u4E3A 93px\uFF0810+32+6+33+10+2\uFF09\uFF0C\u4E13\u5BB6\u4E0E\u6280\u80FD\u9010\u4E2A\u4E00\u6837\u5927\u3002 */
|
|
21186
|
+
.t-team-pop-item{display:flex;flex-direction:column;gap:6px;min-width:0;min-height:93px;box-sizing:border-box;overflow:hidden;text-align:left;padding:10px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:inherit;font:inherit;cursor:pointer}
|
|
21035
21187
|
.t-team-pop-item:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}
|
|
21188
|
+
/* \u5361\u7247\u88C1\u8FB9\uFF08overflow:hidden\uFF09\u4F1A\u628A\u5BBF\u4E3B\u9ED8\u8BA4\u7684 focus \u8F6E\u5ED3\u4E00\u8D77\u88C1\u6389\uFF0C\u952E\u76D8 Tab \u9009\u4E2D\u5C31\u770B\u4E0D\u51FA\u6765\u4E86\uFF0C
|
|
21189
|
+
\u6240\u4EE5\u7126\u70B9\u73AF\u81EA\u5DF1\u753B\u3001\u5E76\u538B\u5728\u5361\u7247\u5185\u4FA7\uFF08offset \u8D1F\u503C\uFF09\u3002 */
|
|
21190
|
+
.t-team-pop-item:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}
|
|
21191
|
+
/* \u5934\u90E8\u9AD8\u5EA6\u5199\u6B7B 32px\uFF1A\u5361\u7247\u7B49\u9AD8\u7684\u524D\u63D0\u3002\u6280\u80FD\u5361\u91CC\u6807\u9898\u53EA\u6709\u4E00\u884C\uFF0C\u6491\u5230 32px \u7684\u662F\u5934\u50CF\uFF1B
|
|
21192
|
+
\u4E13\u5BB6\u5361\u91CC\u6807\u9898\u6709\u4E24\u884C\uFF08\u540D\u5B57 + \u5BF9\u7167\u540D \u2248 31px\uFF09\uFF0C\u5FC5\u987B\u9489\u4F4F\uFF0C\u5426\u5219\u5B83\u4F1A\u6BD4\u6280\u80FD\u5361\u9AD8\u3002 */
|
|
21193
|
+
.t-team-pop-item .t-team-pop-head{height:32px}
|
|
21036
21194
|
.t-team-pop-head{display:flex;align-items:center;gap:8px;min-width:0}
|
|
21037
21195
|
.t-team-pop-avatar{flex:none;display:grid;place-items:center;width:32px;height:32px;border-radius:50%;background:var(--dsw-alias-bg-layer-3);font-size:16px;line-height:1}
|
|
21038
21196
|
.t-team-pop-title{display:flex;flex-direction:column;gap:2px;min-width:0}
|
|
21039
21197
|
.t-team-pop-name{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
21040
21198
|
.t-team-pop-sub{font-size:11px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
21041
|
-
/* \u7B80\u4ECB\
|
|
21042
|
-
|
|
21199
|
+
/* \u7B80\u4ECB\u56FA\u5B9A\u4E24\u884C\uFF1A\u5185\u5BB9\u591A\u7684\u622A\u65AD\uFF08-webkit-line-clamp:2\uFF09\uFF0C\u5185\u5BB9\u5C11\u7684\u7528 min-height \u5360\u4F4F\u4E24\u884C\u7684\u9AD8\u5EA6 \u2014\u2014
|
|
21200
|
+
\u8FD9\u4E00\u6761\u662F\u300C\u4E13\u5BB6\u5361 = \u6280\u80FD\u5361\u300D\u7684\u53E6\u4E00\u534A\uFF1A\u6280\u80FD\u63CF\u8FF0\u666E\u904D\u504F\u77ED\uFF0C\u4E0D\u5360\u4F4D\u7684\u8BDD\u6280\u80FD\u5361\u4F1A\u6BD4\u4E13\u5BB6\u5361\u77EE\u4E00\u622A\u3002
|
|
21201
|
+
\u4E24\u884C = 11px \xD7 1.5 \xD7 2 \u2248 33px\u3002\u60F3\u8C03\u884C\u6570\u5C31\u628A line-clamp \u4E0E min-height \u4E00\u8D77\u6539\u3002 */
|
|
21202
|
+
.t-team-pop-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:33px;font-size:11px;line-height:1.5;color:var(--dsw-alias-label-secondary)}
|
|
21043
21203
|
.t-team-pop-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 2px}
|
|
21044
21204
|
.t-team-pop-head{display:flex;align-items:center;justify-content:space-between;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary)}
|
|
21045
21205
|
/* ---- \u5B9A\u65F6\u4EFB\u52A1\uFF1A\u4FA7\u680F\u5165\u53E3\uFF08\u6CE8\u518C\u4E3A sidebar.panellist \u7684\u4E00\u884C\uFF0C\u4F4D\u4E8E\u300C\u65B0\u4F1A\u8BDD\u300D\u6309\u94AE\u4E0B\u65B9\uFF09 ---- */
|
|
@@ -21166,6 +21326,12 @@ var zh = {
|
|
|
21166
21326
|
"pulse.empty": "\u73B0\u5728\u6CA1\u6709\u9700\u8981\u6CE8\u610F\u7684\u4F1A\u8BDD",
|
|
21167
21327
|
"pulse.running": "\u8FD0\u884C\u4E2D",
|
|
21168
21328
|
"pulse.pending": "\u5F85\u67E5\u770B",
|
|
21329
|
+
"pulse.current": "\u5F53\u524D\u4F1A\u8BDD",
|
|
21330
|
+
"pulse.copy": "\u70B9\u6B64\u590D\u5236",
|
|
21331
|
+
"pulse.copyHint": "\u590D\u5236\u4F1A\u8BDD id",
|
|
21332
|
+
"pulse.copied": "\u5DF2\u590D\u5236",
|
|
21333
|
+
"pulse.idPending": "\u6682\u65E0 id",
|
|
21334
|
+
"pulse.idPendingHint": "\u5F53\u524D\u4F1A\u8BDD\u7684 id \u5C1A\u672A\u5C31\u7EEA",
|
|
21169
21335
|
"settings.loading": "\u6B63\u5728\u8BFB\u53D6\u540D\u518C\u2026",
|
|
21170
21336
|
"settings.retry": "\u91CD\u8BD5",
|
|
21171
21337
|
"settings.search": "\u641C\u7D22\u4E13\u5BB6\u540D\u6216\u7B80\u4ECB",
|
|
@@ -21450,6 +21616,12 @@ var en = {
|
|
|
21450
21616
|
"pulse.empty": "Nothing needs your attention right now",
|
|
21451
21617
|
"pulse.running": "Running",
|
|
21452
21618
|
"pulse.pending": "Unread",
|
|
21619
|
+
"pulse.current": "Current session",
|
|
21620
|
+
"pulse.copy": "Copy",
|
|
21621
|
+
"pulse.copyHint": "Copy session id",
|
|
21622
|
+
"pulse.copied": "Copied",
|
|
21623
|
+
"pulse.idPending": "no id yet",
|
|
21624
|
+
"pulse.idPendingHint": "Current session id not ready",
|
|
21453
21625
|
"settings.showTaskBadgeUnreadable": "Failed to read this setting",
|
|
21454
21626
|
"settings.uiPrefsWriteFailed": "Failed to save this setting",
|
|
21455
21627
|
"settings.loading": "Loading roster\u2026",
|
|
@@ -23818,28 +23990,37 @@ function materializeUpstreamClient(text, requireFn) {
|
|
|
23818
23990
|
return void 0;
|
|
23819
23991
|
}
|
|
23820
23992
|
}
|
|
23993
|
+
async function stage(label, run) {
|
|
23994
|
+
try {
|
|
23995
|
+
return await run();
|
|
23996
|
+
} catch (error62) {
|
|
23997
|
+
console.error(`[t-team] \u9636\u6BB5\u300C${label}\u300D\u5931\u8D25\uFF0C\u5DF2\u964D\u7EA7\uFF08GUI \u4E0E\u5176\u4F59\u529F\u80FD\u4E0D\u53D7\u5F71\u54CD\uFF09\uFF1A`, error62);
|
|
23998
|
+
return void 0;
|
|
23999
|
+
}
|
|
24000
|
+
}
|
|
23821
24001
|
async function apply(ctx) {
|
|
23822
|
-
ctx.effect(() => {
|
|
24002
|
+
await stage("\u6837\u5F0F\u6CE8\u5165", () => ctx.effect(() => {
|
|
23823
24003
|
const tag = document.createElement("style");
|
|
23824
24004
|
tag.dataset.plugin = PLUGIN_ID;
|
|
23825
24005
|
tag.textContent = CSS;
|
|
23826
24006
|
document.head.appendChild(tag);
|
|
23827
24007
|
return () => tag.remove();
|
|
23828
|
-
}, "t-team: style");
|
|
23829
|
-
ctx.effect(() => ctx.locale.register(NS, { zh, en }), "t-team: dictionaries");
|
|
23830
|
-
|
|
23831
|
-
|
|
23832
|
-
|
|
23833
|
-
|
|
23834
|
-
} catch (error62) {
|
|
23835
|
-
console.error("[t-team] \u56E2\u961F UI \u6302\u8F7D\u5931\u8D25\uFF08\u4E13\u5BB6\u9762\u677F\u4E0E @ \u53EC\u5524\u4E0D\u53D7\u5F71\u54CD\uFF09\uFF1A", error62);
|
|
23836
|
-
}
|
|
23837
|
-
}
|
|
24008
|
+
}, "t-team: style"));
|
|
24009
|
+
await stage("\u5B57\u5178\u6CE8\u518C", () => ctx.effect(() => ctx.locale.register(NS, { zh, en }), "t-team: dictionaries"));
|
|
24010
|
+
await stage("\u4E0A\u6E38\u56E2\u961F UI", async () => {
|
|
24011
|
+
const upstream = materializeUpstreamClient(client_bundle_default, require);
|
|
24012
|
+
if (upstream !== void 0 && typeof upstream.apply === "function") await upstream.apply(ctx);
|
|
24013
|
+
});
|
|
23838
24014
|
const getActive = () => String(ctx.locale.getSnapshot().active ?? "").toLowerCase().startsWith("zh") ? "zh" : "en";
|
|
23839
|
-
const
|
|
23840
|
-
|
|
23841
|
-
|
|
23842
|
-
|
|
24015
|
+
const remote = await stage("remote \u6302\u8F7D", async () => {
|
|
24016
|
+
const disposeRemote = await ctx.remote.$mount(TYPERT_REMOTE);
|
|
24017
|
+
ctx.effect(() => disposeRemote, "t-team: remote");
|
|
24018
|
+
return ctx.get("remote.tTeam");
|
|
24019
|
+
});
|
|
24020
|
+
if (remote === void 0) {
|
|
24021
|
+
console.error(`[t-team] remote \u547D\u540D\u7A7A\u95F4\u4E0D\u53EF\u7528\uFF08${ctx.locale.bind(NS)("error.remoteUnavailable")}\uFF09\uFF1A\u4E13\u5BB6\u540D\u518C\u3001\u9762\u677F\u4E0E @ \u53EC\u5524\u5747\u4E0D\u53EF\u7528\uFF0C\u4F46 GUI \u6B63\u5E38\u542F\u52A8\u3002`);
|
|
24022
|
+
return;
|
|
24023
|
+
}
|
|
23843
24024
|
await refresh(remote, true).catch((cause) => {
|
|
23844
24025
|
console.warn("[t-team] \u521D\u59CB\u540D\u518C\u8BFB\u53D6\u5931\u8D25\uFF0C\u8BBE\u7F6E\u9875\u53EF\u91CD\u8BD5\uFF1A", cause);
|
|
23845
24026
|
});
|
|
@@ -23853,192 +24034,197 @@ async function apply(ctx) {
|
|
|
23853
24034
|
console.warn("[t-team] \u754C\u9762\u504F\u597D\u8BFB\u53D6\u5931\u8D25\uFF0C\u6682\u6309\u9ED8\u8BA4\uFF08\u663E\u793A\u5FBD\u7AE0\uFF09\u5904\u7406\uFF1A", cause);
|
|
23854
24035
|
}
|
|
23855
24036
|
})();
|
|
23856
|
-
|
|
23857
|
-
|
|
23858
|
-
|
|
23859
|
-
|
|
23860
|
-
|
|
23861
|
-
|
|
23862
|
-
|
|
23863
|
-
|
|
23864
|
-
|
|
23865
|
-
|
|
23866
|
-
|
|
23867
|
-
|
|
23868
|
-
const
|
|
23869
|
-
|
|
23870
|
-
|
|
24037
|
+
await stage("UI \u6CE8\u518C", async () => {
|
|
24038
|
+
ctx.slots.inject("settings.section", () => ctx.slots.register({
|
|
24039
|
+
name: "settings.section",
|
|
24040
|
+
id: NS,
|
|
24041
|
+
order: 17,
|
|
24042
|
+
// 文案一律走字典(规范:产品可见文案由 locale 拥有,不接受硬编码分支)
|
|
24043
|
+
label: () => ctx.locale.bind(NS)("settings.title"),
|
|
24044
|
+
locale: NS,
|
|
24045
|
+
icon: "expert"
|
|
24046
|
+
}, (props) => import_react9.default.createElement(SettingsPanel, { ...props, t: ctx.locale.bind(NS), remote, getActive })));
|
|
24047
|
+
ctx.slots.inject("sidebar.panellist", () => {
|
|
24048
|
+
let disposeEntry;
|
|
24049
|
+
const sync = () => {
|
|
24050
|
+
const want = scheduleEntryVisible();
|
|
24051
|
+
if (want === (disposeEntry !== void 0)) return;
|
|
24052
|
+
if (!want) {
|
|
24053
|
+
disposeEntry?.();
|
|
24054
|
+
disposeEntry = void 0;
|
|
24055
|
+
return;
|
|
24056
|
+
}
|
|
24057
|
+
try {
|
|
24058
|
+
disposeEntry = ctx.slots.register({
|
|
24059
|
+
name: "sidebar.panellist",
|
|
24060
|
+
id: SCHEDULE_PANEL_KEY,
|
|
24061
|
+
// order 取最小:侧栏那一组里它排在最前,紧贴「新会话」按钮。
|
|
24062
|
+
order: 1,
|
|
24063
|
+
label: () => ctx.locale.bind(NS)("sched.nav"),
|
|
24064
|
+
locale: NS
|
|
24065
|
+
}, (props) => import_react9.default.createElement(ScheduleGlyph, { size: props?.size ?? 16 }));
|
|
24066
|
+
} catch (cause) {
|
|
24067
|
+
console.warn("[t-team] \u4FA7\u680F\u5B9A\u65F6\u4EFB\u52A1\u5165\u53E3\u6CE8\u518C\u5931\u8D25\uFF1A", cause);
|
|
24068
|
+
disposeEntry = void 0;
|
|
24069
|
+
}
|
|
24070
|
+
};
|
|
24071
|
+
const unsubscribe = subscribeUiPrefs(sync);
|
|
24072
|
+
sync();
|
|
24073
|
+
return () => {
|
|
24074
|
+
unsubscribe();
|
|
23871
24075
|
disposeEntry?.();
|
|
23872
24076
|
disposeEntry = void 0;
|
|
23873
|
-
|
|
23874
|
-
|
|
23875
|
-
|
|
23876
|
-
|
|
23877
|
-
|
|
23878
|
-
|
|
23879
|
-
|
|
23880
|
-
|
|
23881
|
-
|
|
23882
|
-
|
|
23883
|
-
|
|
23884
|
-
|
|
23885
|
-
|
|
23886
|
-
|
|
23887
|
-
|
|
23888
|
-
|
|
23889
|
-
|
|
23890
|
-
|
|
23891
|
-
|
|
23892
|
-
|
|
23893
|
-
|
|
23894
|
-
|
|
23895
|
-
|
|
23896
|
-
|
|
23897
|
-
ctx.slots.inject("main", () => ctx.slots.register({
|
|
23898
|
-
name: "main",
|
|
23899
|
-
key: SCHEDULE_PANEL_KEY,
|
|
23900
|
-
locale: NS
|
|
23901
|
-
}, (props) => import_react9.default.createElement(
|
|
23902
|
-
SectionBoundary,
|
|
23903
|
-
{ t: ctx.locale.bind(NS), reloadKey: "schedule" },
|
|
23904
|
-
import_react9.default.createElement(SchedulePanel, {
|
|
24077
|
+
};
|
|
24078
|
+
});
|
|
24079
|
+
ctx.slots.inject("main", () => ctx.slots.register({
|
|
24080
|
+
name: "main",
|
|
24081
|
+
key: SCHEDULE_PANEL_KEY,
|
|
24082
|
+
locale: NS
|
|
24083
|
+
}, (props) => import_react9.default.createElement(
|
|
24084
|
+
SectionBoundary,
|
|
24085
|
+
{ t: ctx.locale.bind(NS), reloadKey: "schedule" },
|
|
24086
|
+
import_react9.default.createElement(SchedulePanel, {
|
|
24087
|
+
...props,
|
|
24088
|
+
t: ctx.locale.bind(NS),
|
|
24089
|
+
remote,
|
|
24090
|
+
getActive,
|
|
24091
|
+
ctx: props?.ctx ?? ctx
|
|
24092
|
+
})
|
|
24093
|
+
)));
|
|
24094
|
+
ctx.slots.inject("conversation.session.header.utilities", () => ctx.slots.register({
|
|
24095
|
+
name: "conversation.session.header.utilities",
|
|
24096
|
+
id: `${NS}-jobs-badge`,
|
|
24097
|
+
order: 10,
|
|
24098
|
+
label: () => ctx.locale.bind(NS)("tab.tasks"),
|
|
24099
|
+
locale: NS
|
|
24100
|
+
}, (props) => import_react9.default.createElement(JobsBadge, {
|
|
23905
24101
|
...props,
|
|
23906
24102
|
t: ctx.locale.bind(NS),
|
|
23907
|
-
|
|
23908
|
-
|
|
23909
|
-
|
|
23910
|
-
|
|
23911
|
-
|
|
23912
|
-
|
|
23913
|
-
|
|
23914
|
-
|
|
23915
|
-
|
|
23916
|
-
|
|
23917
|
-
|
|
23918
|
-
|
|
23919
|
-
|
|
23920
|
-
|
|
23921
|
-
|
|
23922
|
-
|
|
23923
|
-
|
|
23924
|
-
|
|
23925
|
-
|
|
23926
|
-
|
|
23927
|
-
|
|
23928
|
-
|
|
23929
|
-
|
|
23930
|
-
|
|
23931
|
-
|
|
23932
|
-
|
|
23933
|
-
|
|
23934
|
-
|
|
23935
|
-
|
|
23936
|
-
|
|
23937
|
-
|
|
23938
|
-
|
|
23939
|
-
|
|
23940
|
-
|
|
23941
|
-
|
|
23942
|
-
|
|
23943
|
-
|
|
23944
|
-
|
|
23945
|
-
|
|
23946
|
-
|
|
23947
|
-
|
|
23948
|
-
|
|
23949
|
-
|
|
23950
|
-
|
|
23951
|
-
|
|
23952
|
-
|
|
23953
|
-
|
|
23954
|
-
|
|
23955
|
-
|
|
23956
|
-
|
|
23957
|
-
|
|
23958
|
-
|
|
23959
|
-
|
|
23960
|
-
|
|
23961
|
-
|
|
23962
|
-
|
|
23963
|
-
|
|
23964
|
-
|
|
23965
|
-
|
|
23966
|
-
|
|
23967
|
-
|
|
23968
|
-
|
|
23969
|
-
|
|
23970
|
-
|
|
23971
|
-
const current = await refresh(remote).catch(() => void 0);
|
|
23972
|
-
if (current === void 0) return [];
|
|
23973
|
-
const query = String(request?.query ?? "").toLowerCase();
|
|
23974
|
-
return current.experts.filter((expert) => expert.division === item && expert.conflict !== true && current.enabledSet.has(expert.slug) && matchExpert(expert, getActive(), query)).map((expert) => ({
|
|
23975
|
-
name: displayName(expert, getActive()),
|
|
23976
|
-
hint: expert.slug,
|
|
23977
|
-
section: ctx.locale.bind(NS)("trigger.group", { division: divisionLabel(expert, getActive()) })
|
|
23978
|
-
}));
|
|
23979
|
-
},
|
|
23980
|
-
onPick(pick2) {
|
|
23981
|
-
const slug = pick2?.candidate?.hint ?? "";
|
|
23982
|
-
const current = snapshotOf(remote);
|
|
23983
|
-
const expert = current?.experts.find((entry) => entry.slug === slug && current.enabledSet.has(slug));
|
|
23984
|
-
return expert === void 0 ? void 0 : { insert: referenceOf(expert, getActive()) };
|
|
23985
|
-
},
|
|
23986
|
-
codec: {
|
|
23987
|
-
clipboardText: (slug) => {
|
|
24103
|
+
ctx: props?.ctx ?? ctx,
|
|
24104
|
+
hostCtx: ctx
|
|
24105
|
+
})));
|
|
24106
|
+
ctx.slots.inject("conversation.session.header.utilities", () => ctx.slots.register({
|
|
24107
|
+
name: "conversation.session.header.utilities",
|
|
24108
|
+
id: `${NS}-pulse`,
|
|
24109
|
+
order: 1,
|
|
24110
|
+
label: () => ctx.locale.bind(NS)("pulse.on"),
|
|
24111
|
+
locale: NS
|
|
24112
|
+
}, (props) => import_react9.default.createElement(ActivePulse, {
|
|
24113
|
+
...props,
|
|
24114
|
+
t: ctx.locale.bind(NS),
|
|
24115
|
+
ctx: props?.ctx ?? ctx,
|
|
24116
|
+
hostCtx: ctx
|
|
24117
|
+
})));
|
|
24118
|
+
ctx.slots.inject("shell.overlay", () => ctx.slots.register({
|
|
24119
|
+
name: "shell.overlay",
|
|
24120
|
+
id: `${NS}-jobs`,
|
|
24121
|
+
order: 81,
|
|
24122
|
+
label: () => ctx.locale.bind(NS)("tab.tasks"),
|
|
24123
|
+
locale: NS
|
|
24124
|
+
}, (props) => import_react9.default.createElement(JobsDock, {
|
|
24125
|
+
...props,
|
|
24126
|
+
t: ctx.locale.bind(NS),
|
|
24127
|
+
ctx: props?.ctx ?? ctx,
|
|
24128
|
+
hostCtx: ctx
|
|
24129
|
+
})));
|
|
24130
|
+
ctx.slots.inject("conversation.input.left", () => ctx.slots.register({
|
|
24131
|
+
name: "conversation.input.left",
|
|
24132
|
+
id: NS,
|
|
24133
|
+
order: 10,
|
|
24134
|
+
locale: NS,
|
|
24135
|
+
inject: (sessionId) => {
|
|
24136
|
+
const target = () => resolveInputTarget(ctx, sessionId);
|
|
24137
|
+
return {
|
|
24138
|
+
sessionId,
|
|
24139
|
+
insertReference: (reference) => insertAtTarget(target(), reference),
|
|
24140
|
+
fillSquadCommand: (key) => insertSquadCommand(target(), key),
|
|
24141
|
+
insertSkillHint: (text) => insertSkillHint(target(), text)
|
|
24142
|
+
};
|
|
24143
|
+
}
|
|
24144
|
+
}, (props) => import_react9.default.createElement(SummonButton, { ...props, t: ctx.locale.bind(NS), remote, getActive, rootRemote: ctx.remote })));
|
|
24145
|
+
const registerSources = (active, divisions) => {
|
|
24146
|
+
const disposers = [];
|
|
24147
|
+
try {
|
|
24148
|
+
for (const [index, item] of divisions.entries()) {
|
|
24149
|
+
const sourceName = `${NS}:${item}`;
|
|
24150
|
+
disposers.push(ctx.inputTriggers.registerSource({
|
|
24151
|
+
trigger: "@",
|
|
24152
|
+
name: sourceName,
|
|
24153
|
+
order: 100 + index,
|
|
24154
|
+
showGroupTitle: false,
|
|
24155
|
+
async candidates(_session, request) {
|
|
24156
|
+
const current = await refresh(remote).catch(() => void 0);
|
|
24157
|
+
if (current === void 0) return [];
|
|
24158
|
+
const query = String(request?.query ?? "").toLowerCase();
|
|
24159
|
+
return current.experts.filter((expert) => expert.division === item && expert.conflict !== true && current.enabledSet.has(expert.slug) && matchExpert(expert, getActive(), query)).map((expert) => ({
|
|
24160
|
+
name: displayName(expert, getActive()),
|
|
24161
|
+
hint: expert.slug,
|
|
24162
|
+
section: ctx.locale.bind(NS)("trigger.group", { division: divisionLabel(expert, getActive()) })
|
|
24163
|
+
}));
|
|
24164
|
+
},
|
|
24165
|
+
onPick(pick2) {
|
|
24166
|
+
const slug = pick2?.candidate?.hint ?? "";
|
|
23988
24167
|
const current = snapshotOf(remote);
|
|
23989
|
-
const expert = current?.experts.find((entry) => entry.slug === slug);
|
|
23990
|
-
return expert === void 0 ?
|
|
24168
|
+
const expert = current?.experts.find((entry) => entry.slug === slug && current.enabledSet.has(slug));
|
|
24169
|
+
return expert === void 0 ? void 0 : { insert: referenceOf(expert, getActive()) };
|
|
23991
24170
|
},
|
|
23992
|
-
|
|
23993
|
-
|
|
23994
|
-
|
|
23995
|
-
|
|
23996
|
-
|
|
23997
|
-
|
|
24171
|
+
codec: {
|
|
24172
|
+
clipboardText: (slug) => {
|
|
24173
|
+
const current = snapshotOf(remote);
|
|
24174
|
+
const expert = current?.experts.find((entry) => entry.slug === slug);
|
|
24175
|
+
return expert === void 0 ? ctx.locale.bind(NS)("trigger.removed") : `@${displayName(expert, getActive())}\xA0`;
|
|
24176
|
+
},
|
|
24177
|
+
// 提交草稿时宿主用它把芯片展开成纯文本;专家被停用/移除时抛错阻止发送。
|
|
24178
|
+
async serialize(slug) {
|
|
24179
|
+
const current = await refresh(remote).catch(() => void 0);
|
|
24180
|
+
const expert = current?.experts.find((entry) => entry.slug === slug);
|
|
24181
|
+
if (expert === void 0 || current.enabledSet.has(expert.slug) !== true) {
|
|
24182
|
+
throw new Error(ctx.locale.bind(NS)("trigger.removed"));
|
|
24183
|
+
}
|
|
24184
|
+
return `@${displayName(expert, getActive())}\xA0`;
|
|
23998
24185
|
}
|
|
23999
|
-
return `@${displayName(expert, getActive())}\xA0`;
|
|
24000
24186
|
}
|
|
24001
|
-
}
|
|
24002
|
-
}
|
|
24003
|
-
}
|
|
24004
|
-
} catch (cause) {
|
|
24005
|
-
for (const dispose of disposers.reverse()) dispose();
|
|
24006
|
-
throw cause;
|
|
24007
|
-
}
|
|
24008
|
-
return () => {
|
|
24009
|
-
for (const dispose of disposers.reverse()) dispose();
|
|
24010
|
-
};
|
|
24011
|
-
};
|
|
24012
|
-
ctx.effect(() => {
|
|
24013
|
-
const installed = { signature: "", dispose: () => void 0 };
|
|
24014
|
-
const syncSources = () => {
|
|
24015
|
-
const snapshot = snapshotOf(remote);
|
|
24016
|
-
const divisions = [...new Set((snapshot?.experts ?? []).map((expert) => expert.division))].sort();
|
|
24017
|
-
if (divisions.length === 0) {
|
|
24018
|
-
installed.signature = "";
|
|
24019
|
-
return;
|
|
24020
|
-
}
|
|
24021
|
-
const signature = `${getActive()}|${divisions.join(",")}`;
|
|
24022
|
-
if (signature === installed.signature) return;
|
|
24023
|
-
installed.dispose();
|
|
24024
|
-
installed.dispose = () => void 0;
|
|
24025
|
-
try {
|
|
24026
|
-
installed.dispose = registerSources(getActive(), divisions);
|
|
24027
|
-
installed.signature = signature;
|
|
24187
|
+
}));
|
|
24188
|
+
}
|
|
24028
24189
|
} catch (cause) {
|
|
24029
|
-
|
|
24030
|
-
|
|
24190
|
+
for (const dispose of disposers.reverse()) dispose();
|
|
24191
|
+
throw cause;
|
|
24031
24192
|
}
|
|
24193
|
+
return () => {
|
|
24194
|
+
for (const dispose of disposers.reverse()) dispose();
|
|
24195
|
+
};
|
|
24032
24196
|
};
|
|
24033
|
-
|
|
24034
|
-
|
|
24035
|
-
|
|
24036
|
-
|
|
24037
|
-
|
|
24038
|
-
|
|
24039
|
-
|
|
24040
|
-
|
|
24041
|
-
|
|
24197
|
+
ctx.effect(() => {
|
|
24198
|
+
const installed = { signature: "", dispose: () => void 0 };
|
|
24199
|
+
const syncSources = () => {
|
|
24200
|
+
const snapshot = snapshotOf(remote);
|
|
24201
|
+
const divisions = [...new Set((snapshot?.experts ?? []).map((expert) => expert.division))].sort();
|
|
24202
|
+
if (divisions.length === 0) {
|
|
24203
|
+
installed.signature = "";
|
|
24204
|
+
return;
|
|
24205
|
+
}
|
|
24206
|
+
const signature = `${getActive()}|${divisions.join(",")}`;
|
|
24207
|
+
if (signature === installed.signature) return;
|
|
24208
|
+
installed.dispose();
|
|
24209
|
+
installed.dispose = () => void 0;
|
|
24210
|
+
try {
|
|
24211
|
+
installed.dispose = registerSources(getActive(), divisions);
|
|
24212
|
+
installed.signature = signature;
|
|
24213
|
+
} catch (cause) {
|
|
24214
|
+
console.error("[t-team] \u6CE8\u518C @ \u83DC\u5355\u5931\u8D25\uFF0C\u4E0B\u4E00\u6B21\u540D\u518C\u8BFB\u53D6\u65F6\u4F1A\u91CD\u8BD5\uFF1A", cause);
|
|
24215
|
+
installed.signature = "";
|
|
24216
|
+
}
|
|
24217
|
+
};
|
|
24218
|
+
const stopCatalog = onCatalogLoaded(syncSources);
|
|
24219
|
+
const unsubscribe = ctx.locale.subscribe(syncSources);
|
|
24220
|
+
syncSources();
|
|
24221
|
+
return () => {
|
|
24222
|
+
stopCatalog();
|
|
24223
|
+
unsubscribe();
|
|
24224
|
+
installed.dispose();
|
|
24225
|
+
};
|
|
24226
|
+
}, "t-team: input triggers");
|
|
24227
|
+
});
|
|
24042
24228
|
}
|
|
24043
24229
|
return module.exports;
|
|
24044
24230
|
}
|