claude-dashboard 0.3.0 → 0.5.0

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.
Files changed (64) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +23 -23
  3. package/.next/app-path-routes-manifest.json +4 -4
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/server/app/_not-found/page.js +2 -2
  6. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_not-found.html +1 -1
  9. package/.next/server/app/_not-found.rsc +15 -14
  10. package/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/usage/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/workflows/[id]/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/workflows/cleanup/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/workflows/metrics/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/history/[id]/page.js +3 -3
  17. package/.next/server/app/history/[id]/page.js.nft.json +1 -1
  18. package/.next/server/app/history/[id]/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/history/page.js +1 -1
  20. package/.next/server/app/history/page.js.nft.json +1 -1
  21. package/.next/server/app/history/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/history.html +1 -1
  23. package/.next/server/app/history.rsc +19 -18
  24. package/.next/server/app/index.html +1 -1
  25. package/.next/server/app/index.rsc +19 -18
  26. package/.next/server/app/page.js +3 -3
  27. package/.next/server/app/page.js.nft.json +1 -1
  28. package/.next/server/app/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app-paths-manifest.json +4 -4
  30. package/.next/server/chunks/{737.js → 205.js} +1 -1
  31. package/.next/server/chunks/859.js +1 -0
  32. package/.next/server/chunks/913.js +1 -0
  33. package/.next/server/pages/404.html +1 -1
  34. package/.next/server/pages/500.html +1 -1
  35. package/.next/static/chunks/145-28da47a464f75508.js +1 -0
  36. package/.next/static/chunks/{681-169bac155e276f59.js → 203-b5ea437c1564ad7d.js} +1 -1
  37. package/.next/static/chunks/{825-4978b2439a33cef8.js → 379-4e24b4cec3288453.js} +2 -2
  38. package/.next/static/chunks/app/history/[id]/page-f1bcc08cd0c7ed3a.js +1 -0
  39. package/.next/static/chunks/app/history/page-49d492cb998671de.js +1 -0
  40. package/.next/static/chunks/app/layout-71710c37c90ec543.js +1 -0
  41. package/.next/static/chunks/app/page-203d0a06b6f816f1.js +1 -0
  42. package/.next/static/css/dd6234534f9d7733.css +3 -0
  43. package/README.md +37 -0
  44. package/README.zh-TW.md +37 -0
  45. package/dist/src/lib/db/queries.js +9 -6
  46. package/dist/src/lib/i18n/messages.js +238 -0
  47. package/dist/src/lib/i18n/useI18n.js +20 -0
  48. package/dist/src/lib/terminal/pty-manager.js +15 -2
  49. package/dist/src/lib/websocket/server.js +40 -4
  50. package/dist/src/lib/workflow/agent-runner.js +61 -5
  51. package/dist/src/lib/workflow/engine.js +15 -9
  52. package/dist/src/lib/workflow/pipeline.js +4 -3
  53. package/dist/src/lib/workflow/types.js +13 -0
  54. package/package.json +1 -1
  55. package/.next/server/chunks/127.js +0 -1
  56. package/.next/server/chunks/715.js +0 -1
  57. package/.next/static/chunks/145-9e2ecf05b713d5fc.js +0 -1
  58. package/.next/static/chunks/app/history/[id]/page-eab330fda697344c.js +0 -1
  59. package/.next/static/chunks/app/history/page-916bd74f5162c281.js +0 -1
  60. package/.next/static/chunks/app/layout-37b1ff7dda2e8465.js +0 -1
  61. package/.next/static/chunks/app/page-9162fef9472d3bf1.js +0 -1
  62. package/.next/static/css/7e9040826c49fe12.css +0 -3
  63. /package/.next/static/{pBzMDpP4jDxDXXwu3L-os → 8Sxuhcec4DcSeUG8JGmqY}/_buildManifest.js +0 -0
  64. /package/.next/static/{pBzMDpP4jDxDXXwu3L-os → 8Sxuhcec4DcSeUG8JGmqY}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[369],{6396:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>c});var r=s(5155),o=s(2619),a=s.n(o),l=s(2115),d=s(7260),i=s(9145),n=s(5548);function c(){let e=(0,d.useParams)(),t=null==e?void 0:e.id,{t:s,locale:o}=(0,n.s)(),[c,u]=(0,l.useState)(null),[m,x]=(0,l.useState)(!0),[h,p]=(0,l.useState)(null);(0,l.useEffect)(()=>{t&&(x(!0),p(null),fetch("/api/workflows/".concat(t)).then(e=>{if(!e.ok)throw Error("HTTP ".concat(e.status));return e.json()}).then(e=>{u(e),x(!1)}).catch(e=>{p(e.message||"Failed to load workflow"),x(!1)}))},[t]);let f=(0,l.useMemo)(()=>c?function(e){let t=/(?:^|\s)([\w./-]+\.(?:ts|tsx|js|jsx|json|md|yml|yaml|css|sql))/g,s=new Set;for(let r of e){let e,o=r.output||"";for(;null!==(e=t.exec(o));){let t=e[1].trim();(t.includes("/")||t.includes("."))&&s.add(t)}}return Array.from(s).slice(0,30)}(c.steps):[],[c]);return(0,r.jsx)(i.R,{children:(0,r.jsxs)("div",{className:"p-4 space-y-4 overflow-y-auto overflow-x-hidden",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:s("historyDetail.title")}),(0,r.jsx)(a(),{href:"/history",className:"text-xs text-muted-foreground hover:text-foreground",children:s("historyDetail.back")})]}),m&&(0,r.jsx)("div",{className:"text-sm text-muted-foreground",children:s("historyDetail.loading")}),h&&(0,r.jsx)("div",{className:"text-sm text-red-400",children:s("historyDetail.loadFailed",{error:h})}),c&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"rounded-md border border-border p-3 text-sm space-y-1",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"text-muted-foreground",children:s("historyDetail.meta.title")})," ",c.workflow.title]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"text-muted-foreground",children:s("historyDetail.meta.status")})," ",s("status.".concat(c.workflow.status))]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"text-muted-foreground",children:s("historyDetail.meta.created")})," ",new Date(c.workflow.createdAt).toLocaleString(o)]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"text-muted-foreground",children:s("historyDetail.meta.completed")})," ",c.workflow.completedAt?new Date(c.workflow.completedAt).toLocaleString(o):"-"]}),(0,r.jsx)("div",{className:"pt-1",children:(0,r.jsx)(a(),{href:"/?prompt=".concat(encodeURIComponent("Continue this previous task with fixes/improvements: ".concat(c.workflow.userPrompt))),className:"text-xs text-emerald-400 hover:underline",children:s("historyDetail.retryWorkflow")})})]}),(0,r.jsxs)("div",{className:"rounded-md border border-border p-3",children:[(0,r.jsx)("div",{className:"text-sm font-medium mb-2",children:s("historyDetail.artifacts.title")}),0===f.length?(0,r.jsx)("div",{className:"text-xs text-muted-foreground",children:s("historyDetail.artifacts.empty")}):(0,r.jsx)("div",{className:"flex flex-wrap gap-2",children:f.map(e=>(0,r.jsx)("span",{className:"text-xs rounded border border-border px-2 py-1 text-muted-foreground",children:e},e))})]}),(0,r.jsx)("div",{className:"space-y-3",children:c.steps.map(e=>{var t,o;return(0,r.jsxs)("div",{className:"rounded-md border border-border p-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,r.jsx)("div",{className:"text-sm font-medium uppercase",children:e.role}),(0,r.jsxs)("div",{className:"text-xs text-muted-foreground",children:[s("status.".concat(e.status))," \xb7 ",null!=e.durationMs?"".concat(e.durationMs,"ms"):"-"," \xb7 ",s("historyDetail.step.in"),":"," ",null!=(t=e.tokensIn)?t:"-"," ",s("historyDetail.step.out"),": ",null!=(o=e.tokensOut)?o:"-"]})]}),(0,r.jsx)("div",{className:"mb-2",children:(0,r.jsx)(a(),{href:"/?prompt=".concat(encodeURIComponent("Retry from ".concat(e.role.toUpperCase()," stage. Original task: ").concat(c.workflow.userPrompt,"\n\nPrevious ").concat(e.role.toUpperCase()," output:\n").concat(e.output||s("historyDetail.step.noOutput")))),className:"text-xs text-emerald-400 hover:underline",children:s("historyDetail.step.retry")})}),(0,r.jsx)("pre",{className:"text-xs whitespace-pre-wrap break-words text-muted-foreground bg-black/20 rounded p-2 max-h-72 overflow-auto",children:e.output||s("historyDetail.step.noOutput")})]},e.id)})})]})]})})}},7963:(e,t,s)=>{Promise.resolve().then(s.bind(s,6396))}},e=>{e.O(0,[203,145,441,255,358],()=>e(e.s=7963)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[429],{4550:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>h});var r=s(5155),a=s(9145),l=s(2619),o=s.n(l),n=s(2115),d=s(5548);let i={pending:"text-gray-400",running:"text-emerald-400",paused:"text-yellow-400",completed:"text-blue-400",failed:"text-red-400",cancelled:"text-gray-500"},c=["all","pending","running","paused","completed","failed","cancelled"];function u(){let{t:e,locale:t}=(0,d.s)(),[s,a]=(0,n.useState)([]),[l,u]=(0,n.useState)(!0),[h,p]=(0,n.useState)(null),[b,f]=(0,n.useState)("all"),[g,j]=(0,n.useState)(""),[y,w]=(0,n.useState)(""),[v,N]=(0,n.useState)(1),[k,S]=(0,n.useState)(0),[C,M]=(0,n.useState)(30),[T,D]=(0,n.useState)(300),[O,P]=(0,n.useState)(null),[_,E]=(0,n.useState)(0),[L,A]=(0,n.useState)(null),F=(0,n.useMemo)(()=>Math.max(1,Math.ceil(k/20)),[k]);(0,n.useEffect)(()=>{let e=(v-1)*20,t=new URLSearchParams({limit:String(20),offset:String(e)});"all"!==b&&t.set("status",b),y.trim()&&t.set("q",y.trim()),u(!0),p(null),Promise.all([fetch("/api/workflows?".concat(t.toString())),fetch("/api/workflows/metrics")]).then(async e=>{let[t,s]=e;if(!t.ok)throw Error("HTTP ".concat(t.status));return{listJson:await t.json(),metricsJson:s.ok?await s.json():null}}).then(e=>{let{listJson:t,metricsJson:s}=e;a(t.workflows||[]),S(t.total||0),A(s),u(!1)}).catch(e=>{p(e.message||"Failed to load workflows"),u(!1)})},[v,y,b,_]);let J=async()=>{if(!window.confirm(e("history.cleanup.confirm",{keepDays:C,keepLatest:T})))return;P(null);let t=await fetch("/api/workflows/cleanup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({keepDays:C,keepLatest:T})}),s=await t.json();if(!t.ok)return void P((null==s?void 0:s.error)||e("history.cleanup.failed"));P(e("history.cleanup.success",{count:s.deleted})),N(1),E(e=>e+1)};return l?(0,r.jsx)("div",{className:"flex items-center justify-center p-8 text-sm text-muted-foreground",children:e("history.loading")}):h?(0,r.jsx)("div",{className:"flex items-center justify-center p-8 text-sm text-red-400",children:e("history.loadFailed",{error:h})}):(0,r.jsxs)("div",{className:"space-y-3 min-w-0 overflow-hidden",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("select",{value:b,onChange:e=>{f(e.target.value),N(1)},className:"h-8 rounded-md border border-border bg-background px-2 text-xs",children:c.map(t=>(0,r.jsx)("option",{value:t,children:"all"===t?e("history.filters.allStatuses"):e("status.".concat(t))},t))}),(0,r.jsx)("input",{value:g,onChange:e=>j(e.target.value),placeholder:e("history.filters.searchPlaceholder"),className:"h-8 min-w-[240px] rounded-md border border-border bg-background px-2 text-xs"}),(0,r.jsx)("button",{onClick:()=>{N(1),w(g)},className:"h-8 rounded-md border border-border px-3 text-xs hover:bg-white/5",children:e("history.filters.search")})]}),L&&(0,r.jsxs)("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2 text-xs",children:[(0,r.jsx)(m,{label:e("history.metrics.workflows"),value:String(L.workflowCount)}),(0,r.jsx)(m,{label:e("history.metrics.completedFailed"),value:"".concat(L.completedCount," / ").concat(L.failedCount)}),(0,r.jsx)(m,{label:e("history.metrics.avgWorkflow"),value:x(L.avgWorkflowDurationMs)}),(0,r.jsx)(m,{label:e("history.metrics.avgStep"),value:x(L.avgStepDurationMs)}),(0,r.jsx)(m,{label:e("history.metrics.tokensIn"),value:L.totalTokensIn.toLocaleString()}),(0,r.jsx)(m,{label:e("history.metrics.tokensOut"),value:L.totalTokensOut.toLocaleString()})]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border border-border rounded-md p-2",children:[(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:e("history.retention")}),(0,r.jsxs)("label",{className:"text-xs text-muted-foreground flex items-center gap-1",children:[e("history.keepDays"),(0,r.jsx)("input",{type:"number",min:1,value:C,onChange:e=>M(Math.max(1,Number(e.target.value)||1)),className:"h-7 w-20 rounded border border-border bg-background px-2"})]}),(0,r.jsxs)("label",{className:"text-xs text-muted-foreground flex items-center gap-1",children:[e("history.keepLatest"),(0,r.jsx)("input",{type:"number",min:1,value:T,onChange:e=>D(Math.max(1,Number(e.target.value)||1)),className:"h-7 w-24 rounded border border-border bg-background px-2"})]}),(0,r.jsx)("button",{onClick:J,className:"h-8 rounded-md border border-border px-3 text-xs hover:bg-white/5",children:e("history.runCleanup")}),O&&(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:O})]}),0===s.length?(0,r.jsx)("div",{className:"flex items-center justify-center p-8 text-sm text-muted-foreground",children:e("history.empty")}):(0,r.jsx)("div",{className:"overflow-auto max-w-full",children:(0,r.jsxs)("table",{className:"w-full text-sm table-fixed",children:[(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{className:"border-b border-border text-muted-foreground",children:[(0,r.jsx)("th",{className:"text-left py-2 px-3 font-medium",children:e("history.table.title")}),(0,r.jsx)("th",{className:"text-left py-2 px-3 font-medium",children:e("history.table.status")}),(0,r.jsx)("th",{className:"text-left py-2 px-3 font-medium",children:e("history.table.created")}),(0,r.jsx)("th",{className:"text-left py-2 px-3 font-medium",children:e("history.table.duration")})]})}),(0,r.jsx)("tbody",{children:s.map(s=>(0,r.jsxs)("tr",{className:"border-b border-border/50 hover:bg-white/5",children:[(0,r.jsx)("td",{className:"py-2 px-3 truncate max-w-[400px]",children:(0,r.jsx)(o(),{href:"/history/".concat(s.id),className:"hover:underline",children:s.title})}),(0,r.jsx)("td",{className:"py-2 px-3 ".concat(i[s.status]||""),children:e("status.".concat(s.status))}),(0,r.jsx)("td",{className:"py-2 px-3 text-muted-foreground",children:new Date(s.createdAt).toLocaleString(t)}),(0,r.jsx)("td",{className:"py-2 px-3 text-muted-foreground",children:s.completedAt?x(new Date(s.completedAt).getTime()-new Date(s.createdAt).getTime()):"-"})]},s.id))})]})}),(0,r.jsxs)("div",{className:"flex items-center justify-between text-xs text-muted-foreground",children:[(0,r.jsx)("span",{children:e("history.pagination.summary",{total:k,page:v,totalPages:F})}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("button",{onClick:()=>N(e=>Math.max(1,e-1)),disabled:v<=1,className:"h-8 rounded-md border border-border px-3 disabled:opacity-40",children:e("history.pagination.prev")}),(0,r.jsx)("button",{onClick:()=>N(e=>Math.min(F,e+1)),disabled:v>=F,className:"h-8 rounded-md border border-border px-3 disabled:opacity-40",children:e("history.pagination.next")})]})]})]})}function x(e){if(!Number.isFinite(e)||e<=0)return"-";let t=Math.floor(e/1e3),s=Math.floor(t/60);return s>0?"".concat(s,"m ").concat(t%60,"s"):"".concat(t,"s")}function m(e){let{label:t,value:s}=e;return(0,r.jsxs)("div",{className:"rounded-md border border-border p-2",children:[(0,r.jsx)("div",{className:"text-muted-foreground",children:t}),(0,r.jsx)("div",{className:"font-medium",children:s})]})}function h(){let{t:e}=(0,d.s)();return(0,r.jsx)(a.R,{children:(0,r.jsxs)("div",{className:"h-full overflow-y-auto overflow-x-hidden p-4",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-4",children:e("history.title")}),(0,r.jsx)(u,{})]})})}},5952:(e,t,s)=>{Promise.resolve().then(s.bind(s,4550))}},e=>{e.O(0,[203,145,441,255,358],()=>e(e.s=5952)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[177],{3673:()=>{},4241:(e,t,a)=>{Promise.resolve().then(a.t.bind(a,8963,23)),Promise.resolve().then(a.t.bind(a,3673,23)),Promise.resolve().then(a.bind(a,6014))},4636:(e,t,a)=>{"use strict";a.d(t,{T:()=>n});var s=a(5959),i=a(5257);let o="cdb-locale",n=(0,s.v)(e=>({locale:i.Xn,initialized:!1,setLocale:t=>{e({locale:t}),window.localStorage.setItem(o,t)},initialize:()=>{let t=window.localStorage.getItem(o);if(t&&i.dI.includes(t))return void e({locale:t,initialized:!0});let a=window.navigator.language.toLowerCase().startsWith("zh")?"zh-TW":"en";e({locale:a,initialized:!0}),window.localStorage.setItem(o,a)}}))},5257:(e,t,a)=>{"use strict";a.d(t,{DZ:()=>o,Xn:()=>i,dI:()=>s});let s=["en","zh-TW"],i="en",o={en:{"app.title":"Claude Dashboard","nav.dashboard":"Dashboard","nav.history":"History","nav.events":"Events","nav.terminal":"Terminal","nav.toggleEvents":"Toggle event log panel","nav.toggleTerminal":"Toggle terminal panel","nav.agentsProgress":"{completed}/{total} agents","nav.language":"Language","launcher.templates":"Templates:","launcher.placeholder":"Describe your development task...","launcher.start":"Start","launcher.pause":"Pause","launcher.resume":"Resume","launcher.cancel":"Cancel","launcher.preview":"Preview","launcher.runMode":"Run mode:","launcher.mode.full":"Full (PM/RD/UI/TEST/SEC)","launcher.mode.fast":"Fast (skip TEST/SEC)","launcher.mode.custom":"Custom","launcher.warning.skip":"⚠️ This run will skip {roles}.","launcher.impact":"Impact: {level}","launcher.suggestedMode":"Suggested mode: {mode}","launcher.applySuggestion":"Apply suggestion","launcher.impact.low.reason":"Looks like a small scoped task. Fast mode is probably sufficient.","launcher.impact.medium.reason":"Likely multi-file change. Consider Full mode or at least include TEST.","launcher.impact.high.reason":"Prompt touches sensitive or high-risk areas. Keep TEST and SEC enabled.","history.title":"Workflow History","history.filters.allStatuses":"All statuses","history.filters.searchPlaceholder":"Search title or prompt","history.filters.search":"Search","history.retention":"Retention cleanup:","history.keepDays":"keep days","history.keepLatest":"keep latest","history.runCleanup":"Run Cleanup","history.loading":"Loading...","history.empty":"No workflows found.","history.table.title":"Title","history.table.status":"Status","history.table.created":"Created","history.table.duration":"Duration","history.pagination.prev":"Prev","history.pagination.next":"Next","history.metrics.workflows":"Workflows","history.metrics.completedFailed":"Completed / Failed","history.metrics.avgWorkflow":"Avg workflow","history.metrics.avgStep":"Avg step","history.metrics.tokensIn":"Tokens in","history.metrics.tokensOut":"Tokens out","history.pagination.summary":"{total} total \xb7 page {page}/{totalPages}","history.loadFailed":"Failed to load workflows: {error}","history.cleanup.confirm":"Cleanup history with policy: keep {keepDays} days OR latest {keepLatest} workflows?","history.cleanup.failed":"Cleanup failed","history.cleanup.success":"Cleanup complete: deleted {count} workflows.","pipeline.done":"Done","status.pending":"Pending","status.running":"Running","status.paused":"Paused","status.completed":"Done","status.failed":"Failed","status.skipped":"Skipped","status.cancelled":"Cancelled","agent.retry":"retry {count}","agent.tokens.in":"In: {value}","agent.tokens.out":"Out: {value}","agent.output.none":"No output yet","agent.activity.thinking":"Thinking...","agent.activity.toolUse":"Using {tool}...","agent.activity.writing":"Writing response...","agent.activity.waiting":"Waiting for output...","events.title":"Event Log","events.count":"{count} events","events.connected":"Connected to server","events.workflowStarted":"Workflow started: {title}","events.workflowCompleted":"Workflow completed successfully","events.workflowFailed":"Workflow failed: {error}","events.workflowPaused":"Workflow paused","events.workflowCancelled":"Workflow cancelled","events.agentStarted":"{agent} agent started{retry}","events.agentCompleted":"{agent} agent completed in {seconds}s","events.agentFailed":"{agent} agent failed: {error}","events.agentRetry":"{agent} agent retrying ({attempt}/{max}): {reason}","events.retrySuffix":" (retry {count})","usage.loadingAria":"Loading usage data","usage.unavailableAria":"Usage data unavailable","usage.unavailable":"Usage: --","usage.session":"Session","usage.week":"Week","usage.sonnet":"Sonnet","usage.tooltip.session":"Current Session (5h window)","usage.tooltip.week":"Weekly All Models (7 days)","usage.tooltip.sonnet":"Weekly Sonnet (7 days)","usage.tooltip.usage":"Usage: {value}","usage.tooltip.resets":"Resets: {value}","usage.tooltip.na":"N/A","terminal.title":"Terminal","terminal.connecting":"Connecting to server...","terminal.connected":"Connected","terminal.initializing":"Initializing...","terminal.error":"Error","historyDetail.title":"Workflow Detail","historyDetail.back":"← Back to History","historyDetail.loading":"Loading...","historyDetail.loadFailed":"Failed to load: {error}","historyDetail.meta.title":"Title:","historyDetail.meta.status":"Status:","historyDetail.meta.created":"Created:","historyDetail.meta.completed":"Completed:","historyDetail.retryWorkflow":"Retry entire workflow as new run","historyDetail.artifacts.title":"Run artifact summary (detected file paths)","historyDetail.artifacts.empty":"No file paths detected from agent outputs.","historyDetail.step.retry":"Retry from this step as new run","historyDetail.step.noOutput":"(no output)","historyDetail.step.in":"in","historyDetail.step.out":"out"},"zh-TW":{"app.title":"Claude 儀表板","nav.dashboard":"儀表板","nav.history":"歷史","nav.events":"事件","nav.terminal":"終端機","nav.toggleEvents":"切換事件面板","nav.toggleTerminal":"切換終端機面板","nav.agentsProgress":"{completed}/{total} 個代理","nav.language":"語言","launcher.templates":"模板:","launcher.placeholder":"描述你的開發任務...","launcher.start":"開始","launcher.pause":"暫停","launcher.resume":"繼續","launcher.cancel":"取消","launcher.preview":"預估","launcher.runMode":"執行模式:","launcher.mode.full":"完整(PM/RD/UI/TEST/SEC)","launcher.mode.fast":"快速(略過 TEST/SEC)","launcher.mode.custom":"自訂","launcher.warning.skip":"⚠️ 此次執行將略過 {roles}。","launcher.impact":"影響:{level}","launcher.suggestedMode":"建議模式:{mode}","launcher.applySuggestion":"套用建議","launcher.impact.low.reason":"看起來是小範圍任務,快速模式應該足夠。","launcher.impact.medium.reason":"可能會動到多個檔案,建議完整模式或至少包含 TEST。","launcher.impact.high.reason":"涉及敏感或高風險區域,建議保留 TEST 與 SEC。","history.title":"工作流程歷史","history.filters.allStatuses":"所有狀態","history.filters.searchPlaceholder":"搜尋標題或提示詞","history.filters.search":"搜尋","history.retention":"保留清理:","history.keepDays":"保留天數","history.keepLatest":"保留最新","history.runCleanup":"執行清理","history.loading":"載入中...","history.empty":"找不到工作流程。","history.table.title":"標題","history.table.status":"狀態","history.table.created":"建立時間","history.table.duration":"耗時","history.pagination.prev":"上一頁","history.pagination.next":"下一頁","history.metrics.workflows":"工作流程數","history.metrics.completedFailed":"完成 / 失敗","history.metrics.avgWorkflow":"平均流程","history.metrics.avgStep":"平均步驟","history.metrics.tokensIn":"輸入 tokens","history.metrics.tokensOut":"輸出 tokens","history.pagination.summary":"共 {total} 筆 \xb7 第 {page}/{totalPages} 頁","history.loadFailed":"載入工作流程失敗:{error}","history.cleanup.confirm":"清理策略:保留 {keepDays} 天 或 最新 {keepLatest} 筆工作流程,確定執行?","history.cleanup.failed":"清理失敗","history.cleanup.success":"清理完成:刪除 {count} 筆工作流程。","pipeline.done":"完成","status.pending":"待處理","status.running":"執行中","status.paused":"已暫停","status.completed":"完成","status.failed":"失敗","status.skipped":"略過","status.cancelled":"已取消","agent.retry":"重試 {count}","agent.tokens.in":"輸入: {value}","agent.tokens.out":"輸出: {value}","agent.output.none":"尚無輸出","agent.activity.thinking":"思考中...","agent.activity.toolUse":"使用 {tool} 中...","agent.activity.writing":"撰寫回應中...","agent.activity.waiting":"等待輸出中...","events.title":"事件記錄","events.count":"{count} 筆事件","events.connected":"已連線到伺服器","events.workflowStarted":"工作流程已開始:{title}","events.workflowCompleted":"工作流程已成功完成","events.workflowFailed":"工作流程失敗:{error}","events.workflowPaused":"工作流程已暫停","events.workflowCancelled":"工作流程已取消","events.agentStarted":"{agent} 代理已開始{retry}","events.agentCompleted":"{agent} 代理已於 {seconds}s 完成","events.agentFailed":"{agent} 代理失敗:{error}","events.agentRetry":"{agent} 代理重試中({attempt}/{max}):{reason}","events.retrySuffix":"(重試 {count})","usage.loadingAria":"載入使用量資料中","usage.unavailableAria":"使用量資料不可用","usage.unavailable":"使用量: --","usage.session":"本次","usage.week":"本週","usage.sonnet":"Sonnet","usage.tooltip.session":"目前會話(5 小時視窗)","usage.tooltip.week":"全模型週使用量(7 天)","usage.tooltip.sonnet":"Sonnet 週使用量(7 天)","usage.tooltip.usage":"使用率: {value}","usage.tooltip.resets":"重置: {value}","usage.tooltip.na":"無","terminal.title":"終端機","terminal.connecting":"連線到伺服器中...","terminal.connected":"已連線","terminal.initializing":"初始化中...","terminal.error":"錯誤","historyDetail.title":"工作流程詳情","historyDetail.back":"← 返回歷史","historyDetail.loading":"載入中...","historyDetail.loadFailed":"載入失敗:{error}","historyDetail.meta.title":"標題:","historyDetail.meta.status":"狀態:","historyDetail.meta.created":"建立時間:","historyDetail.meta.completed":"完成時間:","historyDetail.retryWorkflow":"重試整個工作流程(新執行)","historyDetail.artifacts.title":"執行產物摘要(偵測到的檔案路徑)","historyDetail.artifacts.empty":"未從代理輸出偵測到檔案路徑。","historyDetail.step.retry":"從此步驟重試(新執行)","historyDetail.step.noOutput":"(無輸出)","historyDetail.step.in":"輸入","historyDetail.step.out":"輸出"}}},5959:(e,t,a)=>{"use strict";a.d(t,{v:()=>n});var s=a(2115);let i=e=>{let t,a=new Set,s=(e,s)=>{let i="function"==typeof e?e(t):e;if(!Object.is(i,t)){let e=t;t=(null!=s?s:"object"!=typeof i||null===i)?i:Object.assign({},t,i),a.forEach(a=>a(t,e))}},i=()=>t,o={setState:s,getState:i,getInitialState:()=>n,subscribe:e=>(a.add(e),()=>a.delete(e))},n=t=e(s,i,o);return o},o=e=>{let t=(e=>e?i(e):i)(e),a=e=>(function(e,t=e=>e){let a=s.useSyncExternalStore(e.subscribe,s.useCallback(()=>t(e.getState()),[e,t]),s.useCallback(()=>t(e.getInitialState()),[e,t]));return s.useDebugValue(a),a})(t,e);return Object.assign(a,t),a},n=e=>e?o(e):o},6014:(e,t,a)=>{"use strict";a.d(t,{I18nInitializer:()=>o});var s=a(2115),i=a(4636);function o(){let e=(0,i.T)(e=>e.initialized),t=(0,i.T)(e=>e.initialize);return(0,s.useEffect)(()=>{e||t()},[e,t]),null}},8963:e=>{e.exports={style:{fontFamily:"'Inter', 'Inter Fallback'",fontStyle:"normal"},className:"__className_f367f3"}}},e=>{e.O(0,[300,441,255,358],()=>e(e.s=4241)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{3675:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>_});var l=r(5155),s=r(2115),n=r(9145),a=r(3339),o=r(1529),i=r(7671),d=r(4269);function c(e){let{role:t,status:r,isCurrent:s}=e,n=i.d0[t];return(0,l.jsx)("div",{className:"flex items-center gap-1",children:(0,l.jsxs)("div",{className:(0,d.cn)("relative px-3 py-1.5 rounded-md border text-xs font-medium transition-all duration-300",{pending:"border-gray-600 bg-gray-800/50 text-gray-500",running:"border-emerald-500 bg-emerald-500/10 text-emerald-400 shadow-lg shadow-emerald-500/20",completed:"border-blue-500 bg-blue-500/10 text-blue-400",failed:"border-red-500 bg-red-500/10 text-red-400",skipped:"border-gray-700 bg-gray-800/30 text-gray-600"}[r]),style:{borderColor:"running"===r||"completed"===r?n.color:void 0},children:["running"===r&&(0,l.jsxs)("span",{className:"absolute -top-0.5 -right-0.5 flex h-2 w-2",children:[(0,l.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full opacity-75",style:{backgroundColor:n.color}}),(0,l.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2",style:{backgroundColor:n.color}})]}),n.label]})})}var u=r(5548);function m(){let{currentStageIndex:e,status:t}=(0,a.Y)(),r=(0,o.o)(e=>e.agents),{t:s}=(0,u.s)();return(0,l.jsxs)("div",{className:"h-10 border-b border-border bg-card/50 flex items-center px-4 gap-1 min-w-0 overflow-x-hidden",children:[i.L2.map((s,n)=>(0,l.jsxs)("div",{className:"flex items-center",children:[n>0&&(0,l.jsx)("div",{className:"w-6 h-px bg-border mx-1"}),s.roles.length>1?(0,l.jsx)("div",{className:"flex items-center border border-border/50 rounded-lg px-1 gap-0.5",children:s.roles.map((s,a)=>(0,l.jsxs)("div",{className:"flex items-center",children:[a>0&&(0,l.jsx)("div",{className:"w-px h-4 bg-border mx-0.5"}),(0,l.jsx)(c,{role:s,status:r[s].status,isCurrent:n===e&&"running"===t})]},s))}):(0,l.jsx)(c,{role:s.roles[0],status:r[s.roles[0]].status,isCurrent:n===e&&"running"===t})]},s.index)),(0,l.jsx)("div",{className:"w-6 h-px bg-border mx-1"}),(0,l.jsx)("div",{className:(0,d.cn)("px-3 py-1.5 rounded-md border text-xs font-medium","completed"===t?"border-emerald-500 bg-emerald-500/10 text-emerald-400":"border-gray-600 bg-gray-800/50 text-gray-500"),children:s("pipeline.done")})]})}let x={pending:{key:"status.pending",className:"bg-gray-500/20 text-gray-400"},running:{key:"status.running",className:"bg-emerald-500/20 text-emerald-400 animate-pulse"},completed:{key:"status.completed",className:"bg-blue-500/20 text-blue-400"},failed:{key:"status.failed",className:"bg-red-500/20 text-red-400"},skipped:{key:"status.skipped",className:"bg-gray-500/20 text-gray-500"}};function f(e){let{status:t}=e,r=x[t],{t:s}=(0,u.s)();return(0,l.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium ".concat(r.className),children:s(r.key)})}var p=r(6504),h=r(4514);function b(e){let t=(0,s.useRef)(null),r=(0,s.useRef)(!1),l=(0,s.useCallback)(()=>{let e=t.current;if(!e)return;let{scrollTop:l,scrollHeight:s,clientHeight:n}=e;r.current=s-l-n>50},[]);return(0,s.useEffect)(()=>{let e=t.current;e&&!r.current&&(e.scrollTop=e.scrollHeight)},e),{ref:t,handleScroll:l}}function g(e){let{activity:t,t:r}=e;switch(t.kind){case"thinking":return(0,l.jsxs)("span",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"w-1.5 h-1.5 bg-amber-400 rounded-full animate-pulse"}),r("agent.activity.thinking")]});case"tool_use":return(0,l.jsxs)("span",{className:"flex items-center gap-2",children:[(0,l.jsxs)("span",{className:"relative flex h-2 w-2",children:[(0,l.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-blue-400 opacity-75"}),(0,l.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-blue-500"})]}),r("agent.activity.toolUse",{tool:t.toolName})]});case"text":return(0,l.jsxs)("span",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"w-1.5 h-1.5 bg-emerald-400 rounded-full animate-pulse"}),r("agent.activity.writing")]});default:return(0,l.jsxs)("span",{className:"flex items-center gap-2",children:[(0,l.jsxs)("span",{className:"relative flex h-2 w-2",children:[(0,l.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"}),(0,l.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-emerald-500"})]}),r("agent.activity.waiting")]})}}function v(e){let{output:t,isStreaming:r,activity:s}=e,{ref:n,handleScroll:a}=b([t]),{t:o}=(0,u.s)();return t?(0,l.jsxs)("div",{ref:n,onScroll:a,className:"agent-output overflow-y-auto overflow-x-hidden h-full px-2 py-1 min-w-0",children:[(0,l.jsx)("div",{className:"prose prose-invert prose-sm max-w-none min-w-0 break-words",children:(0,l.jsx)(p.oz,{remarkPlugins:[h.A],children:t})}),r&&(0,l.jsx)("span",{className:"inline-block w-1.5 h-3 bg-emerald-400 animate-pulse ml-0.5"})]}):(0,l.jsx)("div",{className:"flex flex-col items-center justify-center h-full gap-2 text-xs text-muted-foreground",children:r?(0,l.jsx)(g,{activity:null!=s?s:{kind:"idle"},t:o}):o("agent.output.none")})}function y(e){let{startedAt:t}=e,[r,n]=(0,s.useState)(Date.now());if((0,s.useEffect)(()=>{if(!t)return;let e=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(e)},[t]),!t)return null;let a=Math.floor((r-t)/1e3),o=a<60?"".concat(a,"s"):"".concat(Math.floor(a/60),"m ").concat(a%60,"s");return(0,l.jsx)("span",{className:"text-[10px] text-muted-foreground tabular-nums",children:o})}function w(e){let{role:t}=e,r=i.d0[t],{t:n}=(0,u.s)(),{status:a,output:d,error:c,durationMs:m,tokensIn:x,tokensOut:p,activity:h,startedAt:b,retryCount:g}=function(e){let t=(0,o.o)(t=>t.agents[e]),r=(0,s.useMemo)(()=>t.outputChunks.join(""),[t.outputChunks]);return{status:t.status,output:r,error:t.error,startedAt:t.startedAt,completedAt:t.completedAt,durationMs:t.durationMs,tokensIn:t.tokensIn,tokensOut:t.tokensOut,activity:t.activity,lastActivityAt:t.lastActivityAt,retryCount:t.retryCount}}(t);return(0,l.jsxs)("div",{className:"flex flex-col h-full min-w-0 rounded-lg border bg-[#1F2229] overflow-hidden",style:{borderColor:"running"===a?r.color:"completed"===a?"".concat(r.color,"40"):void 0},children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-3 py-2 border-b border-border",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("div",{className:"w-2 h-2 rounded-full",style:{backgroundColor:r.color}}),(0,l.jsx)("span",{className:"text-xs font-semibold",children:r.label}),g>0&&(0,l.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-amber-500/20 text-amber-400 font-medium",children:n("agent.retry",{count:g})})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:["running"===a?(0,l.jsx)(y,{startedAt:b}):null!=m&&(0,l.jsx)("span",{className:"text-[10px] text-muted-foreground",children:function(e){if(null==e)return"";let t=Math.floor(e/1e3);return t<60?"".concat(t,"s"):"".concat(Math.floor(t/60),"m ").concat(t%60,"s")}(m)}),(0,l.jsx)(f,{status:a})]})]}),(0,l.jsx)("div",{className:"flex-1 overflow-hidden min-h-0",children:c?(0,l.jsx)("div",{className:"p-2 text-xs text-red-400",children:c}):(0,l.jsx)(v,{output:d,isStreaming:"running"===a,activity:h})}),(null!=x||null!=p)&&(0,l.jsxs)("div",{className:"px-3 py-1 border-t border-border flex gap-3 text-[10px] text-muted-foreground",children:[null!=x&&(0,l.jsx)("span",{children:n("agent.tokens.in",{value:x.toLocaleString()})}),null!=p&&(0,l.jsx)("span",{children:n("agent.tokens.out",{value:p.toLocaleString()})})]})]})}function j(){return(0,l.jsx)("div",{className:"grid grid-cols-5 gap-2 p-2 h-full min-h-0 min-w-0 overflow-hidden",children:i.fB.map(e=>(0,l.jsx)(w,{role:e},e))})}var N=r(6074),k=r(5959);let C=0,S=(0,k.v)(e=>({events:[],addEvent:t=>e(e=>{let r={...t,id:"evt-".concat(++C),timestamp:new Date().toISOString()},l=[...e.events,r];return l.length>5e3?{events:l.slice(-5e3)}:{events:l}}),clear:()=>e({events:[]})})),E={info:"text-gray-400",warning:"text-yellow-400",error:"text-red-400",success:"text-emerald-400"};function I(e){var t,r;let{event:s}=e,{locale:n}=(0,u.s)(),a=new Date(s.timestamp).toLocaleTimeString(n,{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"}),o=s.role?null==(t=i.d0[s.role])?void 0:t.color:void 0;return(0,l.jsxs)("div",{className:"flex items-start gap-2 px-3 py-1 text-xs hover:bg-white/5 min-w-0 overflow-hidden",children:[(0,l.jsx)("span",{className:"text-muted-foreground shrink-0 font-mono",children:a}),s.role&&(0,l.jsxs)("span",{className:"shrink-0 font-medium",style:{color:o},children:["[",null==(r=i.d0[s.role])?void 0:r.label,"]"]}),(0,l.jsx)("span",{className:"min-w-0 break-all ".concat(E[s.type]||"text-gray-400"),children:s.message})]})}function R(){let e=S(e=>e.events),{t}=(0,u.s)(),r=(0,s.useRef)(null),{ref:n,handleScroll:a}=b([e.length]),o=(0,N.Te)({count:e.length,getScrollElement:()=>r.current,estimateSize:()=>28,overscan:20});return(0,l.jsxs)("div",{className:"flex flex-col h-full",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-3 py-1.5 border-b border-border",children:[(0,l.jsx)("span",{className:"text-xs font-medium",children:t("events.title")}),(0,l.jsx)("span",{className:"text-[10px] text-muted-foreground",children:t("events.count",{count:e.length})})]}),(0,l.jsx)("div",{ref:e=>{r.current=e,n.current=e},onScroll:a,className:"flex-1 overflow-auto",children:(0,l.jsx)("div",{style:{height:"".concat(o.getTotalSize(),"px"),width:"100%",position:"relative"},children:o.getVirtualItems().map(t=>(0,l.jsx)("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"".concat(t.size,"px"),transform:"translateY(".concat(t.start,"px)")},children:(0,l.jsx)(I,{event:e[t.index]})},t.key))})})]})}var M=r(7909),L=r(9863);let A=(0,k.v)()((0,L.Zr)(e=>({terminalId:null,connected:!1,setTerminalId:t=>e({terminalId:t}),setConnected:t=>e({connected:t}),reset:()=>e({terminalId:null,connected:!1})}),{name:"claude-dashboard-terminal",storage:(0,L.KU)(()=>sessionStorage),partialize:e=>({terminalId:e.terminalId})})),P=(0,M.default)(()=>r.e(899).then(r.bind(r,2899)).then(e=>({default:e.XTermRenderer})),{loadableGenerated:{webpack:()=>[2899]},ssr:!1});function T(e){let{send:t}=e,{terminalId:r,connected:n,setTerminalId:a}=A(),{t:o}=(0,u.s)(),i=(0,s.useRef)(null),[d,c]=(0,s.useState)(null),m=(0,s.useRef)([]),x=(0,s.useRef)(r);(0,s.useEffect)(()=>{x.current=r},[r]),(0,s.useEffect)(()=>{let e=e=>{if(!x.current||e.detail.terminalId===x.current){let t=String(e.detail.data||"");i.current?i.current.write(t):(m.current.push(t),m.current.length>200&&(m.current=m.current.slice(-200)))}};return window.addEventListener("terminal:output",e),()=>window.removeEventListener("terminal:output",e)},[]),(0,s.useEffect)(()=>{let e=setInterval(()=>{if(i.current&&0!==m.current.length){for(let e of m.current)i.current.write(e);m.current=[]}},120);return()=>clearInterval(e)},[]),(0,s.useEffect)(()=>{if(n&&r&&(t({type:"terminal:attach",payload:{terminalId:r,refresh:!0}}),h.current)){let{cols:e,rows:l}=h.current,s=setTimeout(()=>{t({type:"terminal:resize",payload:{terminalId:r,cols:e,rows:l}})},80);return()=>clearTimeout(s)}},[n,r,t]),(0,s.useEffect)(()=>{if(!n||r)return;let e=()=>{t({type:"terminal:create",payload:{projectPath:""}})};e();let l=setInterval(e,1500);return()=>clearInterval(l)},[n,r,t]),(0,s.useEffect)(()=>{let e=e=>{let t=String(e.detail.error||"");c(t),t.toLowerCase().includes("session not found")&&a(null)};return window.addEventListener("terminal:error",e),()=>window.removeEventListener("terminal:error",e)},[a]);let f=(0,s.useCallback)(e=>{r&&t({type:"terminal:input",payload:{terminalId:r,data:e}})},[r,t]),p=(0,s.useRef)(null),h=(0,s.useRef)(null);(0,s.useEffect)(()=>{r&&c(null)},[r]);let b=(0,s.useCallback)((e,l)=>{h.current={cols:e,rows:l},n&&r?(t({type:"terminal:resize",payload:{terminalId:r,cols:e,rows:l}}),p.current=null):p.current={cols:e,rows:l}},[n,r,t]);return((0,s.useEffect)(()=>{n&&r&&p.current&&(t({type:"terminal:resize",payload:{terminalId:r,...p.current}}),p.current=null)},[n,r,t]),n)?d?(0,l.jsxs)("div",{className:"h-full flex flex-col",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-3 py-1.5 border-b border-border",children:[(0,l.jsx)("span",{className:"text-xs font-medium",children:o("terminal.title")}),(0,l.jsx)("span",{className:"text-[10px] text-red-400",children:o("terminal.error")})]}),(0,l.jsx)("div",{className:"flex-1 flex items-center justify-center px-4",children:(0,l.jsx)("p",{className:"text-xs text-red-400 text-center",children:d})})]}):(0,l.jsxs)("div",{className:"h-full flex flex-col",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-3 py-1.5 border-b border-border",children:[(0,l.jsx)("span",{className:"text-xs font-medium",children:o("terminal.title")}),(0,l.jsx)("span",{className:"text-[10px] text-muted-foreground",children:o(r?"terminal.connected":"terminal.initializing")})]}),(0,l.jsx)("div",{className:"flex-1 min-h-0",children:(0,l.jsx)(P,{ref:i,onData:f,onResize:b})})]}):(0,l.jsx)("div",{className:"flex items-center justify-center h-full text-xs text-muted-foreground",children:o("terminal.connecting")})}let z=[{name:"Bugfix",text:"Fix the reported bug with root-cause analysis, minimal patch, and regression test."},{name:"Feature",text:"Implement this feature end-to-end with tests and concise docs updates."},{name:"Refactor",text:"Refactor for readability/maintainability without behavior changes; keep tests green."},{name:"Performance",text:"Profile bottlenecks, optimize critical path, and show before/after metrics."}],B=["pm","rd","ui"];function F(e){let{onStart:t,onPause:r,onResume:n,onCancel:d,initialPrompt:c}=e,[m,x]=(0,s.useState)(""),[f,p]=(0,s.useState)("full"),[h,b]=(0,s.useState)(i.fB),[g,v]=(0,s.useState)(null),{status:y}=(0,a.Y)(),{t:w}=(0,u.s)(),j=(0,o.o)(e=>e.resetAll),N=S(e=>e.clear),k=(0,a.Y)(e=>e.reset);(0,s.useEffect)(()=>{c&&c.trim()&&x(c.trim())},[c]),(0,s.useEffect)(()=>{v(null)},[m]);let C="full"===f?i.fB:"fast"===f?B:i.fB.filter(e=>h.includes(e)),E=(0,s.useCallback)(e=>{e.preventDefault(),m.trim()&&0!==C.length&&(k(),j(),N(),t(m.trim(),C))},[m,C,t,k,j,N]),I=(0,s.useCallback)(()=>{m.trim()&&v(function(e,t){let r=e.toLowerCase(),l=["auth","payment","security","delete","migration","database","permission"].filter(e=>r.includes(e)).length,s=["api","schema","checkout","order","billing","session"].filter(e=>r.includes(e)).length;return l>0?{impact:"high",suggestedMode:"full",rationale:t("launcher.impact.high.reason")}:s>1||e.length>180?{impact:"medium",suggestedMode:"custom",rationale:t("launcher.impact.medium.reason")}:{impact:"low",suggestedMode:"fast",rationale:t("launcher.impact.low.reason")}}(m,w))},[m,w]),R=(0,s.useCallback)(()=>{g&&p(g.suggestedMode)},[g]),M="pending"===y||"completed"===y||"failed"===y||"cancelled"===y;return(0,l.jsxs)("div",{className:"border-b border-border bg-card/50 px-4 py-3 space-y-2",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:w("launcher.templates")}),z.map(e=>(0,l.jsx)("button",{type:"button",disabled:!M,onClick:()=>x(e.text),className:"h-7 px-2 rounded-md border border-border text-xs hover:bg-white/5 disabled:opacity-40",children:e.name},e.name))]}),M&&(0,l.jsxs)("div",{className:"space-y-2",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,l.jsx)("span",{className:"text-muted-foreground",children:w("launcher.runMode")}),(0,l.jsx)("button",{type:"button",onClick:()=>p("full"),className:"h-7 rounded-md border px-2 ".concat("full"===f?"border-emerald-500 text-emerald-400":"border-border text-muted-foreground"),children:w("launcher.mode.full")}),(0,l.jsx)("button",{type:"button",onClick:()=>p("fast"),className:"h-7 rounded-md border px-2 ".concat("fast"===f?"border-yellow-500 text-yellow-400":"border-border text-muted-foreground"),children:w("launcher.mode.fast")}),(0,l.jsx)("button",{type:"button",onClick:()=>p("custom"),className:"h-7 rounded-md border px-2 ".concat("custom"===f?"border-blue-500 text-blue-400":"border-border text-muted-foreground"),children:w("launcher.mode.custom")})]}),"custom"===f&&(0,l.jsx)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:i.fB.map(e=>{let t=h.includes(e);return(0,l.jsxs)("label",{className:"inline-flex items-center gap-1 rounded border border-border px-2 py-1",children:[(0,l.jsx)("input",{type:"checkbox",checked:t,onChange:()=>{b(t=>t.includes(e)?t.length<=1?t:t.filter(t=>t!==e):[...t,e])}}),(0,l.jsx)("span",{className:"uppercase",children:e})]},e)})}),C.length<i.fB.length&&(0,l.jsx)("div",{className:"text-xs rounded-md border border-yellow-800/60 bg-yellow-900/20 px-2 py-1 text-yellow-300",children:w("launcher.warning.skip",{roles:i.fB.filter(e=>!C.includes(e)).join(", ").toUpperCase()})}),g&&(0,l.jsxs)("div",{className:"rounded-md border border-border p-2 text-xs space-y-1",children:[(0,l.jsxs)("div",{children:[w("launcher.impact",{level:g.impact})," "]}),(0,l.jsx)("div",{children:w("launcher.suggestedMode",{mode:g.suggestedMode})}),(0,l.jsx)("div",{className:"text-muted-foreground",children:g.rationale}),(0,l.jsx)("button",{type:"button",onClick:R,className:"h-7 rounded-md border border-border px-2 hover:bg-white/5",children:w("launcher.applySuggestion")})]})]}),(0,l.jsxs)("form",{onSubmit:E,className:"flex gap-2",children:[(0,l.jsx)("input",{type:"text",value:m,onChange:e=>x(e.target.value),placeholder:w("launcher.placeholder"),disabled:!M,className:"flex-1 h-9 rounded-md border border-border bg-background px-3 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:opacity-50"}),M&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("button",{type:"button",onClick:I,disabled:!m.trim(),className:"h-9 px-3 rounded-md border border-border text-xs hover:bg-white/5 disabled:opacity-50",children:w("launcher.preview")}),(0,l.jsx)("button",{type:"submit",disabled:!m.trim()||0===C.length,className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm font-medium hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed",children:w("launcher.start")})]}),"running"===y&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("button",{type:"button",onClick:r,className:"h-9 px-4 rounded-md bg-yellow-600 text-white text-sm font-medium hover:bg-yellow-700",children:w("launcher.pause")}),(0,l.jsx)("button",{type:"button",onClick:d,className:"h-9 px-4 rounded-md bg-red-600 text-white text-sm font-medium hover:bg-red-700",children:w("launcher.cancel")})]}),"paused"===y&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("button",{type:"button",onClick:n,className:"h-9 px-4 rounded-md bg-emerald-600 text-white text-sm font-medium hover:bg-emerald-700",children:w("launcher.resume")}),(0,l.jsx)("button",{type:"button",onClick:d,className:"h-9 px-4 rounded-md bg-red-600 text-white text-sm font-medium hover:bg-red-700",children:w("launcher.cancel")})]})]})]})}class D{push(e){this.buffer.push(e),this.timer||(this.timer=setTimeout(()=>this.flush(),this.flushIntervalMs))}flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.buffer.length>0){let e=this.buffer;this.buffer=[],this.onFlush(e)}}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null),this.buffer=[]}constructor(e,t=50){this.buffer=[],this.timer=null,this.onFlush=e,this.flushIntervalMs=t}}let O=[1e3,2e3,4e3,8e3,16e3];var Y=r(2002);function _(){let{send:e}=function(){let e=(0,s.useRef)(null),t=(0,s.useRef)(0),r=(0,s.useRef)(null),l=(0,s.useRef)(new Map),n=(0,s.useRef)(!0),{setWorkflow:d,setStatus:c,setCurrentStage:m,setCompleted:x}=(0,a.Y)(),{t:f}=(0,u.s)(),{applyExecutionPlan:p,appendChunks:h,setAgentStarted:b,setAgentCompleted:g,setAgentFailed:v,setAgentActivity:y,setAgentRetry:w}=(0,o.o)(),j=S(e=>e.addEvent),{setTerminalId:N,setConnected:k}=A(),C=(0,s.useCallback)(e=>{if(!l.current.has(e)){let t=new D(t=>{h(e,t)},50);l.current.set(e,t)}return l.current.get(e)},[h]),E=(0,s.useCallback)(e=>{switch(e.type){case"pong":break;case"workflow:created":{let{workflowId:t,title:r,executionPlan:s}=e.payload;for(let e of l.current.values())e.destroy();l.current.clear(),p(Array.isArray(s)&&s.length>0?s:i.fB),d(t,r),j({type:"info",message:f("events.workflowStarted",{title:r})});break}case"workflow:completed":for(let e of(x(),j({type:"success",message:f("events.workflowCompleted")}),l.current.values()))e.flush();break;case"workflow:failed":{let{error:t}=e.payload;for(let e of(c("failed"),j({type:"error",message:f("events.workflowFailed",{error:t})}),l.current.values()))e.flush();break}case"workflow:paused":c("paused"),j({type:"warning",message:f("events.workflowPaused")});break;case"workflow:cancelled":for(let e of(c("cancelled"),j({type:"warning",message:f("events.workflowCancelled")}),l.current.values()))e.flush();for(let e of i.fB)"running"===o.o.getState().agents[e].status&&v(e,"Cancelled");break;case"step:started":{let{role:t}=e.payload,r=(0,i.C1)(t),l=o.o.getState().agents[t].retryCount;m(r.index),b(t);let s=l>0?f("events.retrySuffix",{count:l}):"";j({type:"info",role:t,message:f("events.agentStarted",{agent:i.d0[t].label,retry:s})});break}case"step:stream":{let{role:t,chunk:r}=e.payload;C(t).push(r);break}case"step:completed":{let{role:t,output:r,durationMs:s,tokensIn:n,tokensOut:a}=e.payload,o=l.current.get(t);o&&o.flush(),g(t,r,s,n,a),j({type:"success",role:t,message:f("events.agentCompleted",{agent:i.d0[t].label,seconds:(s/1e3).toFixed(1)})});break}case"step:failed":{let{role:t,error:r}=e.payload,s=l.current.get(t);s&&s.flush(),v(t,r),j({type:"error",role:t,message:f("events.agentFailed",{agent:i.d0[t].label,error:r})});break}case"step:activity":{let{role:t,activity:r}=e.payload;y(t,r);break}case"step:retry":{let{role:t,attempt:r,maxRetries:l,reason:s}=e.payload;w(t,r),j({type:"warning",role:t,message:f("events.agentRetry",{agent:i.d0[t].label,attempt:r,max:l,reason:s})});break}case"terminal:created":{let{terminalId:t}=e.payload;N(t);break}case"terminal:output":{let t=e.payload.terminalId,r=e.payload.data;window.dispatchEvent(new CustomEvent("terminal:output",{detail:{terminalId:t,data:r}}));break}case"terminal:error":{let{error:t}=e.payload;window.dispatchEvent(new CustomEvent("terminal:error",{detail:{error:t}}));break}case"terminal:closed":N(null)}},[d,c,m,x,p,b,g,v,y,w,j,N,C,f]),I=(0,s.useCallback)(()=>{let l="https:"===window.location.protocol?"wss:":"ws:",s=new WebSocket("".concat(l,"//").concat(window.location.host,"/ws"));e.current=s,s.onopen=()=>{console.log("[WS] Connected"),t.current=0,k(!0),j({type:"info",message:f("events.connected")})},s.onmessage=e=>{try{let t=JSON.parse(e.data);E(t)}catch(e){console.error("[WS] Parse error:",e)}},s.onclose=()=>{if(console.log("[WS] Disconnected"),k(!1),e.current=null,!n.current)return;let l=O[Math.min(t.current,O.length-1)];t.current++,r.current=setTimeout(I,l)},s.onerror=e=>{console.error("[WS] Error:",e)}},[E,k,j,f]),R=(0,s.useCallback)(t=>{var r;(null==(r=e.current)?void 0:r.readyState)===WebSocket.OPEN&&e.current.send(JSON.stringify(t))},[]);return(0,s.useEffect)(()=>{n.current=!0,I();let t=setInterval(()=>{R({type:"ping"})},3e4);return()=>{for(let s of(n.current=!1,clearInterval(t),r.current&&clearTimeout(r.current),k(!1),e.current&&(e.current.onclose=null,e.current.close()),l.current.values()))s.destroy();l.current.clear()}},[I,R,k]),{send:R,wsRef:e}}(),[t,r]=(0,s.useState)(""),d=(0,a.Y)(e=>e.workflowId),{bottomPanelHeight:c,terminalVisible:x,eventLogVisible:f}=(0,Y.n)(),p=(0,s.useRef)(!1),h=(0,s.useRef)(0),b=(0,s.useRef)(0);(0,s.useEffect)(()=>{r(new URLSearchParams(window.location.search).get("prompt")||"")},[]);let g=(0,s.useCallback)((t,r)=>{e({type:"workflow:start",payload:{prompt:t,projectPath:"",executionPlan:r}})},[e]),v=(0,s.useCallback)(()=>{d&&e({type:"workflow:pause",payload:{workflowId:d}})},[e,d]),y=(0,s.useCallback)(()=>{d&&e({type:"workflow:resume",payload:{workflowId:d}})},[e,d]),w=(0,s.useCallback)(()=>{d&&e({type:"workflow:cancel",payload:{workflowId:d}})},[e,d]),N=(0,s.useCallback)(e=>{p.current=!0,h.current=e.clientY,b.current=c;let t=e=>{if(!p.current)return;let t=h.current-e.clientY,r=Math.max(100,Math.min(600,b.current+t));Y.n.getState().setBottomPanelHeight(r)},r=()=>{p.current=!1,document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",r)};document.addEventListener("mousemove",t),document.addEventListener("mouseup",r)},[c]);return(0,l.jsxs)(n.R,{children:[(0,l.jsx)(F,{onStart:g,onPause:v,onResume:y,onCancel:w,initialPrompt:t}),(0,l.jsx)(m,{}),(0,l.jsx)("div",{className:"flex-1 min-h-0 overflow-hidden",children:(0,l.jsx)(j,{})}),(0,l.jsx)("div",{onMouseDown:N,className:"h-1.5 bg-border hover:bg-primary/50 cursor-row-resize flex-shrink-0 transition-colors"}),(0,l.jsxs)("div",{className:"flex-shrink-0 flex overflow-hidden",style:{height:c},children:[f&&(0,l.jsx)("div",{className:"".concat(x?"w-1/2 border-r border-border":"w-full"," overflow-hidden"),children:(0,l.jsx)(R,{})}),x&&(0,l.jsx)("div",{className:"".concat(f?"w-1/2":"w-full"," overflow-hidden"),children:(0,l.jsx)(T,{send:e})})]})]})}},6664:(e,t,r)=>{Promise.resolve().then(r.bind(r,3675))}},e=>{e.O(0,[203,379,145,441,255,358],()=>e(e.s=6664)),_N_E=e.O()}]);
@@ -0,0 +1,3 @@
1
+ @font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/ba9851c3c22cd980-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/21350d82a1f187e9-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/c5fe6dc8356a8c31-s.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/19cfc7226ec3afaa-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/df0a9ae256c0569c-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/8e9860b6e62d6359-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/e4af272ccee01ff0-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Inter Fallback;src:local("Arial");ascent-override:90.44%;descent-override:22.52%;line-gap-override:0.00%;size-adjust:107.12%}.__className_f367f3{font-family:Inter,Inter Fallback;font-style:normal}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246/0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246/0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*
2
+ ! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
3
+ */*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:228 14% 8%;--foreground:220 10% 90%;--card:225 14% 11%;--card-foreground:220 10% 90%;--popover:225 14% 11%;--popover-foreground:220 10% 90%;--primary:262 83% 58%;--primary-foreground:0 0% 100%;--secondary:225 14% 15%;--secondary-foreground:220 10% 90%;--muted:225 14% 15%;--muted-foreground:220 10% 55%;--accent:225 14% 18%;--accent-foreground:220 10% 90%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:225 14% 18%;--input:225 14% 18%;--ring:262 83% 58%;--radius:0.5rem}*{border-color:hsl(var(--border))}body,html{overflow-x:hidden;background-color:hsl(var(--background));color:hsl(var(--foreground))}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgb(17 24 39/10%);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:rgb(255 255 255/10%);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgb(0 0 0/50%);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.-right-0\.5{right:-.125rem}.-top-0\.5{top:-.125rem}.bottom-full{bottom:100%}.left-1\/2{left:50%}.left-full{left:100%}.right-full{right:100%}.top-1\/2{top:50%}.top-full{top:100%}.z-50{z-index:50}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-0\.5{margin-left:.125rem}.ml-2{margin-left:.5rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-72{max-height:18rem}.min-h-0{min-height:0}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-6{width:1.5rem}.w-\[1px\]{width:1px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[240px\]{min-width:240px}.max-w-\[300px\]{max-width:300px}.max-w-\[400px\]{max-width:400px}.max-w-full{max-width:100%}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-row-resize{cursor:row-resize}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-border{border-color:hsl(var(--border))}.border-border\/50{border-color:hsl(var(--border)/.5)}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.border-emerald-500\/40{border-color:rgb(16 185 129/.4)}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-input{border-color:hsl(var(--input))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity,1))}.border-yellow-800\/60{border-color:rgb(133 77 14/.6)}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[\#080808\]{--tw-bg-opacity:1;background-color:rgb(8 8 8/var(--tw-bg-opacity,1))}.bg-\[\#1F2229\]{--tw-bg-opacity:1;background-color:rgb(31 34 41/var(--tw-bg-opacity,1))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.bg-amber-500\/20{background-color:rgb(245 158 11/.2)}.bg-background{background-color:hsl(var(--background))}.bg-black\/20{background-color:rgb(0 0 0/.2)}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-blue-500\/10{background-color:rgb(59 130 246/.1)}.bg-blue-500\/20{background-color:rgb(59 130 246/.2)}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-card\/50{background-color:hsl(var(--card)/.5)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity,1))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-500\/10{background-color:rgb(16 185 129/.1)}.bg-emerald-500\/20{background-color:rgb(16 185 129/.2)}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-gray-500\/20{background-color:rgb(107 114 128/.2)}.bg-gray-800\/30{background-color:rgb(31 41 55/.3)}.bg-gray-800\/50{background-color:rgb(31 41 55/.5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-500\/10{background-color:rgb(239 68 68/.1)}.bg-red-500\/20{background-color:rgb(239 68 68/.2)}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-yellow-500\/20{background-color:rgb(234 179 8/.2)}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.bg-yellow-900\/20{background-color:rgb(113 63 18/.2)}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-border{color:hsl(var(--border))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity,1))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-foreground{color:hsl(var(--foreground))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity,1))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-lg{--tw-shadow:0 10px 15px -3px rgb(0 0 0/0.1),0 4px 6px -4px rgb(0 0 0/0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgb(0 0 0/0.1),0 2px 4px -2px rgb(0 0 0/0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgb(0 0 0/0.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-emerald-500\/20{--tw-shadow-color:rgb(16 185 129/0.2);--tw-shadow:var(--tw-shadow-colored)}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:hsl(225 14% 8%)}::-webkit-scrollbar-thumb{background:hsl(225 14% 22%);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(225 14% 30%)}.agent-output .prose{overflow-wrap:break-word;font-size:.875rem;line-height:1.25rem;line-height:1.625;overflow-wrap:anywhere}.agent-output .prose pre{max-width:100%;overflow-x:auto;border-radius:calc(var(--radius) - 2px);background-color:rgb(0 0 0/.4);font-size:.75rem;line-height:1rem}.agent-output .prose table{width:100%;max-width:100%;table-layout:fixed}.agent-output .prose code{word-break:break-all;font-size:.75rem;line-height:1rem}.agent-output .prose blockquote{margin-top:.25rem;margin-bottom:.25rem;border-left-width:2px;border-left-color:rgb(59 130 246/.3);background-color:rgb(23 37 84/.2);padding:.125rem .5rem;font-size:.75rem;line-height:1rem;font-style:normal;color:hsl(var(--muted-foreground))}.agent-output .prose blockquote strong{font-weight:600;color:rgb(96 165 250/.8)}.agent-output .prose blockquote code{background-color:transparent;padding-left:0;padding-right:0;color:hsl(var(--muted-foreground))}.terminal-container .xterm{padding:8px}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive)/.8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive)/.9)}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.hover\:bg-primary\/50:hover{background-color:hsl(var(--primary)/.5)}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary)/.8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary)/.9)}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary)/.8)}.hover\:bg-white\/5:hover{background-color:rgb(255 255 255/.05)}.hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity,1))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:768px){.md\:block{display:block}.md\:flex{display:flex}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
package/README.md CHANGED
@@ -100,6 +100,43 @@ claude_dashboard/
100
100
  └── tsconfig.json
101
101
  ```
102
102
 
103
+ ## Changelog (0.1.0 → 0.5.0)
104
+
105
+ ### 0.5.0
106
+
107
+ - Added **tool use summaries** in agent streaming output — live display of which tools (Read, Edit, Bash, etc.) each agent is invoking with key parameters.
108
+ - Fixed **horizontal scrollbar overflow** across all pages by adding overflow constraints at multiple CSS and component levels (prose word-break, grid clipping, vertical-only scroll on history pages).
109
+ - Improved **agent completion state** — clean final output replaces streaming chunks so tool summaries are shown during execution but removed from the finished result.
110
+
111
+ ### 0.4.0
112
+
113
+ - Added **selectable execution plans** (`Full` / `Fast` / `Custom`) so small tasks can skip TEST/SEC when appropriate.
114
+ - Added **Impact Preview** before run start to estimate risk and suggest a run mode.
115
+ - Delivered broad **i18n support** (English + Traditional Chinese) with in-app language switcher and localized UI copy across dashboard, history, terminal, status labels, and events.
116
+
117
+ ### 0.3.0
118
+
119
+ - Introduced **Workflow History** and **Workflow Detail** pages backed by SQLite persistence.
120
+ - Added **history filters, pagination, retention cleanup, and workflow metrics**.
121
+ - Added **templates, artifact summary, and retry-as-new-run** UX.
122
+ - Hardened API/DB initialization paths and fixed history 500 issues.
123
+ - Improved terminal reliability with route-switch reconnect/reattach fixes, including TUI (`htop`) restoration and replay buffering.
124
+
125
+ ### 0.2.0
126
+
127
+ - Stabilized **npm package publishing and global install flow** (`cdb` launcher path and root detection fixes).
128
+ - Improved cross-platform compatibility by migrating DB runtime to **sql.js (SQLite WASM)**.
129
+ - Migrated server/tooling to **native ESM** and standardized test suite on **bun:test**.
130
+ - Updated installation and quick-start documentation.
131
+
132
+ ### 0.1.0
133
+
134
+ - Initial public baseline of Claude Dashboard:
135
+ - multi-agent PM→RD→UI→TEST→SEC pipeline
136
+ - real-time WebSocket streaming output
137
+ - integrated interactive terminal (xterm.js + node-pty)
138
+ - core workflow controls (start/pause/resume/cancel)
139
+
103
140
  ## ☕ Buy Me a Coffee
104
141
 
105
142
  If you find this project helpful, consider buying me a coffee!
package/README.zh-TW.md CHANGED
@@ -100,6 +100,43 @@ claude_dashboard/
100
100
  └── tsconfig.json
101
101
  ```
102
102
 
103
+ ## 版本更新紀錄(0.1.0 → 0.5.0)
104
+
105
+ ### 0.5.0
106
+
107
+ - 新增 **工具使用摘要**,agent 串流輸出中即時顯示正在呼叫的工具(Read、Edit、Bash 等)及其關鍵參數。
108
+ - 修正所有頁面的 **橫向捲軸溢出**,透過多層級 CSS 與元件約束(prose 斷字、grid 裁切、history 頁面限制為垂直捲動)。
109
+ - 改善 **agent 完成狀態** — 完成後以乾淨的最終輸出取代串流 chunks,工具摘要僅在執行期間顯示。
110
+
111
+ ### 0.4.0
112
+
113
+ - 新增 **可選執行計畫**(`Full` / `Fast` / `Custom`),小任務可依需求略過 TEST/SEC。
114
+ - 新增執行前 **Impact Preview**,可先估算風險並建議執行模式。
115
+ - 完成大範圍 **i18n 國際化**(英文 + 繁中),含語言切換器與 dashboard / history / terminal / 狀態文案 / 事件文案在地化。
116
+
117
+ ### 0.3.0
118
+
119
+ - 新增基於 SQLite 的 **Workflow History** 與 **Workflow Detail**。
120
+ - 新增 **歷史篩選、分頁、保留清理、流程指標統計**。
121
+ - 新增 **任務模板、產物摘要、以新執行重試** UX。
122
+ - 強化 API / DB 初始化流程,修正 history 500 問題。
123
+ - 強化 terminal 在路由切換下的穩定性,包含 TUI(如 `htop`)重連重附著與 replay 回放修正。
124
+
125
+ ### 0.2.0
126
+
127
+ - 穩定化 **npm 發佈與全域安裝流程**(`cdb` 啟動路徑與專案根目錄偵測修正)。
128
+ - 為跨平台相容性,資料庫執行時改為 **sql.js(SQLite WASM)**。
129
+ - 後端/工具鏈遷移為 **原生 ESM**,測試統一為 **bun:test**。
130
+ - 更新安裝與快速開始文件。
131
+
132
+ ### 0.1.0
133
+
134
+ - 初版公開基礎功能:
135
+ - PM→RD→UI→TEST→SEC 多代理流水線
136
+ - WebSocket 即時串流輸出
137
+ - 內建互動式終端機(xterm.js + node-pty)
138
+ - 基本流程控制(開始 / 暫停 / 繼續 / 取消)
139
+
103
140
  ## ☕ Buy Me a Coffee
104
141
 
105
142
  如果你覺得這個專案對你有幫助,可以請我喝杯咖啡喔!
@@ -1,6 +1,6 @@
1
1
  import { v4 as uuidv4 } from 'uuid';
2
2
  import { getDb } from "./connection.js";
3
- import { AGENT_ORDER, } from "../workflow/types.js";
3
+ import { AGENT_ORDER, normalizeExecutionPlan, } from "../workflow/types.js";
4
4
  function rowToWorkflow(row) {
5
5
  return {
6
6
  id: row.id,
@@ -35,11 +35,12 @@ function rowToStep(row) {
35
35
  // Workflow CRUD
36
36
  // ---------------------------------------------------------------------------
37
37
  /**
38
- * Create a new workflow together with its five agent-step rows (one per role
39
- * in `AGENT_ORDER`). Everything runs inside a single transaction so that the
40
- * workflow and its steps are always created atomically.
38
+ * Create a new workflow together with one agent-step row per role in
39
+ * `AGENT_ORDER`. Steps outside the requested execution plan are marked as
40
+ * `skipped`. Everything runs inside a single transaction so workflow + steps
41
+ * are always created atomically.
41
42
  */
42
- export function createWorkflow(id, title, userPrompt, projectPath) {
43
+ export function createWorkflow(id, title, userPrompt, projectPath, executionPlan) {
43
44
  const db = getDb();
44
45
  const insertWorkflow = db.prepare(`
45
46
  INSERT INTO workflows (id, title, user_prompt, status, current_step_index, project_path)
@@ -47,8 +48,9 @@ export function createWorkflow(id, title, userPrompt, projectPath) {
47
48
  `);
48
49
  const insertStep = db.prepare(`
49
50
  INSERT INTO agent_steps (id, workflow_id, role, status)
50
- VALUES (@id, @workflowId, @role, 'pending')
51
+ VALUES (@id, @workflowId, @role, @status)
51
52
  `);
53
+ const selected = new Set(normalizeExecutionPlan(executionPlan));
52
54
  const txn = db.transaction(() => {
53
55
  insertWorkflow.run({ id, title, userPrompt, projectPath });
54
56
  for (const role of AGENT_ORDER) {
@@ -56,6 +58,7 @@ export function createWorkflow(id, title, userPrompt, projectPath) {
56
58
  id: uuidv4(),
57
59
  workflowId: id,
58
60
  role,
61
+ status: selected.has(role) ? 'pending' : 'skipped',
59
62
  });
60
63
  }
61
64
  });