opencode-planpilot 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +397 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +3815 -0
- package/dist/index.js.map +1 -0
- package/dist/studio-bridge.d.ts +2 -0
- package/dist/studio-bridge.js +1985 -0
- package/dist/studio-bridge.js.map +1 -0
- package/dist/studio-web/planpilot-todo-bar.d.ts +33 -0
- package/dist/studio-web/planpilot-todo-bar.js +704 -0
- package/dist/studio-web/planpilot-todo-bar.js.map +1 -0
- package/dist/studio.manifest.json +968 -0
- package/package.json +6 -1
- package/src/command.ts +0 -13
- package/src/index.ts +587 -26
- package/src/lib/config.ts +436 -0
- package/src/prompt.ts +7 -2
- package/src/studio/bridge.ts +746 -0
- package/src/studio-web/main.ts +1030 -0
- package/src/studio-web/planpilot-todo-bar.ts +974 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/studio-web/planpilot-todo-bar.ts"],"sourcesContent":["/// <reference lib=\"dom\" />\n\ntype JsonPrimitive = string | number | boolean | null\ntype JsonObject = { [k: string]: JsonValue }\ntype JsonValue = JsonPrimitive | JsonObject | JsonValue[]\n\ntype HostApi = {\n invokeAction: (action: string, payload?: JsonValue, context?: JsonValue) => Promise<JsonValue>\n subscribeEvents: (handlers: {\n onEvent?: (evt: { type: string; data: JsonValue; lastEventId?: string }) => void\n onError?: (err: Event) => void\n }) => () => void\n}\n\ntype LayoutApi = {\n setReservePx: (px: number) => void\n}\n\nexport type StudioMountOptions = {\n pluginId: string\n surface: string\n title?: string\n context: Record<string, string>\n host: HostApi\n layout?: LayoutApi\n close?: () => void\n}\n\ntype PlanStatus = \"todo\" | \"done\"\ntype StepStatus = \"todo\" | \"done\"\ntype GoalStatus = \"todo\" | \"done\"\n\ntype PlanRow = {\n id: number\n title: string\n content: string\n status: PlanStatus\n comment: string | null\n last_session_id: string | null\n updated_at: number\n}\n\ntype StepRow = {\n id: number\n plan_id: number\n content: string\n status: StepStatus\n executor: \"ai\" | \"human\"\n sort_order: number\n comment: string | null\n}\n\ntype GoalRow = {\n id: number\n step_id: number\n content: string\n status: GoalStatus\n}\n\ntype RuntimeStepDetail = {\n step: StepRow\n goals: GoalRow[]\n wait?: { until: number; reason?: string } | null\n}\n\ntype RuntimeSnapshot = {\n paused: boolean\n activePlan: { plan_id: number } | null\n nextStep: RuntimeStepDetail | null\n}\n\ntype PlanDetail = {\n plan: PlanRow\n steps: StepRow[]\n goals: Array<{ stepId: number; goals: GoalRow[] }>\n}\n\ntype State = {\n sessionId: string\n loading: boolean\n busy: boolean\n error: string | null\n showOtherPlans: boolean\n collapsed: boolean\n viewedPlanId: number\n goalsExpandedByStepId: Record<string, boolean>\n runtime: RuntimeSnapshot | null\n activePlanDetail: PlanDetail | null\n sessionPlans: PlanRow[]\n}\n\ntype UiLocale = \"en-US\" | \"zh-CN\"\n\ntype UiStrings = {\n viewingSuffix: string\n loading: string\n noPlans: string\n checkingPlanStatus: string\n noPlansFoundForSession: string\n noSelectedPlanHint: string\n planDetailUnavailable: string\n showPlan: string\n noPlansInSession: string\n active: string\n noStepsYet: string\n waiting: string\n paused: string\n updating: string\n refresh: string\n planList: string\n close: string\n collapse: string\n error: string\n}\n\nconst UI_STRINGS: Record<UiLocale, UiStrings> = {\n \"en-US\": {\n viewingSuffix: \"(viewing)\",\n loading: \"Loading...\",\n noPlans: \"No plans\",\n checkingPlanStatus: \"Checking plan status...\",\n noPlansFoundForSession: \"No plans found for this session yet.\",\n noSelectedPlanHint: \"No plan is selected right now. Open Plan List to review a recent plan.\",\n planDetailUnavailable: \"Plan detail is unavailable\",\n showPlan: \"Show plan\",\n noPlansInSession: \"No plans in this session.\",\n active: \"Active\",\n noStepsYet: \"This plan has no steps yet.\",\n waiting: \"Waiting\",\n paused: \"Paused\",\n updating: \"Updating...\",\n refresh: \"Refresh\",\n planList: \"Plan List\",\n close: \"Close\",\n collapse: \"Collapse\",\n error: \"Error\",\n },\n \"zh-CN\": {\n viewingSuffix: \"(查看中)\",\n loading: \"加载中...\",\n noPlans: \"暂无计划\",\n checkingPlanStatus: \"正在检查计划状态...\",\n noPlansFoundForSession: \"此会话中还没有计划。\",\n noSelectedPlanHint: \"当前未选择计划。打开计划列表查看最近的计划。\",\n planDetailUnavailable: \"计划详情不可用\",\n showPlan: \"显示计划\",\n noPlansInSession: \"此会话中暂无计划。\",\n active: \"进行中\",\n noStepsYet: \"该计划还没有步骤。\",\n waiting: \"等待中\",\n paused: \"已暂停\",\n updating: \"更新中...\",\n refresh: \"刷新\",\n planList: \"计划列表\",\n close: \"关闭\",\n collapse: \"收起\",\n error: \"错误\",\n },\n}\n\nfunction normalizeLocale(value: string | undefined | null): UiLocale {\n const normalized = String(value || \"\").trim().toLowerCase()\n if (!normalized) return \"en-US\"\n if (normalized.startsWith(\"zh\")) return \"zh-CN\"\n return \"en-US\"\n}\n\nfunction asObject(value: JsonValue | undefined | null): Record<string, JsonValue> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {}\n return value as Record<string, JsonValue>\n}\n\nfunction asArray(value: JsonValue | undefined | null): JsonValue[] {\n return Array.isArray(value) ? value : []\n}\n\nfunction toNumber(value: JsonValue | undefined, fallback = 0): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback\n return Math.trunc(value)\n}\n\nfunction toStringValue(value: JsonValue | undefined, fallback = \"\"): string {\n if (typeof value !== \"string\") return fallback\n const trimmed = value.trim()\n return trimmed || fallback\n}\n\nfunction parseGoal(value: JsonValue): GoalRow | null {\n const obj = asObject(value)\n const id = toNumber(obj.id)\n const stepId = toNumber(obj.step_id)\n const content = toStringValue(obj.content)\n if (!id || !stepId || !content) return null\n return {\n id,\n step_id: stepId,\n content,\n status: toStringValue(obj.status) === \"done\" ? \"done\" : \"todo\",\n }\n}\n\nfunction parseStep(value: JsonValue): StepRow | null {\n const obj = asObject(value)\n const id = toNumber(obj.id)\n const planId = toNumber(obj.plan_id)\n const content = toStringValue(obj.content)\n if (!id || !planId || !content) return null\n return {\n id,\n plan_id: planId,\n content,\n status: toStringValue(obj.status) === \"done\" ? \"done\" : \"todo\",\n executor: toStringValue(obj.executor) === \"human\" ? \"human\" : \"ai\",\n sort_order: toNumber(obj.sort_order),\n comment: typeof obj.comment === \"string\" ? obj.comment : null,\n }\n}\n\nfunction parsePlan(value: JsonValue): PlanRow | null {\n const obj = asObject(value)\n const id = toNumber(obj.id)\n const title = toStringValue(obj.title)\n if (!id || !title) return null\n return {\n id,\n title,\n content: toStringValue(obj.content),\n status: toStringValue(obj.status) === \"done\" ? \"done\" : \"todo\",\n comment: typeof obj.comment === \"string\" ? obj.comment : null,\n last_session_id: typeof obj.last_session_id === \"string\" ? obj.last_session_id : null,\n updated_at: toNumber(obj.updated_at),\n }\n}\n\nfunction parseRuntime(value: JsonValue): RuntimeSnapshot | null {\n const obj = asObject(value)\n const activeObj = asObject(obj.activePlan)\n const nextObj = asObject(obj.nextStep)\n const nextStepRow = parseStep(nextObj.step as JsonValue)\n const nextGoals = asArray(nextObj.goals)\n .map(parseGoal)\n .filter((goal): goal is GoalRow => !!goal)\n const waitObj = asObject(nextObj.wait)\n\n const nextStepDetail: RuntimeStepDetail | null = nextStepRow\n ? {\n step: nextStepRow,\n goals: nextGoals,\n wait: waitObj.until\n ? {\n until: toNumber(waitObj.until),\n reason: toStringValue(waitObj.reason) || undefined,\n }\n : null,\n }\n : null\n\n return {\n paused: obj.paused === true,\n activePlan: activeObj.plan_id ? { plan_id: toNumber(activeObj.plan_id) } : null,\n nextStep: nextStepDetail,\n }\n}\n\nfunction parsePlanDetail(value: JsonValue): PlanDetail | null {\n const obj = asObject(value)\n const plan = parsePlan(obj.plan as JsonValue)\n if (!plan) return null\n\n const steps = asArray(obj.steps)\n .map(parseStep)\n .filter((step): step is StepRow => !!step)\n const goals = asArray(obj.goals)\n .map((entry) => {\n const e = asObject(entry)\n const stepId = toNumber(e.stepId)\n if (!stepId) return null\n const list = asArray(e.goals)\n .map(parseGoal)\n .filter((goal): goal is GoalRow => !!goal)\n return { stepId, goals: list }\n })\n .filter((entry): entry is { stepId: number; goals: GoalRow[] } => !!entry)\n\n return { plan, steps, goals }\n}\n\nfunction formattedWait(stepDetail: RuntimeStepDetail | null, locale: UiLocale): string {\n const wait = stepDetail?.wait\n if (!wait?.until) return \"\"\n const when = new Date(wait.until)\n if (Number.isNaN(when.getTime())) return \"\"\n const time = when.toLocaleTimeString(locale, { hour: \"2-digit\", minute: \"2-digit\" })\n return wait.reason ? `${time} (${wait.reason})` : time\n}\n\nfunction summarizePlanContent(content: string): string {\n const normalized = String(content || \"\").replace(/\\s+/g, \" \").trim()\n if (!normalized) return \"\"\n if (normalized.length <= 92) return normalized\n return `${normalized.slice(0, 92)}...`\n}\n\nfunction htmlEscape(value: string): string {\n return String(value)\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\")\n}\n\nfunction iconSvg(name: string, className: string): string {\n // Minimal inline icons (keep bundle tiny; exact glyph parity is not required).\n const common = `class=\"${className}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"`\n if (name === \"check\") {\n return `<svg ${common}><path d=\"M20 6 9 17l-5-5\"/></svg>`\n }\n if (name === \"chev\") {\n return `<svg ${common}><path d=\"m6 9 6 6 6-6\"/></svg>`\n }\n if (name === \"refresh\") {\n return `<svg ${common}><path d=\"M21 12a9 9 0 1 1-2.64-6.36\"/><path d=\"M21 3v6h-6\"/></svg>`\n }\n if (name === \"list\") {\n return `<svg ${common}><path d=\"M8 6h13\"/><path d=\"M8 12h13\"/><path d=\"M8 18h13\"/><path d=\"M3 6h.01\"/><path d=\"M3 12h.01\"/><path d=\"M3 18h.01\"/></svg>`\n }\n if (name === \"hide\") {\n return `<svg ${common}><path d=\"M3 3l18 18\"/><path d=\"M10.58 10.58A3 3 0 0 0 12 15a3 3 0 0 0 2.42-4.42\"/><path d=\"M9.88 5.09A10.4 10.4 0 0 1 12 5c7 0 10 7 10 7a18 18 0 0 1-3.2 4.2\"/><path d=\"M6.1 6.1A18.5 18.5 0 0 0 2 12s3 7 10 7a10.7 10.7 0 0 0 3.1-.4\"/></svg>`\n }\n if (name === \"x\") {\n return `<svg ${common}><path d=\"m6 6 12 12\"/><path d=\"m18 6-12 12\"/></svg>`\n }\n if (name === \"clock\") {\n return `<svg ${common}><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7v5l3 3\"/></svg>`\n }\n if (name === \"stack\") {\n return `<svg ${common}><path d=\"M12 2 2 7l10 5 10-5-10-5Z\"/><path d=\"m2 17 10 5 10-5\"/><path d=\"m2 12 10 5 10-5\"/></svg>`\n }\n return \"\"\n}\n\nexport function mount(el: HTMLElement, opts: StudioMountOptions) {\n const sessionId = String(opts.context?.sessionId || \"\").trim()\n const locale = normalizeLocale(opts.context?.locale || opts.context?.lang)\n const t = UI_STRINGS[locale]\n const hostManagedMode = opts.context?.studioOverlayMode === \"host-menu\"\n\n const state: State = {\n sessionId,\n loading: false,\n busy: false,\n error: null,\n showOtherPlans: false,\n collapsed: !hostManagedMode,\n viewedPlanId: 0,\n goalsExpandedByStepId: {},\n runtime: null,\n activePlanDetail: null,\n sessionPlans: [],\n }\n\n let refreshTimer: number | null = null\n let stopEvents: (() => void) | null = null\n let reserveObserver: ResizeObserver | null = null\n let reserveRaf = 0\n\n function setReservePx(px: number) {\n if (!opts.layout) return\n opts.layout.setReservePx(px)\n }\n\n function computeReserve(): number {\n const rect = el.getBoundingClientRect()\n if (!Number.isFinite(rect.height) || rect.height <= 0) return 0\n // Chat host positions the overlay with `bottom-2`.\n const bottomGap = 8\n return Math.max(0, Math.ceil(rect.height + bottomGap))\n }\n\n function scheduleReserveUpdate() {\n if (!opts.layout) return\n if (reserveRaf) return\n reserveRaf = window.requestAnimationFrame(() => {\n reserveRaf = 0\n if (!state.sessionId) {\n setReservePx(0)\n return\n }\n setReservePx(computeReserve())\n })\n }\n\n function isVisible(): boolean {\n return Boolean(state.sessionId)\n }\n\n function activePlan(): PlanRow | null {\n return state.activePlanDetail?.plan ?? null\n }\n\n function activeRuntimePlanId(): number {\n return state.runtime?.activePlan?.plan_id ?? 0\n }\n\n function activePlanId(): number {\n return activePlan()?.id ?? 0\n }\n\n function orderedSteps(detail: PlanDetail): StepRow[] {\n return [...detail.steps].sort((a, b) => {\n if (a.sort_order !== b.sort_order) return a.sort_order - b.sort_order\n return a.id - b.id\n })\n }\n\n function goalsForStepId(detail: PlanDetail, stepId: number): GoalRow[] {\n const entry = detail.goals.find((g) => g.stepId === stepId)\n const list = entry?.goals ?? []\n return [...list].sort((a, b) => a.id - b.id)\n }\n\n function isGoalsExpanded(stepId: number): boolean {\n return state.goalsExpandedByStepId[String(stepId)] === true\n }\n\n function toggleGoalsExpanded(stepId: number) {\n const stepsScrollEl = el.querySelector<HTMLElement>(\"[data-pp-scroll=\\\"steps\\\"]\")\n const prevStepsScrollTop = stepsScrollEl ? stepsScrollEl.scrollTop : null\n\n const key = String(stepId)\n state.goalsExpandedByStepId = {\n ...state.goalsExpandedByStepId,\n [key]: !(state.goalsExpandedByStepId[key] === true),\n }\n render()\n\n if (prevStepsScrollTop !== null) {\n const restore = () => {\n const nextStepsScrollEl = el.querySelector<HTMLElement>(\"[data-pp-scroll=\\\"steps\\\"]\")\n if (nextStepsScrollEl) nextStepsScrollEl.scrollTop = prevStepsScrollTop\n }\n restore()\n window.requestAnimationFrame(restore)\n }\n\n scheduleReserveUpdate()\n }\n\n function headerLabel(): string {\n const plan = activePlan()\n if (plan) return `#${plan.id} ${plan.title}`\n if (state.activePlanDetail?.plan) {\n const p = state.activePlanDetail.plan\n return `#${p.id} ${p.title} ${t.viewingSuffix}`\n }\n if (state.loading) return t.loading\n return t.noPlans\n }\n\n function planContent(): string {\n const content = state.activePlanDetail?.plan.content\n return String(content || \"\").trim()\n }\n\n function fallbackStatusMessage(): string {\n if (state.loading && !state.activePlanDetail) return t.checkingPlanStatus\n if (!state.activePlanDetail) {\n if (state.sessionPlans.length === 0) {\n return t.noPlansFoundForSession\n }\n return t.noSelectedPlanHint\n }\n return \"\"\n }\n\n async function invoke(action: string, payload: JsonValue = null): Promise<JsonValue> {\n return await opts.host.invokeAction(action, payload, null)\n }\n\n async function refreshAll() {\n if (!isVisible()) {\n state.runtime = null\n state.activePlanDetail = null\n state.sessionPlans = []\n state.error = null\n state.loading = false\n render()\n setReservePx(0)\n return\n }\n\n state.loading = true\n state.error = null\n render()\n scheduleReserveUpdate()\n\n try {\n const [runtimeRaw, activeRaw, plansRaw] = await Promise.all([\n invoke(\"runtime.snapshot\"),\n invoke(\"plan.active\"),\n invoke(\"plan.list\", {}),\n ])\n\n state.runtime = parseRuntime(runtimeRaw)\n\n const activeObj = asObject(activeRaw)\n const activeDetail = parsePlanDetail(activeObj.detail as JsonValue)\n\n const parsedPlans = asArray(plansRaw)\n .map(parsePlan)\n .filter((plan): plan is PlanRow => !!plan)\n .filter((plan) => plan.last_session_id === state.sessionId)\n .sort((a, b) => {\n if (a.updated_at !== b.updated_at) return b.updated_at - a.updated_at\n return b.id - a.id\n })\n state.sessionPlans = parsedPlans\n\n const planIdSet = new Set(parsedPlans.map((p) => p.id))\n if (state.viewedPlanId > 0 && !planIdSet.has(state.viewedPlanId)) {\n state.viewedPlanId = 0\n }\n\n const fallbackRecentPlanId = parsedPlans[0]?.id ?? 0\n const targetPlanId =\n state.viewedPlanId > 0\n ? state.viewedPlanId\n : (activeDetail?.plan?.id ?? 0) || fallbackRecentPlanId\n\n if (!targetPlanId) {\n state.activePlanDetail = null\n } else if (activeDetail && activeDetail.plan.id === targetPlanId) {\n state.activePlanDetail = activeDetail\n } else {\n const detailRaw = await invoke(\"plan.get\", { id: targetPlanId } as unknown as JsonValue)\n state.activePlanDetail = parsePlanDetail(detailRaw)\n }\n } catch (error) {\n state.error = error instanceof Error ? error.message : String(error)\n state.runtime = null\n state.activePlanDetail = null\n state.sessionPlans = []\n } finally {\n state.loading = false\n render()\n scheduleReserveUpdate()\n }\n }\n\n function scheduleRefresh(delayMs = 120) {\n if (refreshTimer) window.clearTimeout(refreshTimer)\n refreshTimer = window.setTimeout(() => {\n refreshTimer = null\n void refreshAll()\n }, Math.max(0, Math.floor(delayMs)))\n }\n\n function toggleCollapsed() {\n if (hostManagedMode) return\n state.collapsed = !state.collapsed\n if (state.collapsed) {\n state.showOtherPlans = false\n render()\n scheduleReserveUpdate()\n } else {\n void refreshAll()\n }\n }\n\n async function openPlan(planId: number) {\n if (!planId || state.busy) return\n state.busy = true\n state.error = null\n render()\n scheduleReserveUpdate()\n try {\n state.showOtherPlans = false\n const detailRaw = await invoke(\"plan.get\", { id: planId } as unknown as JsonValue)\n const detail = parsePlanDetail(detailRaw)\n if (!detail) throw new Error(t.planDetailUnavailable)\n state.viewedPlanId = planId\n state.activePlanDetail = detail\n } catch (error) {\n state.error = error instanceof Error ? error.message : String(error)\n } finally {\n state.busy = false\n render()\n scheduleReserveUpdate()\n }\n }\n\n function renderCollapsedButton(): string {\n return `\n <div class=\"pointer-events-auto p-1\">\n <button\n type=\"button\"\n data-pp-action=\"toggle\"\n class=\"h-9 w-9 rounded-full shadow-md border border-border/50 bg-background/80 backdrop-blur hover:bg-background transition-all inline-flex items-center justify-center\"\n aria-label=\"${t.showPlan}\"\n title=\"${t.showPlan}\"\n ${state.busy ? \"disabled\" : \"\"}\n >\n ${iconSvg(\"list\", \"h-5 w-5 text-muted-foreground\")}\n </button>\n </div>\n `\n }\n\n function renderPlanList(): string {\n if (state.sessionPlans.length === 0) {\n return `<div class=\"px-2 py-2 text-center text-xs text-muted-foreground\">${t.noPlansInSession}</div>`\n }\n\n const activeId = activePlanId()\n const runtimeActiveId = activeRuntimePlanId()\n const rows = state.sessionPlans\n .map((plan) => {\n const isActive = plan.id === activeId\n const isRuntimeActive = plan.id === runtimeActiveId\n const title = summarizePlanContent(plan.content) || `#${plan.id} ${plan.title}`\n const badge = isRuntimeActive\n ? `<span class=\"shrink-0 text-[10px] px-1 rounded bg-emerald-500/15 text-emerald-700\">${t.active}</span>`\n : \"\"\n const statusIcon =\n plan.status === \"done\"\n ? iconSvg(\"check\", \"h-4 w-4 shrink-0 text-emerald-700/70\")\n : iconSvg(\"stack\", \"h-4 w-4 shrink-0 text-muted-foreground/70\")\n\n return `\n <button\n type=\"button\"\n data-pp-plan-open=\"${plan.id}\"\n class=\"w-full h-8 text-left flex items-center gap-2 rounded-md border border-transparent px-2 transition-colors ${\n isActive ? \"bg-primary/5 border-primary/15\" : \"hover:bg-muted/30\"\n }\"\n ${state.busy ? \"disabled\" : \"\"}\n title=\"${htmlEscape(title)}\"\n >\n <div class=\"min-w-0 flex-1 flex items-center gap-1.5\">\n <span class=\"min-w-0 text-xs font-medium truncate\">#${plan.id} ${htmlEscape(plan.title)}</span>\n ${badge}\n </div>\n ${statusIcon}\n </button>\n `\n })\n .join(\"\")\n\n return `<div class=\"overflow-y-auto overscroll-contain flex-1 min-h-0\" style=\"max-height: 170px\"><div class=\"flex flex-col gap-[2px]\">${rows}</div></div>`\n }\n\n function renderSteps(detail: PlanDetail): string {\n const steps = orderedSteps(detail)\n if (!steps.length) {\n return `<div class=\"py-2 text-center text-xs text-muted-foreground italic leading-relaxed\">${t.noStepsYet}</div>`\n }\n\n const runtimeNextStepId =\n state.runtime?.activePlan?.plan_id === detail.plan.id ? state.runtime?.nextStep?.step.id ?? 0 : 0\n const derivedNextStepId = runtimeNextStepId\n ? 0\n : steps\n .filter((step) => step.status !== \"done\")\n .sort((a, b) => {\n if (a.sort_order !== b.sort_order) return a.sort_order - b.sort_order\n return a.id - b.id\n })[0]?.id ?? 0\n const nextStepId = runtimeNextStepId || derivedNextStepId\n const nextWaitLabel = runtimeNextStepId ? formattedWait(state.runtime?.nextStep ?? null, locale) : \"\"\n\n const items = steps\n .map((step) => {\n const goals = goalsForStepId(detail, step.id)\n const isNext = step.id === nextStepId\n const rowClass = isNext\n ? \"bg-primary/5 border-primary/15\"\n : step.status === \"done\"\n ? \"bg-muted/20 border-border/30 hover:bg-muted/25\"\n : \"hover:bg-muted/30\"\n\n const waitIcon =\n isNext && nextWaitLabel\n ? `<span title=\"${htmlEscape(`${t.waiting}: ${nextWaitLabel}`)}\" aria-label=\"${t.waiting}\">${iconSvg(\n \"clock\",\n \"h-4 w-4 text-amber-600/70\",\n )}</span>`\n : \"\"\n const doneIcon =\n step.status === \"done\" ? iconSvg(\"check\", \"h-4 w-4 text-emerald-700/70\") : \"\"\n const arrow = goals.length\n ? `<span class=\"${isGoalsExpanded(step.id) ? \"\" : \"-rotate-90\"} transition-transform\">${iconSvg(\n \"chev\",\n \"h-4 w-4 text-muted-foreground/60\",\n )}</span>`\n : \"\"\n\n const goalsBlock =\n goals.length && isGoalsExpanded(step.id)\n ? `\n <div class=\"pb-1 pl-7 pr-1.5\">\n <div class=\"space-y-0.5\">\n ${goals\n .map((goal) => {\n const line = goal.status === \"done\" ? \"bg-emerald-600/40\" : \"bg-muted-foreground/35\"\n const goalDone =\n goal.status === \"done\" ? iconSvg(\"check\", \"mt-0.5 h-3.5 w-3.5 shrink-0 text-emerald-700/70\") : \"\"\n return `\n <div class=\"flex items-start gap-2\">\n <span class=\"mt-2 h-px w-2 shrink-0 ${line}\" aria-hidden=\"true\"></span>\n <span class=\"min-w-0 flex-1 text-[11px] text-muted-foreground leading-snug break-words whitespace-pre-wrap ${\n goal.status === \"done\" ? \"opacity-75\" : \"\"\n }\">${htmlEscape(goal.content)}</span>\n ${goalDone}\n </div>\n `\n })\n .join(\"\")}\n </div>\n </div>\n `\n : \"\"\n\n const clickableAttrs = goals.length\n ? `data-pp-step-toggle=\"${step.id}\" role=\"button\" tabindex=\"0\" aria-expanded=\"${isGoalsExpanded(step.id)}\"`\n : \"\"\n\n return `\n <li class=\"rounded-md border border-transparent transition-colors ${rowClass}\">\n <div\n class=\"flex items-center gap-2 h-9 px-1.5 ${goals.length ? \"cursor-pointer\" : \"\"}\"\n ${clickableAttrs}\n title=\"${htmlEscape(step.content)}\"\n >\n <div class=\"min-w-0 flex-1\">\n <div class=\"text-[13px] leading-[1.1] truncate ${step.status === \"done\" ? \"text-muted-foreground opacity-75\" : \"text-foreground\"}\">\n ${htmlEscape(step.content)}\n </div>\n </div>\n <div class=\"flex items-center gap-1 shrink-0\">\n ${waitIcon}\n ${doneIcon}\n ${arrow}\n </div>\n </div>\n ${goalsBlock}\n </li>\n `\n })\n .join(\"\")\n\n return `<div data-pp-scroll=\"steps\" class=\"overflow-y-auto overscroll-contain flex-1 min-h-0\" style=\"max-height: 200px\"><ol class=\"flex flex-col gap-[2px]\">${items}</ol></div>`\n }\n\n function renderExpandedPanel(): string {\n const detail = state.activePlanDetail\n const content = planContent()\n const paused = state.runtime?.paused === true\n\n const main =\n detail === null\n ? `<div class=\"py-2 text-center text-xs text-muted-foreground italic leading-relaxed\">${htmlEscape(\n fallbackStatusMessage(),\n )}</div>`\n : state.showOtherPlans\n ? `\n <div class=\"flex flex-col gap-1 min-h-0\">\n ${renderPlanList()}\n </div>\n `\n : `\n <div class=\"flex flex-col gap-1.5 min-h-0\">\n ${\n content\n ? `<div class=\"text-[10px] text-muted-foreground leading-snug whitespace-pre-wrap break-words max-h-12 overflow-hidden\" title=\"${htmlEscape(\n content,\n )}\">${htmlEscape(content)}</div>`\n : \"\"\n }\n ${paused ? `<div class=\"flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground\"><span class=\"inline-flex items-center rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground\">${t.paused}</span></div>` : \"\"}\n ${renderSteps(detail)}\n </div>\n `\n\n const errorBlock = state.error\n ? `<div class=\"rounded bg-destructive/10 px-2 py-1.5 text-xs text-destructive flex items-start gap-2\"><span class=\"font-bold\">${t.error}:</span> ${htmlEscape(\n state.error,\n )}</div>`\n : \"\"\n\n const header = `\n <div class=\"flex items-center border-b border-border/30 bg-muted/20 gap-2 px-2 py-1\">\n <div class=\"flex items-center gap-1.5 min-w-0 flex-1\">\n <span class=\"truncate text-[11px] font-semibold text-foreground/90 select-none cursor-default\" title=\"${htmlEscape(\n headerLabel(),\n )}\">${htmlEscape(headerLabel())}</span>\n ${detail && detail.plan.status === \"done\" ? iconSvg(\"check\", \"h-3.5 w-3.5 shrink-0 text-emerald-700/70\") : \"\"}\n ${state.loading ? `<span class=\"animate-pulse text-[10px] text-muted-foreground\">${t.updating}</span>` : \"\"}\n </div>\n <div class=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n data-pp-action=\"refresh\"\n class=\"h-7 w-7 inline-flex items-center justify-center rounded hover:bg-muted/40\"\n title=\"${t.refresh}\"\n aria-label=\"${t.refresh}\"\n ${state.busy ? \"disabled\" : \"\"}\n >\n ${iconSvg(\"refresh\", \"h-3.5 w-3.5 text-muted-foreground/70\")}\n </button>\n <button\n type=\"button\"\n data-pp-action=\"toggleList\"\n class=\"h-7 w-7 inline-flex items-center justify-center rounded ${state.showOtherPlans ? \"bg-muted/40\" : \"hover:bg-muted/40\"}\"\n title=\"${t.planList}\"\n aria-label=\"${t.planList}\"\n aria-pressed=\"${state.showOtherPlans}\"\n >\n ${iconSvg(\"list\", \"h-3.5 w-3.5\")}\n </button>\n ${\n hostManagedMode\n ? `<div class=\"mx-1 h-3 w-px bg-border/50\"></div>\n <button\n type=\"button\"\n data-pp-action=\"close\"\n class=\"h-7 w-7 inline-flex items-center justify-center rounded hover:bg-muted/40\"\n title=\"${t.close}\"\n aria-label=\"${t.close}\"\n >\n ${iconSvg(\"x\", \"h-3.5 w-3.5 text-muted-foreground/70\")}\n </button>`\n : `<div class=\"mx-1 h-3 w-px bg-border/50\"></div>\n <button\n type=\"button\"\n data-pp-action=\"toggle\"\n class=\"h-7 w-7 inline-flex items-center justify-center rounded hover:bg-muted/40\"\n title=\"${t.collapse}\"\n aria-label=\"${t.collapse}\"\n >\n ${iconSvg(\"hide\", \"h-3.5 w-3.5 text-muted-foreground/70\")}\n </button>`\n }\n </div>\n </div>\n `\n\n return `\n <section class=\"pointer-events-auto w-full rounded-lg border border-border/60 bg-background/95 shadow-xl backdrop-blur-md overflow-hidden transition-all duration-300 ease-in-out flex flex-col max-h-[50vh]\">\n ${header}\n <div class=\"overflow-hidden flex-1 min-h-0 flex flex-col p-1.5 gap-1.5\">\n ${main}\n ${errorBlock}\n </div>\n </section>\n `\n }\n\n function render() {\n if (!isVisible()) {\n el.innerHTML = \"\"\n setReservePx(0)\n return\n }\n\n const body = hostManagedMode ? renderExpandedPanel() : state.collapsed ? renderCollapsedButton() : renderExpandedPanel()\n const containerClass = hostManagedMode ? \"pointer-events-none w-full\" : \"pointer-events-none w-full flex justify-end\"\n el.innerHTML = `<div class=\"${containerClass}\">${body}</div>`\n }\n\n function handleClick(event: MouseEvent) {\n const target = event.target as Element | null\n if (!target) return\n\n const actionEl = target.closest<HTMLElement>(\"[data-pp-action]\")\n if (actionEl) {\n const action = String(actionEl.dataset.ppAction || \"\").trim()\n if (action === \"toggle\") {\n toggleCollapsed()\n return\n }\n if (action === \"toggleList\") {\n state.showOtherPlans = !state.showOtherPlans\n render()\n scheduleReserveUpdate()\n return\n }\n if (action === \"refresh\") {\n scheduleRefresh(0)\n return\n }\n if (action === \"close\") {\n opts.close?.()\n return\n }\n return\n }\n\n const planEl = target.closest<HTMLElement>(\"[data-pp-plan-open]\")\n if (planEl) {\n const id = Number(planEl.dataset.ppPlanOpen)\n if (Number.isFinite(id) && id > 0) {\n void openPlan(Math.trunc(id))\n }\n return\n }\n\n const stepEl = target.closest<HTMLElement>(\"[data-pp-step-toggle]\")\n if (stepEl) {\n const id = Number(stepEl.dataset.ppStepToggle)\n if (Number.isFinite(id) && id > 0) {\n toggleGoalsExpanded(Math.trunc(id))\n }\n }\n }\n\n function handleKeydown(event: KeyboardEvent) {\n const target = event.target as Element | null\n if (!target) return\n if (event.key !== \"Enter\" && event.key !== \" \") return\n const stepEl = target.closest<HTMLElement>(\"[data-pp-step-toggle]\")\n if (!stepEl) return\n event.preventDefault()\n const id = Number(stepEl.dataset.ppStepToggle)\n if (Number.isFinite(id) && id > 0) {\n toggleGoalsExpanded(Math.trunc(id))\n }\n }\n\n function startEvents() {\n stopEvents?.()\n stopEvents = opts.host.subscribeEvents({\n onEvent: () => scheduleRefresh(90),\n onError: () => {\n // Keep UI stable; host SSE will reconnect.\n },\n })\n }\n\n // Mount lifecycle.\n el.addEventListener(\"click\", handleClick)\n el.addEventListener(\"keydown\", handleKeydown)\n\n if (typeof ResizeObserver !== \"undefined\" && opts.layout) {\n reserveObserver = new ResizeObserver(() => scheduleReserveUpdate())\n reserveObserver.observe(el)\n }\n\n render()\n scheduleReserveUpdate()\n startEvents()\n void refreshAll()\n\n return {\n unmount() {\n stopEvents?.()\n stopEvents = null\n if (refreshTimer) {\n window.clearTimeout(refreshTimer)\n refreshTimer = null\n }\n reserveObserver?.disconnect()\n reserveObserver = null\n if (reserveRaf) {\n window.cancelAnimationFrame(reserveRaf)\n reserveRaf = 0\n }\n el.removeEventListener(\"click\", handleClick)\n el.removeEventListener(\"keydown\", handleKeydown)\n el.innerHTML = \"\"\n setReservePx(0)\n },\n }\n}\n"],"mappings":"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","names":[]}
|