@mndrk/agx 2.4.7 → 2.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -53
- package/cloud-runtime/standalone/apps/local/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/apps/local/.next/build-manifest.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/prerender-manifest.json +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/agents.segments/agents.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.rsc +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_full.segment.rsc +4 -4
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github/select-repos.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations/github.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/integrations/github/select-repos.segments/integrations.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/env-vars/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/folders/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/notifications/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/[objectiveId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/objectives/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/prs/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/adopt/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/new/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/teams/replace/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/terminal/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/[threadId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/thread/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/[tracker]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/connect/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/[slug]/tracking/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/setup.segments/setup.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_full.segment.rsc +3 -3
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_index.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/app/status.segments/status.segment.rsc +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/apps_local_29a06140._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__5187dece._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__7752d2d2._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/[root-of-the-server]__e8c6a1f1._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_TrackerBoard_tsx_98970bab._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_components_projects_ProjectObjectivesWorkspace_tsx_751ab3d3._.js +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_eec36ab6._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/chunks/ssr/apps_local_fed01721._.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/middleware-manifest.json +5 -5
- package/cloud-runtime/standalone/apps/local/.next/server/pages/404.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/pages/500.html +2 -2
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/apps/local/.next/server/server-reference-manifest.json +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{5092f14c2bf43204.js → 3fce625820bc2bd4.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/6d8a7494a0cea7a0.css +1 -0
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{40857295bb9226c4.js → 8b87c2521c519a1f.js} +7 -7
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{90dcb743d23feeca.js → 90dd4ab03ab145d1.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{52a7b1805199c6fb.js → b4716c6337e3335c.js} +1 -1
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{1fbcd40dccee738f.js → cf33cb29946990e3.js} +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/{7bfbfcd072f8d61e.js → d0ba5f3dc5296486.js} +3 -3
- package/cloud-runtime/standalone/apps/local/app/integrations/github/select-repos/page.tsx +2 -0
- package/cloud-runtime/standalone/apps/local/app/layout.tsx +1 -1
- package/cloud-runtime/standalone/apps/local/components/TrackerBoard.tsx +39 -1
- package/cloud-runtime/standalone/apps/local/components/projects/ProjectObjectivesWorkspace.tsx +22 -2
- package/cloud-runtime/standalone/apps/local/components/tracking/TrackerSetup.tsx +22 -14
- package/cloud-runtime/standalone/apps/local/lib/tracker/adapters/github/adapter.tsx +40 -4
- package/cloud-runtime/standalone/apps/local/worker/index.js +1 -1
- package/package.json +2 -2
- package/cloud-runtime/standalone/apps/local/.next/static/chunks/5159169343ce6d2f.css +0 -1
- /package/cloud-runtime/standalone/apps/local/.next/static/{xVMVGrzDjtD1H0bGL76NJ → EGpM0P8xAEWKkoW-3Ib69}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{xVMVGrzDjtD1H0bGL76NJ → EGpM0P8xAEWKkoW-3Ib69}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/apps/local/.next/static/{xVMVGrzDjtD1H0bGL76NJ → EGpM0P8xAEWKkoW-3Ib69}/_ssgManifest.js +0 -0
|
@@ -45,6 +45,6 @@ ${d}
|
|
|
45
45
|
|
|
46
46
|
Work through these tickets as a coherent unit of work.
|
|
47
47
|
|
|
48
|
-
`+(j??""),f=await fetch("/api/chat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:b,promptPrefix:e,threadId:c.threadId,activeParticipantIds:[m.id],projectSlug:h??void 0,routing:k})}),i=await f.json().catch(()=>({}));if(!f.ok||!i.chatRunId||!i.userMessageId)throw Error(i.error||"Failed to start chat session");await v(c.id,{chatRunId:i.chatRunId,rootMessageId:i.userMessageId}),l(c.id)}catch(a){console.error("Failed to create group chat session:",a),I.current=!1,a instanceof Error&&window.alert(a.message)}},[a,s,f,w,g,h,u,v,l]);return(0,b.jsxs)("div",{className:"relative flex min-w-0 flex-1 flex-col overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex h-12 shrink-0 items-center gap-2 border-b border-[var(--card-border)] px-4",children:[(0,b.jsx)(aZ.FolderOpen,{size:16,className:"shrink-0 text-[var(--muted-foreground)]"}),n?(0,b.jsx)("input",{type:"text",value:p,onChange:a=>q(a.target.value),onBlur:r,onKeyDown:b=>{"Enter"===b.key&&r(),"Escape"===b.key&&(q(a.name),o(!1))},autoFocus:!0,className:"min-w-0 flex-1 bg-transparent text-sm font-medium text-[var(--foreground)] outline-none border-b border-[var(--primary)]"}):(0,b.jsx)("h3",{className:"min-w-0 flex-1 truncate text-sm font-medium text-[var(--foreground)]",children:a.name}),(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors",onClick:()=>{q(a.name),o(!0)},title:"Rename group",children:(0,b.jsx)(a0.Pencil,{size:12})}),(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] hover:text-red-400 transition-colors",onClick:j,title:"Delete group (ungroups tickets)",children:(0,b.jsx)(F.Trash2,{size:12})})]}),(0,b.jsxs)("div",{className:"min-h-0 flex-1 overflow-y-auto pb-64",children:[(0,b.jsxs)("section",{className:"border-b border-[var(--card-border)]",children:[(0,b.jsxs)("div",{className:"px-4 py-2 text-[10px] font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:["Tickets (",s.length,")"]}),0===s.length?(0,b.jsx)("div",{className:"px-4 pb-4 text-center text-xs text-[var(--muted-foreground)]",children:"No tickets in this group."}):s.map(a=>(0,b.jsx)(aQ,{item:a,selected:!1,onSelect:()=>k(a.id)},a.id))]}),(0,b.jsx)(aR,{issueId:a.id,trackerType:e,projectId:g}),(0,b.jsx)(aT,{runs:t,onSelect:m})]}),f.length>0&&(0,b.jsx)("div",{className:"absolute bottom-3 left-3 right-3 p-2",children:(0,b.jsx)(a1,{onSend:J,onStop:()=>{},participants:f,projectId:g??void 0,projectSlug:h??void 0,loading:"ready"!==H,commands:[],activityStatus:H,placeholder:`Work on tickets in "${a.name}"...`,initialPinnedParticipantId:w?.id})})]})}let a3="__pending-group__";function a4({ticket:a,isLast:c}){let{attributes:d,listeners:e,setNodeRef:f,transform:g,isDragging:h}=(0,aO.useDraggable)({id:a.id}),i=g?{transform:`translate3d(${g.x}px, ${g.y}px, 0)`,opacity:h?.3:1,position:"relative",zIndex:h?50:void 0}:void 0;return(0,b.jsxs)("div",{ref:f,style:i,...d,...e,className:"flex items-center gap-3 pl-[48px] pr-4 py-2 text-sm cursor-grab active:cursor-grabbing",children:[(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] leading-none text-[var(--muted-foreground)]/40 select-none",children:c?"└──":"├──"}),(0,b.jsx)("span",{className:"shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)]",children:a.identifier}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-xs text-[var(--muted-foreground)]",children:a.title}),a.status&&(0,b.jsx)("span",{className:"shrink-0 text-xs text-[var(--muted-foreground)]",children:a.status})]})}function a5({tickets:a,onConfirm:d,onCancel:e}){let[f,g]=(0,c.useState)(""),h=(0,c.useRef)(null),{setNodeRef:i,isOver:j}=(0,aO.useDroppable)({id:a3});(0,c.useEffect)(()=>{h.current?.focus()},[]);let k=(0,c.useCallback)(()=>{let b=f.trim(),c=a.map(a=>a.identifier).join(", ");d(b||c||"Untitled")},[f,d,a]);return(0,b.jsxs)("div",{ref:i,className:`mx-0 my-0 transition-colors ${j?"bg-[var(--primary)]/5":""}`,children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 pl-[24px] pr-4 py-2 bg-[var(--card-bg)]/50",children:[(0,b.jsx)(U.ChevronDown,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)(aZ.FolderOpen,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{ref:h,type:"text",value:f,onChange:a=>g(a.target.value),onKeyDown:a=>{"Enter"===a.key&&k(),"Escape"===a.key&&e()},placeholder:a.map(a=>a.identifier).join(", ")||"Name this group...",className:"min-w-0 flex-1 bg-transparent text-xs font-medium text-[var(--foreground)] placeholder:text-[var(--muted-foreground)]/60 outline-none border-b border-[var(--primary)]/40 pb-0.5 focus:border-[var(--primary)]"}),(0,b.jsx)("button",{type:"button",className:"rounded px-2 py-0.5 text-[10px] font-medium bg-[var(--primary)] text-[var(--primary-foreground)] hover:opacity-90 transition-opacity",onClick:k,children:"Create"}),(0,b.jsx)("button",{type:"button",className:"rounded px-2 py-0.5 text-[10px] font-medium text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors",onClick:e,children:"Cancel"})]}),a.map((c,d)=>(0,b.jsx)(a4,{ticket:c,isLast:d===a.length-1},c.id))]})}let a6="sg::";function a7({status:a,categoryColor:c,count:d,collapsed:e,onToggle:f}){let{setNodeRef:g,isOver:h}=(0,aO.useDroppable)({id:`${a6}${a}`});return(0,b.jsxs)("div",{ref:g,className:`sticky top-0 z-[5] flex cursor-pointer items-center gap-2 border-b border-[var(--card-border)] bg-[var(--app-shell-pane)] px-4 py-2 transition-colors ${h?"bg-[var(--primary)]/10 ring-1 ring-inset ring-[var(--primary)]/30":""}`,onClick:f,role:"button",tabIndex:0,onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),f())},children:[e?(0,b.jsx)(V.ChevronRight,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}):(0,b.jsx)(U.ChevronDown,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("span",{className:`h-2 w-2 shrink-0 rounded-full ${c}`}),(0,b.jsx)("span",{className:"text-xs font-medium text-[var(--foreground)]",children:a}),(0,b.jsx)("span",{className:"text-[10px] tabular-nums text-[var(--muted-foreground)]",children:d})]})}var a8=a.i(785630);function a9({open:a,onClose:d,anchorRef:e,children:f}){let g=(0,c.useRef)(null);return((0,c.useEffect)(()=>{if(!a)return;let b=a=>{g.current?.contains(a.target)||e.current?.contains(a.target)||d()},c=a=>{"Escape"===a.key&&d()};return document.addEventListener("pointerdown",b),document.addEventListener("keydown",c),()=>{document.removeEventListener("pointerdown",b),document.removeEventListener("keydown",c)}},[a,d,e]),a)?(0,b.jsx)("div",{ref:g,className:"absolute bottom-full left-1/2 z-50 mb-2 -translate-x-1/2 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] p-2 shadow-lg backdrop-blur-sm",children:f}):null}function ba({count:a,onGroup:d,onClear:e,onBulkRecap:f,onBulkPrompt:g,onBulkEstimate:h,onBulkAddLabel:i,onBulkRemoveLabel:j,onBulkStatus:k,statusOptions:m,participants:n,labels:o,onCreateLabel:p,selectedMetadata:r,statusUpdating:s}){let[t,u]=(0,c.useState)(null),v=(0,c.useRef)(null),w=(0,c.useRef)(null),x=(0,c.useRef)(null),y=(0,c.useCallback)(a=>{u(b=>b===a?null:a)},[]),z=c.default.useMemo(()=>{let a=new Map;for(let b of r.values())for(let c of b.labels)a.set(c,(a.get(c)??0)+1);return a},[r]),A=c.default.useMemo(()=>{let a=new Set;for(let b of r.values())for(let c of b.labels)a.add(c);return Array.from(a)},[r]);if(a<2)return null;let B="flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-[11px] font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--background)] hover:text-[var(--foreground)]";return(0,b.jsx)("div",{className:"absolute bottom-4 left-1/2 z-30 -translate-x-1/2",children:(0,b.jsxs)("div",{className:"flex items-center gap-1 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] px-3 py-1.5 shadow-2xl",children:[(0,b.jsxs)("span",{className:"mr-1 text-xs font-medium text-[var(--foreground)]",children:[a," selected"]}),(0,b.jsx)("div",{className:"mx-1 h-4 w-px bg-[var(--card-border)]"}),(0,b.jsxs)("button",{type:"button",className:B,onClick:f,title:"Recap all selected",children:[(0,b.jsx)(aK.FileText,{size:12}),"Recap"]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsxs)("button",{ref:x,type:"button",className:`${B} ${"prompt"===t?"bg-[var(--background)] text-[var(--foreground)]":""}`,onClick:()=>y("prompt"),title:"Send prompt to all selected",children:[(0,b.jsx)(ay.MessageSquare,{size:12}),"Prompt"]}),(0,b.jsx)(a9,{open:"prompt"===t,onClose:()=>u(null),anchorRef:x,children:(0,b.jsx)(aM,{count:a,participants:n,onSend:(a,b)=>{g(a,b),u(null)}})})]}),(0,b.jsxs)("button",{type:"button",className:B,onClick:h,title:"Ask the LLM to size all selected",children:[(0,b.jsx)(aL.Hash,{size:12}),"Estimate"]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsxs)("button",{ref:v,type:"button",className:`${B} ${"label"===t?"bg-[var(--background)] text-[var(--foreground)]":""}`,onClick:()=>y("label"),title:"Label all selected",children:[(0,b.jsx)(T.Tag,{size:12}),"Label"]}),(0,b.jsx)(a9,{open:"label"===t,onClose:()=>u(null),anchorRef:v,children:(0,b.jsx)(aJ,{labels:o,selectedLabels:A,labelCounts:z,totalSelected:a,onToggle:b=>{(z.get(b)??0)===a?j(b):i(b)},onAdd:p})})]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsxs)("button",{ref:w,type:"button",className:`${B} ${"status"===t?"bg-[var(--background)] text-[var(--foreground)]":""}`,onClick:()=>y("status"),title:"Update status for all selected",disabled:s,children:[s?(0,b.jsx)(l.RefreshCw,{size:12,className:"animate-spin"}):(0,b.jsx)(l.RefreshCw,{size:12}),"Status"]}),(0,b.jsx)(a9,{open:"status"===t,onClose:()=>u(null),anchorRef:w,children:(0,b.jsx)("div",{className:"flex max-h-48 w-44 flex-col overflow-y-auto",children:m.map(a=>(0,b.jsx)("button",{type:"button",className:"w-full rounded-lg px-3 py-1.5 text-left text-xs text-[var(--muted-foreground)] transition-colors hover:bg-[var(--background)] hover:text-[var(--foreground)]",onClick:()=>{k(a.value),u(null)},children:a.label},a.value))})})]}),(0,b.jsxs)("button",{type:"button",className:B,onClick:d,title:"Group selected",children:[(0,b.jsx)(a8.FolderPlus,{size:12}),"Group"]}),(0,b.jsx)("div",{className:"mx-1 h-4 w-px bg-[var(--card-border)]"}),(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",onClick:e,"aria-label":"Clear selection",children:(0,b.jsx)(q.X,{size:14})})]})})}var bb=a.i(908225);let bc=(0,d.default)(async()=>{},{loadableGenerated:{modules:[844118]},ssr:!1}),bd={todo:"bg-zinc-400",in_progress:"bg-amber-400",done:"bg-emerald-400",cancelled:"bg-red-400"};function be({item:a,run:d,participants:e,itemStatusOptions:f,itemStatusUpdating:g,onItemStatusChange:h,onBack:k}){let{messages:l,setMessages:m,sendMessage:n,loadHistory:o,stop:q}=(0,A.useGroupChat)(d.threadId),{processes:r,streaming:s,chatRuns:t}=(0,B.useProcessPolling)(d.rootMessageId?{workspaceId:d.threadId,threadId:d.rootMessageId}:{workspaceId:d.threadId},{messages:l,setMessages:m}),u=(0,c.useMemo)(()=>{let a=t[0];if(!a)return an(d);let b={queued:"queued",running:"running",awaiting_user:"running",blocked:"running",completed:"success",failed:"failed",cancelled:"cancelled"}[a.status]??d.status;return an({...d,status:b})},[t,d]);(0,c.useEffect)(()=>{o()},[o,d.threadId]);let v=(0,c.useMemo)(()=>new Map(e.map(a=>[a.id,a])),[e]),w=new Set(["queued","running","awaiting_user","blocked"]),x=t.some(a=>w.has(a.status))||r.some(a=>"spawning"===a.state||"running"===a.state)?t.some(a=>"queued"===a.status)?"queued":"working":"ready",y=(0,c.useCallback)((a,b,c,f,g,h,i)=>{d.rootMessageId&&n(a,b,void 0,d.rootMessageId,c,void 0,(0,O.orderParticipantIds)(e.map(a=>a.id),g),d.projectSlug??void 0,h,i)},[e,d.projectSlug,d.rootMessageId,n]);return(0,b.jsxs)("div",{className:"relative flex min-w-0 flex-1 flex-col overflow-hidden",children:[(0,b.jsxs)("header",{className:"flex h-12 shrink-0 items-center justify-between border-b border-[var(--card-border)] px-6",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[k&&(0,b.jsx)("button",{type:"button",onClick:k,className:"shrink-0 rounded p-0.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",title:"Back to sessions",children:(0,b.jsx)(i.ChevronLeft,{size:16})}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-sm text-[var(--muted-foreground)]",children:a.identifier}),(0,b.jsx)("div",{className:"h-1 w-1 shrink-0 rounded-full bg-[var(--card-border)]"}),(0,b.jsx)("span",{className:"truncate text-sm font-medium text-[var(--foreground)]",children:ao(d)})]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-4",children:[(0,b.jsx)(av,{status:a.status,options:f,disabled:0===f.length,updating:g,onChange:b=>h(a,b)}),(0,b.jsxs)("div",{className:`flex items-center gap-2 rounded-md border px-2.5 py-1 ${aq[u.tone]}`,children:[(0,b.jsx)("div",{className:`h-1.5 w-1.5 rounded-full ${ar[u.tone]}`}),(0,b.jsx)("span",{className:"text-xs font-semibold uppercase tracking-wider",children:u.label})]}),null!=d.durationMs&&(0,b.jsxs)("div",{className:"flex items-center gap-1.5 text-sm text-[var(--muted-foreground)]",children:[(0,b.jsx)(j.Clock,{size:14}),(0,b.jsxs)("span",{children:[(d.durationMs/1e3).toFixed(1),"s"]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 rounded-full border border-[var(--card-border)] bg-[var(--card-bg)] px-2 py-1",children:[(0,b.jsx)("img",{src:aP(d.agentId,v.get(d.agentId)?.color),alt:d.agentName,className:"h-5 w-5 rounded-full object-cover"}),(0,b.jsx)("span",{className:"pr-1 text-xs font-medium",children:d.agentName})]})]})]}),(0,b.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto px-6 py-6 pb-64",children:0===l.length?(0,b.jsx)("div",{className:"py-8 text-center text-xs text-[var(--muted-foreground)]",children:"queued"===d.status||"running"===d.status?"Starting session...":"No thread messages yet."}):(0,b.jsxs)("div",{className:"mx-auto max-w-4xl space-y-8",children:[l.map(a=>{let c=a.participantId?v.get(a.participantId):null,e=(0,J.stripMarkers)(a.content);if(!e.trim())return null;let f=a.participantId??d.agentId;return(0,b.jsxs)("div",{className:"flex gap-3",children:["user"===a.role?(0,b.jsx)("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-[var(--app-shell-subtle,var(--card-bg))]",children:(0,b.jsx)(p.User,{className:"h-3.5 w-3.5 text-[var(--muted-foreground)]"})}):(0,b.jsx)("img",{src:aP(f,c?.color),alt:c?.name??d.agentName,className:"h-7 w-7 shrink-0 rounded-full object-cover"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1 flex flex-col gap-1.5",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("div",{className:"flex items-center gap-2",children:"user"===a.role?(0,b.jsx)("span",{className:"text-sm font-semibold text-[var(--foreground)]",children:"You"}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"text-sm font-semibold",style:{color:c?.color??"var(--foreground)"},children:c?.name??d.agentName}),(0,b.jsx)("span",{className:"rounded bg-[var(--card-bg)] px-1.5 py-0.5 text-[10px] font-bold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Agent"})]})}),(0,b.jsx)("span",{className:"text-xs text-[var(--muted-foreground)]",children:new Date(a.timestamp).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),"user"===a.role?(0,b.jsx)("div",{className:"w-fit max-w-[85%] rounded-xl rounded-tl-sm border border-[var(--card-border)] bg-[var(--card-bg)] px-4 py-3 text-sm text-[var(--foreground)]",children:(0,b.jsx)(C.Markdown,{content:e,isUser:!0})}):(0,b.jsx)("div",{className:"text-sm text-[var(--foreground)]",children:(0,b.jsx)(C.Markdown,{content:e,isUser:!1})})]})]},a.id)}),Object.entries(s).filter(([,a])=>!d.rootMessageId||a.rootMessageId===d.rootMessageId).map(([a])=>{let c=v.get(a);return(0,b.jsxs)("div",{className:"flex items-center gap-3 text-sm text-[var(--muted-foreground)]",children:[(0,b.jsx)("img",{src:aP(a,c?.color),alt:c?.name??d.agentName,className:"h-7 w-7 shrink-0 rounded-full object-cover"}),c?.name??d.agentName," is thinking..."]},`stream-${a}`)})]})}),(0,b.jsx)("div",{className:"absolute bottom-3 left-3 right-3 p-2",children:d.rootMessageId?(0,b.jsx)(bc,{onSend:y,onStop:q,participants:e,projectId:d.projectId??void 0,projectSlug:d.projectSlug??void 0,loading:"ready"!==x,commands:[],activityStatus:x,placeholder:"Continue this session...",initialPinnedParticipantId:d.agentId}):(0,b.jsx)("div",{className:"px-2 py-1 text-xs text-[var(--muted-foreground)]",children:"Waiting for the session to start..."})})]})}function bf({trackerType:a,projectId:d,projectSlug:g,initialShowSettings:i,initialGroupId:j}){let p,s,{isTouchLayout:t}=(0,K.useInputCapabilities)(),{connected:u,loading:A,user:B,clis:C,mcpConfigured:D,connect:E,connectWithKey:F,disconnect:G,configureMcp:H}=(0,x.useTrackerConnection)(a,d??""),J=(0,c.useRef)(null),[O,Q]=(0,c.useState)(i??!1),[R,S]=(0,c.useState)(!1),[T,U]=(0,c.useState)(()=>(0,M.loadLinearTicketPanelWidth)()||576),[V,W]=(0,c.useState)(""),[X,Y]=(0,c.useState)(""),[Z,$]=(0,c.useState)(!1),[_,aa]=(0,c.useState)([]),[ab,ac]=(0,c.useState)([]),[ad,ae]=(0,c.useState)([]),[af,ag]=(0,c.useState)([]),[ah,ai]=(0,c.useState)([]),[aj,ak]=(0,c.useState)([]),[aq,ar]=(0,c.useState)("Group"),[av,ax]=(0,c.useState)(""),[ay,az]=(0,c.useState)(""),[aA,aB]=(0,c.useState)("activity"),[aC,aD]=(0,c.useState)("desc"),[aE,aF]=(0,c.useState)([]),[aG,aH]=(0,c.useState)(()=>new Set),[aI,aJ]=(0,c.useState)(null),[aK,aL]=(0,c.useState)(null),[aM,aN]=(0,c.useState)(new Set),{participants:aR}=(0,aY.useTrackerParticipants)(a,d),{issueActiveAgents:aS}=function(a,b){let[d,e]=(0,c.useState)(new Map);return(0,c.useEffect)(()=>{let c=!1;async function d(){try{let d=new URLSearchParams;b&&d.set("projectId",b);let f=await fetch(`/api/trackers/${a}/active-agents?${d}`);if(!f.ok||c)return;let g=await f.json(),h=new Map;for(let a of g.agents??[]){let b=h.get(a.issueId)??[];b.push({agentId:a.agentId,agentName:a.agentName}),h.set(a.issueId,b)}c||e(h)}catch{}}d();let f=setInterval(()=>void d(),5e3);return()=>{c=!0,clearInterval(f)}},[a,b]),{issueActiveAgents:d}}(a,d),{issueStats:aT}=function(a,b){let[d,e]=(0,c.useState)(new Map);return(0,c.useEffect)(()=>{let c=!1;async function d(){try{let d=new URLSearchParams;b&&d.set("projectId",b);let f=await fetch(`/api/trackers/${a}/stats?${d}`);if(!f.ok||c)return;let g=await f.json(),h=new Map;for(let a of g.stats??[])h.set(a.issueId,{sessions:a.sessions,messages:a.messages});c||e(h)}catch{}}d();let f=setInterval(()=>void d(),1e4);return()=>{c=!0,clearInterval(f)}},[a,b]),{issueStats:d}}(a,d),[aU,aV]=(0,c.useState)(null),[aW,aZ]=(0,c.useState)(null),[a$,a0]=(0,c.useState)("runs"),a1=(0,c.useRef)(null),a4=(0,c.useRef)(!0),a8=(0,c.useRef)(null),a9=(0,c.useRef)(null),{getSelection:bc,pushSelection:bf,replaceSelection:bg}=(0,r.useUrlSelection)(),bh=bc("issue"),bi=bc("run"),bj=bc("group"),{groups:bk,createGroup:bl,updateGroup:bm,deleteGroup:bn,addTasksToGroup:bo,removeTaskFromGroup:bp,refetch:bq}=function(a){let[b,d]=(0,c.useState)([]),[e,f]=(0,c.useState)(!1),g=(0,c.useCallback)(async()=>{if(a){f(!0);try{let b=await fetch(`/api/task-groups?project_id=${encodeURIComponent(a)}`);if(!b.ok)throw Error("Failed to fetch groups");let c=await b.json();d(c.groups??[])}catch(a){console.error("useTaskGroups fetch error:",a)}finally{f(!1)}}},[a]);(0,c.useEffect)(()=>{g()},[g]);let h=(0,c.useCallback)(async(b,c)=>{if(!a)return null;try{let d=await fetch("/api/task-groups",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:a,name:b,task_ids:c})});if(!d.ok)throw Error("Failed to create group");let e=await d.json();return await g(),e.group}catch(a){return console.error("createGroup error:",a),null}},[a,g]),i=(0,c.useCallback)(async(a,b)=>{try{if(!(await fetch(`/api/task-groups/${a}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})).ok)throw Error("Failed to update group");await g()}catch(a){console.error("updateGroup error:",a)}},[g]),j=(0,c.useCallback)(async a=>{try{if(!(await fetch(`/api/task-groups/${a}`,{method:"DELETE"})).ok)throw Error("Failed to delete group");await g()}catch(a){console.error("deleteGroup error:",a)}},[g]),k=(0,c.useCallback)(async(a,b)=>{try{if(!(await fetch(`/api/task-groups/${a}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({task_ids:b})})).ok)throw Error("Failed to assign tasks");await g()}catch(a){console.error("addTasksToGroup error:",a)}},[g]),l=(0,c.useCallback)(async(a,b)=>{try{if(!(await fetch(`/api/task-groups/${a}/tasks?task_id=${encodeURIComponent(b)}`,{method:"DELETE"})).ok)throw Error("Failed to remove task");await g()}catch(a){console.error("removeTaskFromGroup error:",a)}},[g]);return{groups:b,isLoading:e,refetch:g,createGroup:h,updateGroup:i,deleteGroup:j,addTasksToGroup:k,removeTaskFromGroup:l}}(d),[br,bs]=(0,c.useState)(new Set),[bt,bu]=(0,c.useState)(!1),[bv,bw]=(0,c.useState)([]),[bx,by]=(0,c.useState)(null),bz=(0,aO.useSensors)((0,aO.useSensor)(aO.PointerSensor,{activationConstraint:{distance:8}})),[bA,bB]=(0,c.useState)(null),bC=(0,c.useCallback)(a=>{bs(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},[]),bD=(0,c.useCallback)(async a=>{bv.length<2||(await bl(a,bv),bw([]),bu(!1),by(null),bs(new Set))},[bv,bl]),bE=(0,c.useRef)([]),bF=(0,c.useRef)(null),bG=(0,c.useCallback)(()=>{let a=Array.from(br),b=bE.current.find(a=>br.has(a.id));bw(a),by(b?.id??a[0]??null),bu(!0)},[br]),bH=bk.find(a=>a.id===bj),bI=(0,c.useMemo)(()=>new Set(bk.flatMap(a=>a.task_ids)),[bk]),bJ=(0,c.useCallback)(a=>{bB(a.active.id)},[]),bK=(0,c.useCallback)(async a=>{bB(null);let{active:b,over:c}=a,d=b.id;if(bt){let a=bv.includes(d);if(!c||b.id===c.id){a&&bw(a=>{let b=a.filter(a=>a!==d);return b.length<2?(bu(!1),by(null),[]):b});return}let e=c.id,f=e===a3||bv.includes(e);a&&!f?bw(a=>{let b=a.filter(a=>a!==d);return b.length<2?(bu(!1),by(null),[]):b}):a||bw(a=>[...a,d]);return}if(!c||b.id===c.id)return;let e=c.id;if(e.startsWith(a6)){let a=e.slice(a6.length),b=bE.current.find(a=>a.id===d),c=bE.current.find(b=>b.status===a)?.statusCategory;b&&b.status!==a&&await bF.current?.(b,a,c);return}let f=bE.current.find(a=>a.id===d),g=bE.current.find(a=>a.id===e);if(f&&g&&f.status!==g.status)return void await bF.current?.(f,g.status,g.statusCategory);let h=bk.find(a=>a.id===e);if(h)return void await bo(h.id,[d]);let i=!bI.has(e);if(!bI.has(d)&&i){bw([d,e]),by(e),bu(!0);return}let j=bk.find(a=>a.task_ids.includes(d));j&&i&&await bp(j.id,d)},[bk,bI,bo,bp,bt,bv]),bL=(0,c.useCallback)(a=>{W(a),a1.current&&clearTimeout(a1.current),a1.current=setTimeout(()=>Y(a),300)},[]),bM=(0,c.useCallback)(a=>{aH(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},[a,g]);(0,c.useEffect)(()=>()=>{a1.current&&clearTimeout(a1.current)},[]),(0,c.useEffect)(()=>{let a={...L};a4.current=!0,W(a.search),Y(a.search),ag(a.assigneeIds),ai(a.statusCategories),az(j??a.groupIds?.[0]??""),ax(j??a.groupIds?.[0]??""),aB(a.sortBy),aD(a.sortDir),aF(a.labelNames??[]),aH(new Set)},[a,g,j]),(0,c.useEffect)(()=>{if(a4.current){a4.current=!1;return}},[a,g,V,af,ah,ay,av,aE,aA,aC]),(0,c.useEffect)(()=>{if(!u||!d)return;let b=!1;$(!1);let c=new URLSearchParams;return c.set("projectId",d),g&&c.set("projectSlug",g),fetch(`/api/trackers/${a}/options?${c.toString()}`).then(a=>a.json()).then(a=>{b||(aa(Array.isArray(a.assignees)?a.assignees:[]),ac(Array.isArray(a.statuses)?a.statuses.map(a=>({value:a.name,label:a.name})):[]),ae(Array.isArray(a.teams)?a.teams:[]),ak(Array.isArray(a.groups)?a.groups:[]),a.groupLabel&&ar(a.groupLabel),$(!0))}).catch(()=>{b||(aa([]),ac([]),ae([]),ak([]),$(!0))}),()=>{b=!0}},[u,a,d,g]),(0,c.useEffect)(()=>{if(!Z)return;let a=af.filter(a=>_.some(b=>b.id===a));a.length!==af.length&&ag(a)},[_,Z,af]),(0,c.useEffect)(()=>{if(!Z)return;let a=ab.map(a=>a.value),b=ah.filter(b=>a.includes(b));b.length!==ah.length&&ai(b)},[Z,ah,ab]),(0,c.useEffect)(()=>{if(Z){if(ad.length<=1&&ay)return void az("");ay&&!ad.some(a=>a.id===ay)&&az("")}},[Z,ay,ad]),(0,c.useEffect)(()=>{Z&&av&&!aj.some(a=>a.id===av)&&ax("")},[aj,Z,av]);let{items:bN,loading:bO,hasMore:bP,loadMore:bQ,refresh:bR,updateItem:bS}=function(a,b,d,e){let[f,g]=(0,c.useState)([]),[h,i]=(0,c.useState)(!0),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(!1),n=(0,c.useRef)(j),o=(0,c.useRef)(!1);n.current=j;let p=`/api/trackers/${encodeURIComponent(a)}/items`,q=e.projectId?function(a,b,c){let d={};for(let a of Object.keys(c).sort()){let b=c[a];if(null!=b&&""!==b&&!1!==b)if(Array.isArray(b)){if(!b.length)continue;d[a]=[...b].map(String).sort()}else d[a]=b}return`${a}:${b}:${JSON.stringify(d)}`}(a,e.projectId,{statuses:b.statuses,statusCategories:b.statusCategories,search:b.search,assigneeIds:b.assigneeIds,groupIds:b.groupIds,sortBy:b.sortBy,sortDir:b.sortDir,hasActivity:b.hasActivity,limit:e.limit}):null,r=(0,c.useRef)(q);r.current=q;let s=(0,c.useCallback)(async a=>{if(d&&e.projectId){i(!0);try{let c=new URLSearchParams;if(c.set("projectId",e.projectId),b.statuses?.length)for(let a of b.statuses)c.append("status",a);if(b.statusCategories?.length)for(let a of b.statusCategories)c.append("statusCategory",a);if(b.search&&c.set("search",b.search),b.assigneeIds?.length)for(let a of b.assigneeIds)c.append("assigneeId",a);if(b.groupIds?.length)for(let a of b.groupIds)c.append("groupId",a);b.sortBy&&c.set("sortBy",b.sortBy),b.sortDir&&c.set("sortDir",b.sortDir),b.hasActivity&&c.set("hasActivity","true"),a&&n.current&&c.set("cursor",n.current),e.limit&&c.set("limit",String(e.limit));let d=await fetch(`${p}?${c.toString()}`),f=await d.json(),h=f.items??[];g(b=>a?[...b,...h]:h);let i=f.pageInfo?.endCursor??null,j=f.pageInfo?.hasNextPage??!1;k(i),m(j),o.current=!0,!a&&r.current&&w(r.current,{items:h,endCursor:i,hasNextPage:j,savedAt:Date.now()})}catch{a||g([])}finally{i(!1)}}},[p,b.statuses,b.statusCategories,b.search,b.assigneeIds,b.groupIds,b.sortBy,b.sortDir,b.hasActivity,d,e.projectId,e.limit]);(0,c.useEffect)(()=>{let a=!1;return k(null),o.current=!1,d&&q&&v(q).then(b=>{a||!b||o.current||(g(b.items),k(b.endCursor),m(b.hasNextPage),i(!1))}),s(!1),()=>{a=!0}},[s,q,d]);let t=(0,c.useCallback)(()=>s(!0),[s]);return{items:f,loading:h,hasMore:l,loadMore:t,refresh:(0,c.useCallback)(()=>(k(null),s(!1)),[s]),updateItem:(0,c.useCallback)(a=>{g(b=>b.map(b=>b.id===a.id?a:b))},[])}}(a,(0,c.useMemo)(()=>({search:X||void 0,statuses:ah.length>0&&ah.length<ab.length?ah:void 0,assigneeIds:af.length>0?af:void 0,groupIds:av?[av]:void 0,sortBy:aA,sortDir:aC}),[X,af,av,ah,ab.length,aA,aC]),u&&Z&&!!d,{projectId:d??""}),{metadataMap:bT,refresh:bU}=function(a,b,d){let[e,f]=(0,c.useState)(new Map),[g,h]=(0,c.useState)(!1),i=(0,c.useRef)(""),j=(0,c.useCallback)(async()=>{if(!b||0===d.length)return void f(new Map);h(!0);try{let c=await fetch(`/api/trackers/${encodeURIComponent(a)}/metadata/bulk?projectId=${encodeURIComponent(b)}&issueIds=${d.map(encodeURIComponent).join(",")}`),e=await c.json(),g=new Map;for(let[a,b]of Object.entries(e))g.set(a,{labels:Array.isArray(b.labels)?b.labels:[],estimate:"number"==typeof b.estimate?b.estimate:null});f(g)}catch{}h(!1)},[a,b,d]);return(0,c.useEffect)(()=>{let a=d.join(",");a!==i.current&&(i.current=a,j())},[j,d]),{metadataMap:e,loading:g,refresh:j}}(a,d,(0,c.useMemo)(()=>bN.map(a=>a.id),[bN])),{labels:bV,definitions:bW,refresh:bX,createDefinition:bY}=al(a,d),bZ=(0,c.useMemo)(()=>bh?bN.find(a=>a.id===bh)??null:null,[bN,bh]),b$=bZ??(aI?.id===bh?aI:null),b_=(0,c.useMemo)(()=>{if(0===aG.size)return bN;let a=[],b=[];for(let c of bN)aG.has(c.id)?a.push(c):b.push(c);return[...a,...b]},[bN,aG]);bE.current=b_;let b0=(0,c.useDeferredValue)(aE),b1=(0,c.useMemo)(()=>{if(0===b0.length)return b_;let a=new Set(b0),b=[];for(let c of b_){let d=bT.get(c.id)?.labels;if(d){for(let e of d)if(a.has(e)){b.push(c);break}}}return b},[b_,b0,bT]),b2=(0,c.useMemo)(()=>{let a=new Map;for(let b of b1){let c=a.get(b.status);c||(c={status:b.status,category:b.statusCategory,items:[]},a.set(b.status,c)),c.items.push(b)}let b={in_progress:0,todo:1,done:2,cancelled:3};return[...a.values()].sort((a,c)=>(b[a.category]??1)-(b[c.category]??1))},[!0,b1]),{runs:b3,loading:b4,loadedForIssueId:b5,createRun:b6,updateRun:b7}=y(a,b$?.id??null,d??null),{scripts:b8,activeScriptId:b9,activeScript:ca,setActiveScriptId:cb,saveScript:cc,deleteScript:cd}=function(a,b){let[d,e]=(0,c.useState)([]),[f,g]=(0,c.useState)(null);(0,c.useEffect)(()=>{let a={...z};e(a.scripts),g(a.activeScriptId)},[a,b]);let h=(0,c.useCallback)((a,b)=>{e(a),g(b)},[a,b]),i=(0,c.useCallback)(a=>{let b=a&&d.some(b=>b.id===a)?a:null;h(d,b)},[h,d]),j=(0,c.useCallback)(a=>{let b=new Date().toISOString(),c=a.name.trim(),e=a.prompt.trim();if(!c||!e)throw Error("Run script name and prompt are required.");let f=a.id?d.find(b=>b.id===a.id):null,g=f?{...f,name:c,prompt:e,updatedAt:b}:{id:crypto.randomUUID(),name:c,prompt:e,createdAt:b,updatedAt:b};return h([...f?d.map(a=>a.id===f.id?g:a):[g,...d]].sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt)),g.id),g},[h,d]),k=(0,c.useCallback)(a=>{h(d.filter(b=>b.id!==a),f===a?null:f)},[f,h,d]),l=(0,c.useMemo)(()=>d.find(a=>a.id===f)??null,[f,d]);return{scripts:d,activeScriptId:f,activeScript:l,setActiveScriptId:i,saveScript:j,deleteScript:k}}(a,g),ce=bi?b3.find(a=>a.id===bi)??null:null,cf=bh&&!bi?(0,N.loadLastRunForIssue)(bh):null,cg=!!cf&&J.current!==bh,ch=(0,c.useMemo)(()=>_.map(a=>({value:a.id,label:a.name})),[_]),ci=(0,c.useMemo)(()=>ab.map(a=>({value:a.value,label:a.label})),[ab]),cj=(0,c.useMemo)(()=>{let a=ab.map(a=>({value:a.label,label:a.label})),b=new Set(a.map(a=>a.value)),c=b$?.status?.trim();return c&&!b.has(c)&&a.unshift({value:c,label:c}),a},[b$?.status,ab]),ck=(0,c.useMemo)(()=>[{value:"",label:"Workspace"},...ad.map(a=>({value:a.id,label:a.name}))],[ad]),cl=(0,c.useMemo)(()=>[{value:"",label:aq},...aj.map(a=>({value:a.id,label:a.name}))],[aj,aq]),cm=ci.length>0,cn=cl.length>1,co=ck.length>2,cp=ca?.name??"AGX default",cq=(0,c.useMemo)(()=>bV.map(a=>({value:a.name,label:a.name})),[bV]),cr=(0,c.useCallback)(async(b,c)=>{if(!d)return;let e=bT.get(b)?.labels??[],f=e.includes(c)?e.filter(a=>a!==c):[...e,c];try{await fetch(`/api/trackers/${a}/metadata?projectId=${encodeURIComponent(d)}&issueId=${encodeURIComponent(b)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({labels:f})}),bU(),bX()}catch{}},[d,a,bT,bU,bX]),cs=(0,c.useCallback)(async a=>{d&&await bY(a)},[d,bY]),ct=(0,c.useCallback)(async(b,c,e)=>{let f=c.trim();if(!f||f===b.status||!d)return;let g={...b,status:f,statusCategory:e??b.statusCategory};bS(g),bh===b.id&&aJ(g),aL(b.id);try{let c=await fetch(`/api/trackers/${a}/items/${encodeURIComponent(b.id)}?projectId=${encodeURIComponent(d??"")}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:f})}),e=await c.json().catch(()=>({}));if(!c.ok||!e.item)throw Error(e.error||"Failed to update ticket status");let g=e.item;bS(g),bh===g.id&&aJ(g),await bR()}catch(a){bS(b),bh===b.id&&aJ(b),a instanceof Error&&window.alert(a.message)}finally{aL(a=>a===b.id?null:a)}},[bR,bh,bS,a,d]);bF.current=ct;let cu=(0,c.useCallback)(async(b,c,e,f)=>{let h=f??aR[0]?.id;if(h)try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:b.id,issueIdentifier:b.identifier,issueTitle:b.title,issueStatus:b.status,issueAssignee:b.assignee?.name??null,agentId:h,scriptName:c,scriptPrompt:e})})}catch(a){console.error(`Failed to start ${c} for ${b.identifier}:`,a)}},[aR,a,d,g]),cv=(0,c.useCallback)(async()=>{let b=Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean);if(0===b.length||0===aR.length)return;let c=aR[0];for(let e of b)try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:e.id,issueIdentifier:e.identifier,issueTitle:e.title,issueStatus:e.status,issueAssignee:e.assignee?.name??null,agentId:c.id,scriptName:"Recap",scriptPrompt:"Summarize recent activity and current state of this ticket. Focus on: what was done, what's outstanding, and any blockers."})})}catch(a){console.error(`Failed to start recap for ${e.identifier}:`,a)}bs(new Set)},[br,bN,aR,a,d,g]),cw=(0,c.useCallback)(async(b,c)=>{for(let e of Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean))try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:e.id,issueIdentifier:e.identifier,issueTitle:e.title,issueStatus:e.status,issueAssignee:e.assignee?.name??null,agentId:c,scriptPrompt:b})})}catch(a){console.error(`Failed to send prompt for ${e.identifier}:`,a)}bs(new Set)},[br,bN,a,d,g]),cx=(0,c.useCallback)(async()=>{let b=Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean);if(0===b.length||0===aR.length)return;let c=aR[0];for(let e of b)try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:e.id,issueIdentifier:e.identifier,issueTitle:e.title,issueStatus:e.status,issueAssignee:e.assignee?.name??null,agentId:c.id,scriptName:"Estimate",scriptPrompt:"Assess the complexity and scope of this ticket and assign a Fibonacci story-point estimate (1, 2, 3, 5, 8, 13, or 21). Consider: required investigation, files likely to change, unknowns, and testing effort. Briefly justify the number, then set the estimate using the available tooling."})})}catch(a){console.error(`Failed to start estimate for ${e.identifier}:`,a)}bs(new Set)},[br,bN,aR,a,d,g]),cy=(0,c.useCallback)(async b=>{let c=Array.from(br);if(0!==c.length&&d)try{await fetch(`/api/trackers/${a}/metadata/bulk`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d,issueIds:c,action:"add_labels",payload:{labels:[b]}})}),bU(),bX()}catch{}},[br,d,a,bU,bX]),cz=(0,c.useCallback)(async b=>{let c=Array.from(br);if(0!==c.length&&d)try{await fetch(`/api/trackers/${a}/metadata/bulk`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d,issueIds:c,action:"remove_label",payload:{label:b}})}),bU(),bX()}catch{}},[br,d,a,bU,bX]),[cA,cB]=(0,c.useState)(!1),cC=(0,c.useCallback)(async a=>{let b=Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean);if(0!==b.length){for(let c of(cB(!0),b))await ct(c,a);cB(!1),bs(new Set)}},[br,bN,ct]),cD=(0,c.useCallback)(async a=>{d&&await bY(a)},[d,bY]),cE=(0,c.useCallback)(b=>({statusOptions:cj,onRecap:()=>{let c=d?`?projectId=${encodeURIComponent(d)}`:"";fetch(`/api/trackers/${encodeURIComponent(a)}/items/${encodeURIComponent(b.id)}/recap${c}`,{method:"POST"}).then(()=>{window.dispatchEvent(new CustomEvent("tracker:recap-triggered",{detail:{trackerType:a,issueId:b.id}}))})},onPrompt:(a,c)=>{cu(b,"Prompt",a,c)},onEstimate:()=>{cu(b,"Estimate","Assess the complexity and scope of this ticket and assign a Fibonacci story-point estimate (1, 2, 3, 5, 8, 13, or 21). Consider: required investigation, files likely to change, unknowns, and testing effort. Briefly justify the number, then set the estimate using the available tooling.")},onStatus:a=>{ct(b,a)}}),[cj,cu,ct,a,d]),cF=(0,c.useMemo)(()=>{let a=new Map;for(let b of br){let c=bT.get(b);a.set(b,c??{labels:[],estimate:null})}return a},[br,bT]);(0,c.useEffect)(()=>{if(!bh||!d)return void aJ(null);if(bZ)return void aJ(a=>a?.id===bh?bZ:null);let b=!1;return(async()=>{try{let c=await fetch(`/api/trackers/${a}/items/${encodeURIComponent(bh)}?projectId=${encodeURIComponent(d??"")}`);if(b)return;if(404===c.status)return void aJ(null);if(!c.ok)throw Error(`Failed to fetch selected tracker ticket: ${c.status}`);let e=await c.json().catch(()=>({}));if(!e.item?.id)return void aJ(null);aJ(e.item)}catch(a){b||console.error("Failed to hydrate selected tracker item",a)}})(),()=>{b=!0}},[bg,bZ,bh,a,d]),(0,c.useEffect)(()=>{if(!bh){bi&&bg({run:null});return}},[bg,bh,bi]),(0,c.useEffect)(()=>{b$&&bi&&!b4&&(b3.some(a=>a.id===bi)||bg({run:null}))},[bg,b3,b4,b$,bi]),(0,c.useEffect)(()=>{bh&&bi&&(0,N.persistLastRunForIssue)(bh,bi)},[bh,bi]),(0,c.useEffect)(()=>{cg&&!b4&&b5===bh&&(J.current=bh,cf&&b3.some(a=>a.id===cf)&&bg({run:cf}))},[cg,cf,bh,b3,b4,b5,bg]),(0,c.useEffect)(()=>{if(t){if(!b$)return void a0("runs");if(ce||0===b3.length)return void a0("ticket");a0("runs")}},[t,b3.length,b$,ce]),(0,c.useEffect)(()=>{if(!R)return;let a=a=>{let b=a.target;a9.current?.contains(b)||a8.current?.contains(b)||S(!1)},b=a=>{"Escape"===a.key&&S(!1)};return document.addEventListener("pointerdown",a),document.addEventListener("keydown",b),()=>{document.removeEventListener("pointerdown",a),document.removeEventListener("keydown",b)}},[R]);let cG=(0,c.useCallback)(async(b,c)=>{aV(null),aZ(null);try{let e=await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:b.id,issueIdentifier:b.identifier,issueTitle:b.title,issueStatus:b.status,issueAssignee:b.assignee?.name??null,agentId:c.id,scriptName:ca?.name,scriptPrompt:ca?.prompt})}),f=await e.json().catch(()=>({}));if(!e.ok||!f.run||!f.chatRunId||!f.userMessageId)throw Error(f.error||"Failed to start scripted session");bf({issue:b.id,run:f.run.id})}catch(a){console.error("Failed to start scripted tracker session:",a),a instanceof Error&&window.alert(a.message)}},[ca,d,g,bf,a]),cH=(0,c.useCallback)((a,b)=>{if(S(!1),0===aR.length)return void window.alert("Add at least one agent to this project before starting a scripted session.");if(1===aR.length)return void cG(a,aR[0]);let c=b?.currentTarget?.getBoundingClientRect();aV(a),aZ(c?{top:c.bottom+4,left:c.left}:{top:200,left:200})},[cG,aR]),cI=(0,c.useRef)(null),cJ=(0,c.useRef)(null),cK=(0,c.useRef)(null),[cL,cM]=(0,c.useState)(!1);(0,c.useEffect)(()=>{let a=[cJ.current,cK.current].filter(Boolean);if(0===a.length)return;let b=a=>{cM(a.currentTarget.scrollTop>400)};return a.forEach(a=>a.addEventListener("scroll",b,{passive:!0})),()=>a.forEach(a=>a.removeEventListener("scroll",b))},[t]);let cN=(0,c.useCallback)(()=>{let a=cJ.current??cK.current;a?.scrollTo({top:0,behavior:"smooth"})},[]);return((0,c.useEffect)(()=>{let a=cI.current;if(!a||!bP)return;let b=new IntersectionObserver(a=>{a[0]?.isIntersecting&&bQ()},{threshold:.1});return b.observe(a),()=>b.disconnect()},[bP,bQ]),u)?(0,b.jsxs)("div",{className:"relative flex h-full overflow-hidden",children:[t?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col",children:[(0,b.jsxs)("div",{className:"shrink-0 border-b border-[var(--card-border)]",children:[(0,b.jsxs)("div",{className:"flex h-12 items-center gap-2 px-3",children:[(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-2 rounded-md border border-[var(--card-border)] bg-[var(--background)] px-2.5 py-1.5 transition-all focus-within:border-[var(--muted-foreground)] focus-within:ring-1 focus-within:ring-[var(--muted-foreground)]",children:[(0,b.jsx)(m.Search,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{type:"text",className:"flex-1 bg-transparent text-sm outline-none placeholder:text-[var(--muted-foreground)]",placeholder:"Search tickets...",value:V,onChange:a=>bL(a.target.value)})]}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-2 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)] disabled:cursor-not-allowed disabled:opacity-50",onClick:()=>void bR(),title:"Refresh tickets","aria-label":"Refresh tickets",disabled:bO,children:(0,b.jsx)(l.RefreshCw,{size:16,className:bO?"animate-spin":void 0})}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-2 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",onClick:()=>{S(!1),Q(!0)},title:"Tracker settings",children:(0,b.jsx)(n.Settings,{size:16})})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5 px-3 pb-2",children:[cn?(0,b.jsx)(au,{label:aq,value:av,options:cl,activeClasses:"border-purple-500/30 bg-purple-500/10 text-purple-400",onChange:ax}):null,cm?(0,b.jsx)(aw,{label:"Status",values:ah,options:ci,activeClasses:"border-amber-500/30 bg-amber-500/10 text-amber-300",onChange:ai,emptyLabel:"All statuses"}):null,(0,b.jsx)(aw,{label:"Assignee",values:af,options:ch,activeClasses:"border-blue-500/30 bg-blue-500/10 text-blue-400",onChange:ag,emptyLabel:"All assignees"}),cq.length>0&&(0,b.jsx)(aw,{label:"Label",values:aE,options:cq,activeClasses:"border-pink-500/30 bg-pink-500/10 text-pink-400",onChange:aF,emptyLabel:"All labels"}),co?(0,b.jsx)(au,{label:"Workspace",value:ay,options:ck,activeClasses:"border-emerald-500/30 bg-emerald-500/10 text-emerald-400",onChange:az}):null,(0,b.jsx)(au,{label:"Sort",value:aA,options:[{value:"activity",label:"Updated At"},{value:"identifier",label:"Ticket ID"},{value:"status",label:"Status"},{value:"created",label:"Created At"}],activeClasses:"border-sky-500/30 bg-sky-500/10 text-sky-400",onChange:a=>aB(a)}),(0,b.jsx)("button",{type:"button",className:"rounded-full border border-[var(--card-border)] p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",title:"desc"===aC?"Descending":"Ascending",onClick:()=>aD(a=>"desc"===a?"asc":"desc"),children:"desc"===aC?(0,b.jsx)(e.ArrowDown,{size:12}):(0,b.jsx)(f.ArrowUp,{size:12})})]})]}),(0,b.jsxs)("div",{className:"relative flex-1 min-h-0 flex flex-col",children:[(0,b.jsx)("div",{ref:cK,className:"flex-1 overflow-y-auto",children:bO&&0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"Loading tickets..."}):0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"No tickets found."}):(0,b.jsxs)(b.Fragment,{children:[b2.map(a=>{let d=aM.has(a.status);return(0,b.jsxs)(c.default.Fragment,{children:[(0,b.jsx)(a7,{status:a.status,categoryColor:bd[a.category]??"bg-zinc-400",count:a.items.length,collapsed:d,onToggle:()=>aN(b=>{let c=new Set(b);return c.has(a.status)?c.delete(a.status):c.add(a.status),c})}),!d&&a.items.map(a=>(0,b.jsx)(aQ,{item:a,selected:b$?.id===a.id,pinned:aG.has(a.id),activeAgents:aS.get(a.id),participants:aR,projectSlug:g,stats:aT.get(a.id),hideStatus:!0,estimate:bT.get(a.id)?.estimate,localLabels:bT.get(a.id)?.labels,labelDefinitions:bW,allLabels:bV,onToggleLabel:b=>cr(a.id,b),onAddLabel:cs,onSelect:()=>{a0("runs"),bf({issue:a.id,run:null})},onTogglePin:()=>bM(a.id),rowActions:cE(a),showGroup:!av},a.id))]},`sg-${a.status}`)}),bP?(0,b.jsx)("div",{ref:cI,className:"py-2 text-center text-xs text-[var(--muted-foreground)]",children:bO?"Loading...":"Load more"}):null]})}),(0,b.jsx)(bb.JumpToLatestButton,{visible:cL&&bN.length>20,direction:"top",onClick:cN})]})]}),b$?(0,b.jsxs)("div",{className:"absolute inset-0 z-20 flex flex-col bg-[var(--background)]",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3 border-b border-[var(--card-border)] px-4 py-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-[var(--muted-foreground)]",children:b$.identifier}),(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-[var(--foreground)]",children:b$.title})]}),(0,b.jsx)("button",{type:"button",className:"rounded p-2 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",onClick:()=>bg({issue:null,run:null}),"aria-label":"Close ticket panel",children:(0,b.jsx)(q.X,{size:16})})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 border-b border-[var(--card-border)] px-3 py-2",children:[(0,b.jsx)("button",{type:"button",className:`rounded-full px-3 py-1.5 text-xs font-medium transition-colors ${"runs"===a$?"bg-[var(--card-bg)] text-[var(--foreground)]":"text-[var(--muted-foreground)] hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"}`,onClick:()=>a0("runs"),children:"Runs"}),(0,b.jsx)("button",{type:"button",className:`rounded-full px-3 py-1.5 text-xs font-medium transition-colors ${"ticket"===a$?"bg-[var(--card-bg)] text-[var(--foreground)]":"text-[var(--muted-foreground)] hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"}`,onClick:()=>a0("ticket"),children:"Ticket"})]}),(0,b.jsx)("div",{className:"min-h-0 flex-1 overflow-hidden",children:"runs"===a$?(0,b.jsxs)("div",{className:"flex h-full flex-col overflow-hidden",children:[(0,b.jsxs)("div",{className:"relative flex items-center justify-between border-b border-[var(--card-border)] px-3 py-2",children:[(0,b.jsx)("h3",{className:"text-xs font-semibold text-[var(--foreground)]",children:"Sessions"}),(0,b.jsxs)("button",{ref:a8,type:"button",className:"inline-flex items-center gap-1 rounded px-2 py-1 text-[10px] font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)] disabled:cursor-not-allowed disabled:opacity-40",onClick:()=>{S(!1),a0("ticket"),bf({run:null})},title:"Open a fresh chat for this ticket. You can choose or edit the session script in the ticket tab.","aria-label":"New session",disabled:!b$,children:[(0,b.jsx)(k.Plus,{size:12}),"New session"]})]}),(0,b.jsx)("div",{className:"flex-1 overflow-y-auto",children:b4&&0===b3.length||cg?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"Loading sessions..."}):0===b3.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"No previous sessions yet."}):b3.map(a=>{let c=an(a);return(0,b.jsxs)("button",{type:"button",className:`w-full px-3 py-2 text-left text-xs transition-colors ${ce?.id===a.id?"bg-[var(--card-bg)]":"hover:bg-[var(--card-bg)]"}`,onClick:()=>{a0("ticket"),bf({run:a.id})},children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-1",children:[(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-[11px] font-medium text-[var(--foreground)]",children:ao(a)}),(0,b.jsx)("span",{className:"text-[10px] text-[var(--muted-foreground)]",children:new Date(a.startedAt).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),(0,b.jsxs)("div",{className:"mt-0.5 flex items-center gap-1.5 text-[10px]",children:[(0,b.jsx)("span",{className:`font-medium ${as[c.tone]}`,children:c.label}),(0,b.jsx)("span",{className:"truncate text-[var(--muted-foreground)]",children:a.agentName})]}),null!=a.durationMs?(0,b.jsxs)("div",{className:"text-[10px] text-[var(--muted-foreground)]",children:[(a.durationMs/1e3).toFixed(1),"s"]}):null]},a.id)})})]}):ce?(0,b.jsx)(be,{item:b$??{id:ce.issueId,identifier:ce.issueIdentifier,title:ce.issueTitle,status:ce.issueStatus,statusCategory:"todo",labels:[],trackerId:"",trackerType:a,assignee:ce.issueAssignee?{id:"",name:ce.issueAssignee}:void 0,updatedAt:ce.updatedAt,createdAt:ce.updatedAt,url:""},run:ce,participants:aR,itemStatusOptions:cj,itemStatusUpdating:aK===ce.issueId,onItemStatusChange:ct,onBack:()=>bg({run:null})}):cg?null:0===aR.length?(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]",children:"Add at least one agent to this project to start a session."}):(0,b.jsx)(aX,{item:b$,trackerType:a,runs:b3,participants:aR,projectId:d,projectSlug:g,itemStatusOptions:cj,itemStatusUpdating:aK===b$.id,onItemStatusChange:ct,activeSessionScriptLabel:cp,onOpenSessionScripts:()=>S(!0),onStartScriptedSession:a=>cH(b$,a),createRun:b6,updateRun:b7,onRunCreated:a=>bf({run:a}),onSelectRun:a=>bf({run:a})},b$.id)})]}):null]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex shrink-0 flex-col border-r border-[var(--card-border)]",style:{width:T},children:[(0,b.jsxs)("div",{className:"shrink-0 border-b border-[var(--card-border)]",children:[(0,b.jsxs)("div",{className:"flex h-12 items-center gap-2 px-3",children:[(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-2 rounded-md border border-[var(--card-border)] bg-[var(--background)] px-2.5 py-1.5 transition-all focus-within:border-[var(--muted-foreground)] focus-within:ring-1 focus-within:ring-[var(--muted-foreground)]",children:[(0,b.jsx)(m.Search,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{type:"text",className:"flex-1 bg-transparent text-sm outline-none placeholder:text-[var(--muted-foreground)]",placeholder:"Search tickets...",value:V,onChange:a=>bL(a.target.value)})]}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)] disabled:cursor-not-allowed disabled:opacity-50",onClick:()=>void bR(),title:"Refresh tickets","aria-label":"Refresh tickets",disabled:bO,children:(0,b.jsx)(l.RefreshCw,{size:16,className:bO?"animate-spin":void 0})}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",onClick:()=>{S(!1),Q(!0)},title:"Tracker settings",children:(0,b.jsx)(n.Settings,{size:16})})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 px-3 pb-2",children:[cn?(0,b.jsx)(au,{label:aq,value:av,options:cl,activeClasses:"border-purple-500/30 bg-purple-500/10 text-purple-400",onChange:ax}):null,cm?(0,b.jsx)(aw,{label:"Status",values:ah,options:ci,activeClasses:"border-amber-500/30 bg-amber-500/10 text-amber-300",onChange:ai,emptyLabel:"All statuses"}):null,(0,b.jsx)(aw,{label:"Assignee",values:af,options:ch,activeClasses:"border-blue-500/30 bg-blue-500/10 text-blue-400",onChange:ag,emptyLabel:"All assignees"}),cq.length>0&&(0,b.jsx)(aw,{label:"Label",values:aE,options:cq,activeClasses:"border-pink-500/30 bg-pink-500/10 text-pink-400",onChange:aF,emptyLabel:"All labels"}),co?(0,b.jsx)(au,{label:"Workspace",value:ay,options:ck,activeClasses:"border-emerald-500/30 bg-emerald-500/10 text-emerald-400",onChange:az}):null,(0,b.jsx)(au,{label:"Sort",value:aA,options:[{value:"activity",label:"Updated At"},{value:"identifier",label:"Ticket ID"},{value:"status",label:"Status"},{value:"created",label:"Created At"}],activeClasses:"border-sky-500/30 bg-sky-500/10 text-sky-400",onChange:a=>aB(a)}),(0,b.jsx)("button",{type:"button",className:"rounded-full border border-[var(--card-border)] p-0.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",title:"desc"===aC?"Descending":"Ascending",onClick:()=>aD(a=>"desc"===a?"asc":"desc"),children:"desc"===aC?(0,b.jsx)(e.ArrowDown,{size:12}):(0,b.jsx)(f.ArrowUp,{size:12})}),b1.length>0&&(p=b1.length>0&&b1.every(a=>br.has(a.id)),(0,b.jsxs)("button",{type:"button",className:`flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${p?"border-[var(--primary)]/40 bg-[var(--primary)]/10 text-[var(--primary)]":"border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"}`,title:p?"Clear selection":"Select all filtered tickets",onClick:()=>{p?bs(new Set):bs(new Set(b1.map(a=>a.id)))},children:[p?(0,b.jsx)(h,{size:12}):(0,b.jsx)(o,{size:12}),p?"Clear":`Select all (${b1.length})`]}))]})]}),(0,b.jsxs)(aO.DndContext,{sensors:bz,collisionDetection:aO.closestCenter,onDragStart:bJ,onDragEnd:bK,children:[(0,b.jsxs)("div",{className:"relative flex-1 min-h-0 flex flex-col",children:[(0,b.jsxs)("div",{ref:cJ,className:"flex-1 overflow-y-auto",children:[bO&&0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"Loading tickets..."}):0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"No tickets found."}):(0,b.jsxs)(b.Fragment,{children:[b2.map(a=>{let d=aM.has(a.status);return(0,b.jsxs)(c.default.Fragment,{children:[(0,b.jsx)(a7,{status:a.status,categoryColor:bd[a.category]??"bg-zinc-400",count:a.items.length,collapsed:d,onToggle:()=>aN(b=>{let c=new Set(b);return c.has(a.status)?c.delete(a.status):c.add(a.status),c})}),!d&&(()=>{let d=bt?new Set(bv):null,e=new Map;for(let b of bk){let c=a.items.find(a=>b.task_ids.includes(a.id));c&&e.set(c.id,b)}let f=bt?bv.map(b=>a.items.find(a=>a.id===b)).filter(Boolean).map(a=>({id:a.id,identifier:a.identifier,title:a.title,status:ap[a.status]??a.status})):[],h=new Set;return a.items.map(i=>{if(d?.has(i.id))return i.id===bx&&bt?(0,b.jsx)(a5,{tickets:f,onConfirm:bD,onCancel:()=>{bu(!1),bw([]),by(null)}},"__pending-group__"):null;let j=e.get(i.id);if(j&&!h.has(j.id)){h.add(j.id);let d=j.task_ids.map(b=>a.items.find(a=>a.id===b)).filter(Boolean);return(0,b.jsxs)(c.default.Fragment,{children:[(0,b.jsx)(a_,{groupId:j.id,name:j.name,count:d.length,collapsed:!!j.collapsed,selected:bj===j.id,projectSlug:g,onToggleCollapse:()=>bm(j.id,{collapsed:!j.collapsed}),onSelect:()=>bf({group:j.id,issue:null,run:null}),onUngroup:()=>{bn(j.id),bj===j.id&&bg({group:null})}}),!j.collapsed&&d.map((a,c)=>(0,b.jsx)(aQ,{item:a,selected:b$?.id===a.id,pinned:aG.has(a.id),activeAgents:aS.get(a.id),participants:aR,draggable:!0,multiSelected:br.has(a.id),treeConnector:c===d.length-1?"last":"mid",projectSlug:g,stats:aT.get(a.id),hideStatus:!0,estimate:bT.get(a.id)?.estimate,localLabels:bT.get(a.id)?.labels,labelDefinitions:bW,allLabels:bV,onToggleLabel:b=>cr(a.id,b),onAddLabel:cs,onSelect:b=>{b&&(b.metaKey||b.ctrlKey)?bC(a.id):bf({issue:a.id,run:null,group:null})},onTogglePin:()=>bM(a.id),rowActions:cE(a),showGroup:!av},a.id))]},`group-${j.id}`)}return bI.has(i.id)?null:(0,b.jsx)(aQ,{item:i,selected:b$?.id===i.id,pinned:aG.has(i.id),activeAgents:aS.get(i.id),participants:aR,draggable:!0,multiSelected:br.has(i.id),projectSlug:g,stats:aT.get(i.id),hideStatus:!0,estimate:bT.get(i.id)?.estimate,localLabels:bT.get(i.id)?.labels,labelDefinitions:bW,allLabels:bV,onToggleLabel:a=>cr(i.id,a),onAddLabel:cs,onSelect:a=>{a&&(a.metaKey||a.ctrlKey)?bC(i.id):bf({issue:i.id,run:null,group:null})},onTogglePin:()=>bM(i.id),rowActions:cE(i),showGroup:!av},i.id)})})()]},`sg-${a.status}`)}),bP?(0,b.jsx)("div",{ref:cI,className:"py-2 text-center text-xs text-[var(--muted-foreground)]",children:bO?"Loading...":"Load more"}):null]}),(0,b.jsx)(ba,{count:br.size,onGroup:bG,onClear:()=>bs(new Set),onBulkRecap:cv,onBulkPrompt:cw,onBulkEstimate:cx,onBulkAddLabel:cy,onBulkRemoveLabel:cz,onBulkStatus:cC,statusOptions:cj,participants:aR,labels:bV,onCreateLabel:cD,selectedMetadata:cF,statusUpdating:cA})]}),(0,b.jsx)(bb.JumpToLatestButton,{visible:cL&&bN.length>20,direction:"top",onClick:cN})]}),(0,b.jsx)(aO.DragOverlay,{dropAnimation:null,children:bA&&((s=bE.current.find(a=>a.id===bA))?(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-lg border border-[var(--primary)]/30 bg-[var(--card-bg)] px-4 py-2.5 text-sm shadow-xl backdrop-blur-sm",children:[(0,b.jsx)("span",{className:"w-24 shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)]",children:s.identifier}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-xs font-medium text-[var(--foreground)]",children:s.title})]}):null)})]})]}),(0,b.jsx)(at.ResizeHandle,{onResize:a=>U(b=>{let c=Math.max(280,Math.min(960,b+a));return(0,M.persistLinearTicketPanelWidth)(c),c})}),R?(0,b.jsx)("div",{ref:a9,className:"absolute right-6 top-16 z-20 max-h-[80vh] overflow-y-auto rounded-2xl border border-[var(--card-border)] bg-[var(--background)] p-4 shadow-2xl",style:{width:"min(760px, calc(100vw - 32px))"},children:(0,b.jsx)(I,{projectSlug:g,scripts:b8,activeScriptId:b9,onSetActiveScriptId:cb,onSaveScript:cc,onDeleteScript:cd})}):null,(0,b.jsx)("div",{className:"flex min-w-0 flex-1 flex-col overflow-hidden",children:ce?(0,b.jsx)(be,{item:b$??{id:ce.issueId,identifier:ce.issueIdentifier,title:ce.issueTitle,status:ce.issueStatus,statusCategory:"todo",labels:[],trackerId:"",trackerType:a,assignee:ce.issueAssignee?{id:"",name:ce.issueAssignee}:void 0,updatedAt:ce.updatedAt,createdAt:ce.updatedAt,url:""},run:ce,participants:aR,itemStatusOptions:cj,itemStatusUpdating:aK===ce.issueId,onItemStatusChange:ct,onBack:()=>bg({run:null})}):bH&&!b$?(0,b.jsx)(a2,{group:bH,items:bN,trackerType:a,participants:aR,projectId:d,projectSlug:g,onUpdateName:a=>bm(bH.id,{name:a}),onDelete:async()=>{await bn(bH.id),bg({group:null})},onSelectItem:a=>bf({issue:a,group:null,run:null}),onRunCreated:a=>bf({run:a}),onSelectRun:a=>bf({run:a})}):b$?cg?null:0===aR.length?(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]",children:"Add at least one agent to this project to start a session."}):(0,b.jsx)(aX,{item:b$,trackerType:a,runs:b3,participants:aR,projectId:d,projectSlug:g,itemStatusOptions:cj,itemStatusUpdating:aK===b$.id,onItemStatusChange:ct,activeSessionScriptLabel:cp,onOpenSessionScripts:()=>S(!0),onStartScriptedSession:a=>cH(b$,a),createRun:b6,updateRun:b7,onRunCreated:a=>bf({run:a}),onSelectRun:a=>bf({run:a})},b$.id):(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]",children:"Select a ticket from the list."})})]}),O&&(0,b.jsx)(am,{trackerType:a,connected:u,user:B,clis:C,mcpConfigured:D,onConnect:E,onConnectWithKey:F,onDisconnect:G,onConfigureMcp:H,onClose:()=>Q(!1),projectId:d}),R&&t?(0,b.jsx)("div",{className:"absolute inset-0 z-30 flex items-center justify-center bg-black/50 p-4",children:(0,b.jsx)("div",{ref:a9,className:"max-h-[85vh] w-full max-w-3xl overflow-y-auto rounded-2xl border border-[var(--card-border)] bg-[var(--background)] p-4 shadow-2xl",children:(0,b.jsx)(I,{projectSlug:g,scripts:b8,activeScriptId:b9,onSetActiveScriptId:cb,onSaveScript:cc,onDeleteScript:cd})})}):null,aU&&aW&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"fixed inset-0 z-40",onClick:()=>{aV(null),aZ(null)}}),(0,b.jsxs)("div",{className:"fixed z-50 min-w-[180px] rounded border border-[var(--card-border)] bg-[var(--card-bg)] py-1 shadow-lg",style:{top:aW.top,left:aW.left},children:[(0,b.jsx)("div",{className:"px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Pick an agent"}),aR.map(a=>(0,b.jsxs)("button",{type:"button",className:"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors hover:bg-[var(--card-bg)]",onClick:()=>void cG(aU,a),children:[(0,b.jsx)("img",{src:aP(a.id,a.color,20),alt:"",className:"h-5 w-5 shrink-0 rounded-full"}),(0,b.jsxs)("span",{className:"flex flex-col",children:[(0,b.jsx)("span",{className:"font-medium text-[var(--foreground)]",children:a.name}),a.role?(0,b.jsx)("span",{className:"text-[10px] text-[var(--muted-foreground)]",children:a.role}):null]})]},a.id))]})]})]}):(0,b.jsx)(P.default,{trackerType:a,projectId:d??"",connected:u,onConnect:E,onConnectWithKey:F})}a.s(["default",()=>bf],859117)}];
|
|
48
|
+
`+(j??""),f=await fetch("/api/chat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:b,promptPrefix:e,threadId:c.threadId,activeParticipantIds:[m.id],projectSlug:h??void 0,routing:k})}),i=await f.json().catch(()=>({}));if(!f.ok||!i.chatRunId||!i.userMessageId)throw Error(i.error||"Failed to start chat session");await v(c.id,{chatRunId:i.chatRunId,rootMessageId:i.userMessageId}),l(c.id)}catch(a){console.error("Failed to create group chat session:",a),I.current=!1,a instanceof Error&&window.alert(a.message)}},[a,s,f,w,g,h,u,v,l]);return(0,b.jsxs)("div",{className:"relative flex min-w-0 flex-1 flex-col overflow-hidden",children:[(0,b.jsxs)("div",{className:"flex h-12 shrink-0 items-center gap-2 border-b border-[var(--card-border)] px-4",children:[(0,b.jsx)(aZ.FolderOpen,{size:16,className:"shrink-0 text-[var(--muted-foreground)]"}),n?(0,b.jsx)("input",{type:"text",value:p,onChange:a=>q(a.target.value),onBlur:r,onKeyDown:b=>{"Enter"===b.key&&r(),"Escape"===b.key&&(q(a.name),o(!1))},autoFocus:!0,className:"min-w-0 flex-1 bg-transparent text-sm font-medium text-[var(--foreground)] outline-none border-b border-[var(--primary)]"}):(0,b.jsx)("h3",{className:"min-w-0 flex-1 truncate text-sm font-medium text-[var(--foreground)]",children:a.name}),(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors",onClick:()=>{q(a.name),o(!0)},title:"Rename group",children:(0,b.jsx)(a0.Pencil,{size:12})}),(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] hover:text-red-400 transition-colors",onClick:j,title:"Delete group (ungroups tickets)",children:(0,b.jsx)(F.Trash2,{size:12})})]}),(0,b.jsxs)("div",{className:"min-h-0 flex-1 overflow-y-auto pb-64",children:[(0,b.jsxs)("section",{className:"border-b border-[var(--card-border)]",children:[(0,b.jsxs)("div",{className:"px-4 py-2 text-[10px] font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:["Tickets (",s.length,")"]}),0===s.length?(0,b.jsx)("div",{className:"px-4 pb-4 text-center text-xs text-[var(--muted-foreground)]",children:"No tickets in this group."}):s.map(a=>(0,b.jsx)(aQ,{item:a,selected:!1,onSelect:()=>k(a.id)},a.id))]}),(0,b.jsx)(aR,{issueId:a.id,trackerType:e,projectId:g}),(0,b.jsx)(aT,{runs:t,onSelect:m})]}),f.length>0&&(0,b.jsx)("div",{className:"absolute bottom-3 left-3 right-3 p-2",children:(0,b.jsx)(a1,{onSend:J,onStop:()=>{},participants:f,projectId:g??void 0,projectSlug:h??void 0,loading:"ready"!==H,commands:[],activityStatus:H,placeholder:`Work on tickets in "${a.name}"...`,initialPinnedParticipantId:w?.id})})]})}let a3="__pending-group__";function a4({ticket:a,isLast:c}){let{attributes:d,listeners:e,setNodeRef:f,transform:g,isDragging:h}=(0,aO.useDraggable)({id:a.id}),i=g?{transform:`translate3d(${g.x}px, ${g.y}px, 0)`,opacity:h?.3:1,position:"relative",zIndex:h?50:void 0}:void 0;return(0,b.jsxs)("div",{ref:f,style:i,...d,...e,className:"flex items-center gap-3 pl-[48px] pr-4 py-2 text-sm cursor-grab active:cursor-grabbing",children:[(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] leading-none text-[var(--muted-foreground)]/40 select-none",children:c?"└──":"├──"}),(0,b.jsx)("span",{className:"shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)]",children:a.identifier}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-xs text-[var(--muted-foreground)]",children:a.title}),a.status&&(0,b.jsx)("span",{className:"shrink-0 text-xs text-[var(--muted-foreground)]",children:a.status})]})}function a5({tickets:a,onConfirm:d,onCancel:e}){let[f,g]=(0,c.useState)(""),h=(0,c.useRef)(null),{setNodeRef:i,isOver:j}=(0,aO.useDroppable)({id:a3});(0,c.useEffect)(()=>{h.current?.focus()},[]);let k=(0,c.useCallback)(()=>{let b=f.trim(),c=a.map(a=>a.identifier).join(", ");d(b||c||"Untitled")},[f,d,a]);return(0,b.jsxs)("div",{ref:i,className:`mx-0 my-0 transition-colors ${j?"bg-[var(--primary)]/5":""}`,children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 pl-[24px] pr-4 py-2 bg-[var(--card-bg)]/50",children:[(0,b.jsx)(U.ChevronDown,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)(aZ.FolderOpen,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{ref:h,type:"text",value:f,onChange:a=>g(a.target.value),onKeyDown:a=>{"Enter"===a.key&&k(),"Escape"===a.key&&e()},placeholder:a.map(a=>a.identifier).join(", ")||"Name this group...",className:"min-w-0 flex-1 bg-transparent text-xs font-medium text-[var(--foreground)] placeholder:text-[var(--muted-foreground)]/60 outline-none border-b border-[var(--primary)]/40 pb-0.5 focus:border-[var(--primary)]"}),(0,b.jsx)("button",{type:"button",className:"rounded px-2 py-0.5 text-[10px] font-medium bg-[var(--primary)] text-[var(--primary-foreground)] hover:opacity-90 transition-opacity",onClick:k,children:"Create"}),(0,b.jsx)("button",{type:"button",className:"rounded px-2 py-0.5 text-[10px] font-medium text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors",onClick:e,children:"Cancel"})]}),a.map((c,d)=>(0,b.jsx)(a4,{ticket:c,isLast:d===a.length-1},c.id))]})}let a6="sg::";function a7({status:a,categoryColor:c,count:d,collapsed:e,onToggle:f}){let{setNodeRef:g,isOver:h}=(0,aO.useDroppable)({id:`${a6}${a}`});return(0,b.jsxs)("div",{ref:g,className:`sticky top-0 z-[5] flex cursor-pointer items-center gap-2 border-b border-[var(--card-border)] bg-[var(--app-shell-pane)] px-4 py-2 transition-colors ${h?"bg-[var(--primary)]/10 ring-1 ring-inset ring-[var(--primary)]/30":""}`,onClick:f,role:"button",tabIndex:0,onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),f())},children:[e?(0,b.jsx)(V.ChevronRight,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}):(0,b.jsx)(U.ChevronDown,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("span",{className:`h-2 w-2 shrink-0 rounded-full ${c}`}),(0,b.jsx)("span",{className:"text-xs font-medium text-[var(--foreground)]",children:a}),(0,b.jsx)("span",{className:"text-[10px] tabular-nums text-[var(--muted-foreground)]",children:d})]})}var a8=a.i(785630);function a9({open:a,onClose:d,anchorRef:e,children:f}){let g=(0,c.useRef)(null);return((0,c.useEffect)(()=>{if(!a)return;let b=a=>{g.current?.contains(a.target)||e.current?.contains(a.target)||d()},c=a=>{"Escape"===a.key&&d()};return document.addEventListener("pointerdown",b),document.addEventListener("keydown",c),()=>{document.removeEventListener("pointerdown",b),document.removeEventListener("keydown",c)}},[a,d,e]),a)?(0,b.jsx)("div",{ref:g,className:"absolute bottom-full left-1/2 z-50 mb-2 -translate-x-1/2 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] p-2 shadow-lg backdrop-blur-sm",children:f}):null}function ba({count:a,onGroup:d,onClear:e,onBulkRecap:f,onBulkPrompt:g,onBulkEstimate:h,onBulkAddLabel:i,onBulkRemoveLabel:j,onBulkStatus:k,statusOptions:m,participants:n,labels:o,onCreateLabel:p,selectedMetadata:r,statusUpdating:s}){let[t,u]=(0,c.useState)(null),v=(0,c.useRef)(null),w=(0,c.useRef)(null),x=(0,c.useRef)(null),y=(0,c.useCallback)(a=>{u(b=>b===a?null:a)},[]),z=c.default.useMemo(()=>{let a=new Map;for(let b of r.values())for(let c of b.labels)a.set(c,(a.get(c)??0)+1);return a},[r]),A=c.default.useMemo(()=>{let a=new Set;for(let b of r.values())for(let c of b.labels)a.add(c);return Array.from(a)},[r]);if(a<2)return null;let B="flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-[11px] font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--background)] hover:text-[var(--foreground)]";return(0,b.jsx)("div",{className:"absolute bottom-4 left-1/2 z-30 -translate-x-1/2",children:(0,b.jsxs)("div",{className:"flex items-center gap-1 rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] px-3 py-1.5 shadow-2xl",children:[(0,b.jsxs)("span",{className:"mr-1 text-xs font-medium text-[var(--foreground)]",children:[a," selected"]}),(0,b.jsx)("div",{className:"mx-1 h-4 w-px bg-[var(--card-border)]"}),(0,b.jsxs)("button",{type:"button",className:B,onClick:f,title:"Recap all selected",children:[(0,b.jsx)(aK.FileText,{size:12}),"Recap"]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsxs)("button",{ref:x,type:"button",className:`${B} ${"prompt"===t?"bg-[var(--background)] text-[var(--foreground)]":""}`,onClick:()=>y("prompt"),title:"Send prompt to all selected",children:[(0,b.jsx)(ay.MessageSquare,{size:12}),"Prompt"]}),(0,b.jsx)(a9,{open:"prompt"===t,onClose:()=>u(null),anchorRef:x,children:(0,b.jsx)(aM,{count:a,participants:n,onSend:(a,b)=>{g(a,b),u(null)}})})]}),(0,b.jsxs)("button",{type:"button",className:B,onClick:h,title:"Ask the LLM to size all selected",children:[(0,b.jsx)(aL.Hash,{size:12}),"Estimate"]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsxs)("button",{ref:v,type:"button",className:`${B} ${"label"===t?"bg-[var(--background)] text-[var(--foreground)]":""}`,onClick:()=>y("label"),title:"Label all selected",children:[(0,b.jsx)(T.Tag,{size:12}),"Label"]}),(0,b.jsx)(a9,{open:"label"===t,onClose:()=>u(null),anchorRef:v,children:(0,b.jsx)(aJ,{labels:o,selectedLabels:A,labelCounts:z,totalSelected:a,onToggle:b=>{(z.get(b)??0)===a?j(b):i(b)},onAdd:p})})]}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsxs)("button",{ref:w,type:"button",className:`${B} ${"status"===t?"bg-[var(--background)] text-[var(--foreground)]":""}`,onClick:()=>y("status"),title:"Update status for all selected",disabled:s,children:[s?(0,b.jsx)(l.RefreshCw,{size:12,className:"animate-spin"}):(0,b.jsx)(l.RefreshCw,{size:12}),"Status"]}),(0,b.jsx)(a9,{open:"status"===t,onClose:()=>u(null),anchorRef:w,children:(0,b.jsx)("div",{className:"flex max-h-48 w-44 flex-col overflow-y-auto",children:m.map(a=>(0,b.jsx)("button",{type:"button",className:"w-full rounded-lg px-3 py-1.5 text-left text-xs text-[var(--muted-foreground)] transition-colors hover:bg-[var(--background)] hover:text-[var(--foreground)]",onClick:()=>{k(a.value),u(null)},children:a.label},a.value))})})]}),(0,b.jsxs)("button",{type:"button",className:B,onClick:d,title:"Group selected",children:[(0,b.jsx)(a8.FolderPlus,{size:12}),"Group"]}),(0,b.jsx)("div",{className:"mx-1 h-4 w-px bg-[var(--card-border)]"}),(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 items-center justify-center rounded text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",onClick:e,"aria-label":"Clear selection",children:(0,b.jsx)(q.X,{size:14})})]})})}var bb=a.i(908225);let bc=(0,d.default)(async()=>{},{loadableGenerated:{modules:[844118]},ssr:!1}),bd={todo:"bg-zinc-400",in_progress:"bg-amber-400",done:"bg-emerald-400",cancelled:"bg-red-400"};function be({item:a,run:d,participants:e,itemStatusOptions:f,itemStatusUpdating:g,onItemStatusChange:h,onBack:k}){let{messages:l,setMessages:m,sendMessage:n,loadHistory:o,stop:q}=(0,A.useGroupChat)(d.threadId),{processes:r,streaming:s,chatRuns:t}=(0,B.useProcessPolling)(d.rootMessageId?{workspaceId:d.threadId,threadId:d.rootMessageId}:{workspaceId:d.threadId},{messages:l,setMessages:m}),u=(0,c.useMemo)(()=>{let a=t[0];if(!a)return an(d);let b={queued:"queued",running:"running",awaiting_user:"running",blocked:"running",completed:"success",failed:"failed",cancelled:"cancelled"}[a.status]??d.status;return an({...d,status:b})},[t,d]);(0,c.useEffect)(()=>{o()},[o,d.threadId]);let v=(0,c.useMemo)(()=>new Map(e.map(a=>[a.id,a])),[e]),w=(0,c.useRef)(null),[x,y]=(0,c.useState)(!1);(0,c.useEffect)(()=>{let a=w.current;if(!a)return;let b=()=>{let{scrollTop:b,scrollHeight:c,clientHeight:d}=a;y(c-b-d>200)};return a.addEventListener("scroll",b,{passive:!0}),()=>a.removeEventListener("scroll",b)},[]);let z=(0,c.useCallback)(()=>{let a=w.current;a&&a.scrollTo({top:a.scrollHeight,behavior:"smooth"})},[]),D=(0,c.useRef)(0);(0,c.useEffect)(()=>{l.length>D.current&&w.current?.scrollTo({top:w.current.scrollHeight,behavior:"smooth"}),D.current=l.length},[l.length]);let E=new Set(["queued","running","awaiting_user","blocked"]),F=t.some(a=>E.has(a.status))||r.some(a=>"spawning"===a.state||"running"===a.state)?t.some(a=>"queued"===a.status)?"queued":"working":"ready",G=(0,c.useCallback)((a,b,c,f,g,h,i)=>{d.rootMessageId&&n(a,b,void 0,d.rootMessageId,c,void 0,(0,O.orderParticipantIds)(e.map(a=>a.id),g),d.projectSlug??void 0,h,i)},[e,d.projectSlug,d.rootMessageId,n]);return(0,b.jsxs)("div",{className:"relative flex min-w-0 flex-1 flex-col overflow-hidden",children:[(0,b.jsxs)("header",{className:"flex h-12 shrink-0 items-center justify-between border-b border-[var(--card-border)] px-6",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[k&&(0,b.jsx)("button",{type:"button",onClick:k,className:"shrink-0 rounded p-0.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",title:"Back to sessions",children:(0,b.jsx)(i.ChevronLeft,{size:16})}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-sm text-[var(--muted-foreground)]",children:a.identifier}),(0,b.jsx)("div",{className:"h-1 w-1 shrink-0 rounded-full bg-[var(--card-border)]"}),(0,b.jsx)("span",{className:"truncate text-sm font-medium text-[var(--foreground)]",children:ao(d)})]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-4",children:[(0,b.jsx)(av,{status:a.status,options:f,disabled:0===f.length,updating:g,onChange:b=>h(a,b)}),(0,b.jsxs)("div",{className:`flex items-center gap-2 rounded-md border px-2.5 py-1 ${aq[u.tone]}`,children:[(0,b.jsx)("div",{className:`h-1.5 w-1.5 rounded-full ${ar[u.tone]}`}),(0,b.jsx)("span",{className:"text-xs font-semibold uppercase tracking-wider",children:u.label})]}),null!=d.durationMs&&(0,b.jsxs)("div",{className:"flex items-center gap-1.5 text-sm text-[var(--muted-foreground)]",children:[(0,b.jsx)(j.Clock,{size:14}),(0,b.jsxs)("span",{children:[(d.durationMs/1e3).toFixed(1),"s"]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 rounded-full border border-[var(--card-border)] bg-[var(--card-bg)] px-2 py-1",children:[(0,b.jsx)("img",{src:aP(d.agentId,v.get(d.agentId)?.color),alt:d.agentName,className:"h-5 w-5 rounded-full object-cover"}),(0,b.jsx)("span",{className:"pr-1 text-xs font-medium",children:d.agentName})]})]})]}),(0,b.jsx)("div",{ref:w,className:"min-h-0 flex-1 overflow-y-auto px-6 py-6 pb-64",children:0===l.length?(0,b.jsx)("div",{className:"py-8 text-center text-xs text-[var(--muted-foreground)]",children:"queued"===d.status||"running"===d.status?"Starting session...":"No thread messages yet."}):(0,b.jsxs)("div",{className:"mx-auto max-w-4xl space-y-8",children:[l.map(a=>{let c=a.participantId?v.get(a.participantId):null,e=(0,J.stripMarkers)(a.content);if(!e.trim())return null;let f=a.participantId??d.agentId;return(0,b.jsxs)("div",{className:"flex gap-3",children:["user"===a.role?(0,b.jsx)("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-[var(--app-shell-subtle,var(--card-bg))]",children:(0,b.jsx)(p.User,{className:"h-3.5 w-3.5 text-[var(--muted-foreground)]"})}):(0,b.jsx)("img",{src:aP(f,c?.color),alt:c?.name??d.agentName,className:"h-7 w-7 shrink-0 rounded-full object-cover"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1 flex flex-col gap-1.5",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("div",{className:"flex items-center gap-2",children:"user"===a.role?(0,b.jsx)("span",{className:"text-sm font-semibold text-[var(--foreground)]",children:"You"}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"text-sm font-semibold",style:{color:c?.color??"var(--foreground)"},children:c?.name??d.agentName}),(0,b.jsx)("span",{className:"rounded bg-[var(--card-bg)] px-1.5 py-0.5 text-[10px] font-bold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Agent"})]})}),(0,b.jsx)("span",{className:"text-xs text-[var(--muted-foreground)]",children:new Date(a.timestamp).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),"user"===a.role?(0,b.jsx)("div",{className:"w-fit max-w-[85%] rounded-xl rounded-tl-sm border border-[var(--card-border)] bg-[var(--card-bg)] px-4 py-3 text-sm text-[var(--foreground)]",children:(0,b.jsx)(C.Markdown,{content:e,isUser:!0})}):(0,b.jsx)("div",{className:"text-sm text-[var(--foreground)]",children:(0,b.jsx)(C.Markdown,{content:e,isUser:!1})})]})]},a.id)}),Object.entries(s).filter(([,a])=>!d.rootMessageId||a.rootMessageId===d.rootMessageId).map(([a])=>{let c=v.get(a);return(0,b.jsxs)("div",{className:"flex items-center gap-3 text-sm text-[var(--muted-foreground)]",children:[(0,b.jsx)("img",{src:aP(a,c?.color),alt:c?.name??d.agentName,className:"h-7 w-7 shrink-0 rounded-full object-cover"}),c?.name??d.agentName," is thinking..."]},`stream-${a}`)})]})}),(0,b.jsx)(bb.JumpToLatestButton,{visible:x&&l.length>10,onClick:z,offsetClassName:"bottom-40"}),(0,b.jsx)("div",{className:"absolute bottom-3 left-3 right-3 p-2",children:d.rootMessageId?(0,b.jsx)(bc,{onSend:G,onStop:q,participants:e,projectId:d.projectId??void 0,projectSlug:d.projectSlug??void 0,loading:"ready"!==F,commands:[],activityStatus:F,placeholder:"Continue this session...",initialPinnedParticipantId:d.agentId}):(0,b.jsx)("div",{className:"px-2 py-1 text-xs text-[var(--muted-foreground)]",children:"Waiting for the session to start..."})})]})}function bf({trackerType:a,projectId:d,projectSlug:g,initialShowSettings:i,initialGroupId:j}){let p,s,{isTouchLayout:t}=(0,K.useInputCapabilities)(),{connected:u,loading:A,user:B,clis:C,mcpConfigured:D,connect:E,connectWithKey:F,disconnect:G,configureMcp:H}=(0,x.useTrackerConnection)(a,d??""),J=(0,c.useRef)(null),[O,Q]=(0,c.useState)(i??!1),[R,S]=(0,c.useState)(!1),[T,U]=(0,c.useState)(()=>(0,M.loadLinearTicketPanelWidth)()||576),[V,W]=(0,c.useState)(""),[X,Y]=(0,c.useState)(""),[Z,$]=(0,c.useState)(!1),[_,aa]=(0,c.useState)([]),[ab,ac]=(0,c.useState)([]),[ad,ae]=(0,c.useState)([]),[af,ag]=(0,c.useState)([]),[ah,ai]=(0,c.useState)([]),[aj,ak]=(0,c.useState)([]),[aq,ar]=(0,c.useState)("Group"),[av,ax]=(0,c.useState)(""),[ay,az]=(0,c.useState)(""),[aA,aB]=(0,c.useState)("activity"),[aC,aD]=(0,c.useState)("desc"),[aE,aF]=(0,c.useState)([]),[aG,aH]=(0,c.useState)(()=>new Set),[aI,aJ]=(0,c.useState)(null),[aK,aL]=(0,c.useState)(null),[aM,aN]=(0,c.useState)(new Set),{participants:aR}=(0,aY.useTrackerParticipants)(a,d),{issueActiveAgents:aS}=function(a,b){let[d,e]=(0,c.useState)(new Map);return(0,c.useEffect)(()=>{let c=!1;async function d(){try{let d=new URLSearchParams;b&&d.set("projectId",b);let f=await fetch(`/api/trackers/${a}/active-agents?${d}`);if(!f.ok||c)return;let g=await f.json(),h=new Map;for(let a of g.agents??[]){let b=h.get(a.issueId)??[];b.push({agentId:a.agentId,agentName:a.agentName}),h.set(a.issueId,b)}c||e(h)}catch{}}d();let f=setInterval(()=>void d(),5e3);return()=>{c=!0,clearInterval(f)}},[a,b]),{issueActiveAgents:d}}(a,d),{issueStats:aT}=function(a,b){let[d,e]=(0,c.useState)(new Map);return(0,c.useEffect)(()=>{let c=!1;async function d(){try{let d=new URLSearchParams;b&&d.set("projectId",b);let f=await fetch(`/api/trackers/${a}/stats?${d}`);if(!f.ok||c)return;let g=await f.json(),h=new Map;for(let a of g.stats??[])h.set(a.issueId,{sessions:a.sessions,messages:a.messages});c||e(h)}catch{}}d();let f=setInterval(()=>void d(),1e4);return()=>{c=!0,clearInterval(f)}},[a,b]),{issueStats:d}}(a,d),[aU,aV]=(0,c.useState)(null),[aW,aZ]=(0,c.useState)(null),[a$,a0]=(0,c.useState)("runs"),a1=(0,c.useRef)(null),a4=(0,c.useRef)(!0),a8=(0,c.useRef)(null),a9=(0,c.useRef)(null),{getSelection:bc,pushSelection:bf,replaceSelection:bg}=(0,r.useUrlSelection)(),bh=bc("issue"),bi=bc("run"),bj=bc("group"),{groups:bk,createGroup:bl,updateGroup:bm,deleteGroup:bn,addTasksToGroup:bo,removeTaskFromGroup:bp,refetch:bq}=function(a){let[b,d]=(0,c.useState)([]),[e,f]=(0,c.useState)(!1),g=(0,c.useCallback)(async()=>{if(a){f(!0);try{let b=await fetch(`/api/task-groups?project_id=${encodeURIComponent(a)}`);if(!b.ok)throw Error("Failed to fetch groups");let c=await b.json();d(c.groups??[])}catch(a){console.error("useTaskGroups fetch error:",a)}finally{f(!1)}}},[a]);(0,c.useEffect)(()=>{g()},[g]);let h=(0,c.useCallback)(async(b,c)=>{if(!a)return null;try{let d=await fetch("/api/task-groups",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:a,name:b,task_ids:c})});if(!d.ok)throw Error("Failed to create group");let e=await d.json();return await g(),e.group}catch(a){return console.error("createGroup error:",a),null}},[a,g]),i=(0,c.useCallback)(async(a,b)=>{try{if(!(await fetch(`/api/task-groups/${a}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})).ok)throw Error("Failed to update group");await g()}catch(a){console.error("updateGroup error:",a)}},[g]),j=(0,c.useCallback)(async a=>{try{if(!(await fetch(`/api/task-groups/${a}`,{method:"DELETE"})).ok)throw Error("Failed to delete group");await g()}catch(a){console.error("deleteGroup error:",a)}},[g]),k=(0,c.useCallback)(async(a,b)=>{try{if(!(await fetch(`/api/task-groups/${a}/tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({task_ids:b})})).ok)throw Error("Failed to assign tasks");await g()}catch(a){console.error("addTasksToGroup error:",a)}},[g]),l=(0,c.useCallback)(async(a,b)=>{try{if(!(await fetch(`/api/task-groups/${a}/tasks?task_id=${encodeURIComponent(b)}`,{method:"DELETE"})).ok)throw Error("Failed to remove task");await g()}catch(a){console.error("removeTaskFromGroup error:",a)}},[g]);return{groups:b,isLoading:e,refetch:g,createGroup:h,updateGroup:i,deleteGroup:j,addTasksToGroup:k,removeTaskFromGroup:l}}(d),[br,bs]=(0,c.useState)(new Set),[bt,bu]=(0,c.useState)(!1),[bv,bw]=(0,c.useState)([]),[bx,by]=(0,c.useState)(null),bz=(0,aO.useSensors)((0,aO.useSensor)(aO.PointerSensor,{activationConstraint:{distance:8}})),[bA,bB]=(0,c.useState)(null),bC=(0,c.useCallback)(a=>{bs(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},[]),bD=(0,c.useCallback)(async a=>{bv.length<2||(await bl(a,bv),bw([]),bu(!1),by(null),bs(new Set))},[bv,bl]),bE=(0,c.useRef)([]),bF=(0,c.useRef)(null),bG=(0,c.useCallback)(()=>{let a=Array.from(br),b=bE.current.find(a=>br.has(a.id));bw(a),by(b?.id??a[0]??null),bu(!0)},[br]),bH=bk.find(a=>a.id===bj),bI=(0,c.useMemo)(()=>new Set(bk.flatMap(a=>a.task_ids)),[bk]),bJ=(0,c.useCallback)(a=>{bB(a.active.id)},[]),bK=(0,c.useCallback)(async a=>{bB(null);let{active:b,over:c}=a,d=b.id;if(bt){let a=bv.includes(d);if(!c||b.id===c.id){a&&bw(a=>{let b=a.filter(a=>a!==d);return b.length<2?(bu(!1),by(null),[]):b});return}let e=c.id,f=e===a3||bv.includes(e);a&&!f?bw(a=>{let b=a.filter(a=>a!==d);return b.length<2?(bu(!1),by(null),[]):b}):a||bw(a=>[...a,d]);return}if(!c||b.id===c.id)return;let e=c.id;if(e.startsWith(a6)){let a=e.slice(a6.length),b=bE.current.find(a=>a.id===d),c=bE.current.find(b=>b.status===a)?.statusCategory;b&&b.status!==a&&await bF.current?.(b,a,c);return}let f=bE.current.find(a=>a.id===d),g=bE.current.find(a=>a.id===e);if(f&&g&&f.status!==g.status)return void await bF.current?.(f,g.status,g.statusCategory);let h=bk.find(a=>a.id===e);if(h)return void await bo(h.id,[d]);let i=!bI.has(e);if(!bI.has(d)&&i){bw([d,e]),by(e),bu(!0);return}let j=bk.find(a=>a.task_ids.includes(d));j&&i&&await bp(j.id,d)},[bk,bI,bo,bp,bt,bv]),bL=(0,c.useCallback)(a=>{W(a),a1.current&&clearTimeout(a1.current),a1.current=setTimeout(()=>Y(a),300)},[]),bM=(0,c.useCallback)(a=>{aH(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},[a,g]);(0,c.useEffect)(()=>()=>{a1.current&&clearTimeout(a1.current)},[]),(0,c.useEffect)(()=>{let a={...L};a4.current=!0,W(a.search),Y(a.search),ag(a.assigneeIds),ai(a.statusCategories),az(j??a.groupIds?.[0]??""),ax(j??a.groupIds?.[0]??""),aB(a.sortBy),aD(a.sortDir),aF(a.labelNames??[]),aH(new Set)},[a,g,j]),(0,c.useEffect)(()=>{if(a4.current){a4.current=!1;return}},[a,g,V,af,ah,ay,av,aE,aA,aC]),(0,c.useEffect)(()=>{if(!u||!d)return;let b=!1;$(!1);let c=new URLSearchParams;return c.set("projectId",d),g&&c.set("projectSlug",g),fetch(`/api/trackers/${a}/options?${c.toString()}`).then(a=>a.json()).then(a=>{b||(aa(Array.isArray(a.assignees)?a.assignees:[]),ac(Array.isArray(a.statuses)?a.statuses.map(a=>({value:a.name,label:a.name})):[]),ae(Array.isArray(a.teams)?a.teams:[]),ak(Array.isArray(a.groups)?a.groups:[]),a.groupLabel&&ar(a.groupLabel),$(!0))}).catch(()=>{b||(aa([]),ac([]),ae([]),ak([]),$(!0))}),()=>{b=!0}},[u,a,d,g]),(0,c.useEffect)(()=>{if(!Z)return;let a=af.filter(a=>_.some(b=>b.id===a));a.length!==af.length&&ag(a)},[_,Z,af]),(0,c.useEffect)(()=>{if(!Z)return;let a=ab.map(a=>a.value),b=ah.filter(b=>a.includes(b));b.length!==ah.length&&ai(b)},[Z,ah,ab]),(0,c.useEffect)(()=>{if(Z){if(ad.length<=1&&ay)return void az("");ay&&!ad.some(a=>a.id===ay)&&az("")}},[Z,ay,ad]),(0,c.useEffect)(()=>{Z&&av&&!aj.some(a=>a.id===av)&&ax("")},[aj,Z,av]);let{items:bN,loading:bO,hasMore:bP,loadMore:bQ,refresh:bR,updateItem:bS}=function(a,b,d,e){let[f,g]=(0,c.useState)([]),[h,i]=(0,c.useState)(!0),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(!1),n=(0,c.useRef)(j),o=(0,c.useRef)(!1);n.current=j;let p=`/api/trackers/${encodeURIComponent(a)}/items`,q=e.projectId?function(a,b,c){let d={};for(let a of Object.keys(c).sort()){let b=c[a];if(null!=b&&""!==b&&!1!==b)if(Array.isArray(b)){if(!b.length)continue;d[a]=[...b].map(String).sort()}else d[a]=b}return`${a}:${b}:${JSON.stringify(d)}`}(a,e.projectId,{statuses:b.statuses,statusCategories:b.statusCategories,search:b.search,assigneeIds:b.assigneeIds,groupIds:b.groupIds,sortBy:b.sortBy,sortDir:b.sortDir,hasActivity:b.hasActivity,limit:e.limit}):null,r=(0,c.useRef)(q);r.current=q;let s=(0,c.useCallback)(async a=>{if(d&&e.projectId){i(!0);try{let c=new URLSearchParams;if(c.set("projectId",e.projectId),b.statuses?.length)for(let a of b.statuses)c.append("status",a);if(b.statusCategories?.length)for(let a of b.statusCategories)c.append("statusCategory",a);if(b.search&&c.set("search",b.search),b.assigneeIds?.length)for(let a of b.assigneeIds)c.append("assigneeId",a);if(b.groupIds?.length)for(let a of b.groupIds)c.append("groupId",a);b.sortBy&&c.set("sortBy",b.sortBy),b.sortDir&&c.set("sortDir",b.sortDir),b.hasActivity&&c.set("hasActivity","true"),a&&n.current&&c.set("cursor",n.current),e.limit&&c.set("limit",String(e.limit));let d=await fetch(`${p}?${c.toString()}`),f=await d.json(),h=f.items??[];g(b=>a?[...b,...h]:h);let i=f.pageInfo?.endCursor??null,j=f.pageInfo?.hasNextPage??!1;k(i),m(j),o.current=!0,!a&&r.current&&w(r.current,{items:h,endCursor:i,hasNextPage:j,savedAt:Date.now()})}catch{a||g([])}finally{i(!1)}}},[p,b.statuses,b.statusCategories,b.search,b.assigneeIds,b.groupIds,b.sortBy,b.sortDir,b.hasActivity,d,e.projectId,e.limit]);(0,c.useEffect)(()=>{let a=!1;return k(null),o.current=!1,d&&q&&v(q).then(b=>{a||!b||o.current||(g(b.items),k(b.endCursor),m(b.hasNextPage),i(!1))}),s(!1),()=>{a=!0}},[s,q,d]);let t=(0,c.useCallback)(()=>s(!0),[s]);return{items:f,loading:h,hasMore:l,loadMore:t,refresh:(0,c.useCallback)(()=>(k(null),s(!1)),[s]),updateItem:(0,c.useCallback)(a=>{g(b=>b.map(b=>b.id===a.id?a:b))},[])}}(a,(0,c.useMemo)(()=>({search:X||void 0,statuses:ah.length>0&&ah.length<ab.length?ah:void 0,assigneeIds:af.length>0?af:void 0,groupIds:av?[av]:void 0,sortBy:aA,sortDir:aC}),[X,af,av,ah,ab.length,aA,aC]),u&&Z&&!!d,{projectId:d??""}),{metadataMap:bT,refresh:bU}=function(a,b,d){let[e,f]=(0,c.useState)(new Map),[g,h]=(0,c.useState)(!1),i=(0,c.useRef)(""),j=(0,c.useCallback)(async()=>{if(!b||0===d.length)return void f(new Map);h(!0);try{let c=await fetch(`/api/trackers/${encodeURIComponent(a)}/metadata/bulk?projectId=${encodeURIComponent(b)}&issueIds=${d.map(encodeURIComponent).join(",")}`),e=await c.json(),g=new Map;for(let[a,b]of Object.entries(e))g.set(a,{labels:Array.isArray(b.labels)?b.labels:[],estimate:"number"==typeof b.estimate?b.estimate:null});f(g)}catch{}h(!1)},[a,b,d]);return(0,c.useEffect)(()=>{let a=d.join(",");a!==i.current&&(i.current=a,j())},[j,d]),{metadataMap:e,loading:g,refresh:j}}(a,d,(0,c.useMemo)(()=>bN.map(a=>a.id),[bN])),{labels:bV,definitions:bW,refresh:bX,createDefinition:bY}=al(a,d),bZ=(0,c.useMemo)(()=>bh?bN.find(a=>a.id===bh)??null:null,[bN,bh]),b$=bZ??(aI?.id===bh?aI:null),b_=(0,c.useMemo)(()=>{if(0===aG.size)return bN;let a=[],b=[];for(let c of bN)aG.has(c.id)?a.push(c):b.push(c);return[...a,...b]},[bN,aG]);bE.current=b_;let b0=(0,c.useDeferredValue)(aE),b1=(0,c.useMemo)(()=>{if(0===b0.length)return b_;let a=new Set(b0),b=[];for(let c of b_){let d=bT.get(c.id)?.labels;if(d){for(let e of d)if(a.has(e)){b.push(c);break}}}return b},[b_,b0,bT]),b2=(0,c.useMemo)(()=>{let a=new Map;for(let b of b1){let c=a.get(b.status);c||(c={status:b.status,category:b.statusCategory,items:[]},a.set(b.status,c)),c.items.push(b)}let b={in_progress:0,todo:1,done:2,cancelled:3};return[...a.values()].sort((a,c)=>(b[a.category]??1)-(b[c.category]??1))},[!0,b1]),{runs:b3,loading:b4,loadedForIssueId:b5,createRun:b6,updateRun:b7}=y(a,b$?.id??null,d??null),{scripts:b8,activeScriptId:b9,activeScript:ca,setActiveScriptId:cb,saveScript:cc,deleteScript:cd}=function(a,b){let[d,e]=(0,c.useState)([]),[f,g]=(0,c.useState)(null);(0,c.useEffect)(()=>{let a={...z};e(a.scripts),g(a.activeScriptId)},[a,b]);let h=(0,c.useCallback)((a,b)=>{e(a),g(b)},[a,b]),i=(0,c.useCallback)(a=>{let b=a&&d.some(b=>b.id===a)?a:null;h(d,b)},[h,d]),j=(0,c.useCallback)(a=>{let b=new Date().toISOString(),c=a.name.trim(),e=a.prompt.trim();if(!c||!e)throw Error("Run script name and prompt are required.");let f=a.id?d.find(b=>b.id===a.id):null,g=f?{...f,name:c,prompt:e,updatedAt:b}:{id:crypto.randomUUID(),name:c,prompt:e,createdAt:b,updatedAt:b};return h([...f?d.map(a=>a.id===f.id?g:a):[g,...d]].sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt)),g.id),g},[h,d]),k=(0,c.useCallback)(a=>{h(d.filter(b=>b.id!==a),f===a?null:f)},[f,h,d]),l=(0,c.useMemo)(()=>d.find(a=>a.id===f)??null,[f,d]);return{scripts:d,activeScriptId:f,activeScript:l,setActiveScriptId:i,saveScript:j,deleteScript:k}}(a,g),ce=bi?b3.find(a=>a.id===bi)??null:null,cf=bh&&!bi?(0,N.loadLastRunForIssue)(bh):null,cg=!!cf&&J.current!==bh,ch=(0,c.useMemo)(()=>_.map(a=>({value:a.id,label:a.name})),[_]),ci=(0,c.useMemo)(()=>ab.map(a=>({value:a.value,label:a.label})),[ab]),cj=(0,c.useMemo)(()=>{let a=ab.map(a=>({value:a.label,label:a.label})),b=new Set(a.map(a=>a.value)),c=b$?.status?.trim();return c&&!b.has(c)&&a.unshift({value:c,label:c}),a},[b$?.status,ab]),ck=(0,c.useMemo)(()=>[{value:"",label:"Workspace"},...ad.map(a=>({value:a.id,label:a.name}))],[ad]),cl=(0,c.useMemo)(()=>[{value:"",label:aq},...aj.map(a=>({value:a.id,label:a.name}))],[aj,aq]),cm=ci.length>0,cn=cl.length>1,co=ck.length>2,cp=ca?.name??"AGX default",cq=(0,c.useMemo)(()=>bV.map(a=>({value:a.name,label:a.name})),[bV]),cr=(0,c.useCallback)(async(b,c)=>{if(!d)return;let e=bT.get(b)?.labels??[],f=e.includes(c)?e.filter(a=>a!==c):[...e,c];try{await fetch(`/api/trackers/${a}/metadata?projectId=${encodeURIComponent(d)}&issueId=${encodeURIComponent(b)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({labels:f})}),bU(),bX()}catch{}},[d,a,bT,bU,bX]),cs=(0,c.useCallback)(async a=>{d&&await bY(a)},[d,bY]),ct=(0,c.useCallback)(async(b,c,e)=>{let f=c.trim();if(!f||f===b.status||!d)return;let g={...b,status:f,statusCategory:e??b.statusCategory};bS(g),bh===b.id&&aJ(g),aL(b.id);try{let c=await fetch(`/api/trackers/${a}/items/${encodeURIComponent(b.id)}?projectId=${encodeURIComponent(d??"")}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:f})}),e=await c.json().catch(()=>({}));if(!c.ok||!e.item)throw Error(e.error||"Failed to update ticket status");let g=e.item;bS(g),bh===g.id&&aJ(g),await bR()}catch(a){bS(b),bh===b.id&&aJ(b),a instanceof Error&&window.alert(a.message)}finally{aL(a=>a===b.id?null:a)}},[bR,bh,bS,a,d]);bF.current=ct;let cu=(0,c.useCallback)(async(b,c,e,f)=>{let h=f??aR[0]?.id;if(h)try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:b.id,issueIdentifier:b.identifier,issueTitle:b.title,issueStatus:b.status,issueAssignee:b.assignee?.name??null,agentId:h,scriptName:c,scriptPrompt:e})})}catch(a){console.error(`Failed to start ${c} for ${b.identifier}:`,a)}},[aR,a,d,g]),cv=(0,c.useCallback)(async()=>{let b=Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean);if(0===b.length||0===aR.length)return;let c=aR[0];for(let e of b)try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:e.id,issueIdentifier:e.identifier,issueTitle:e.title,issueStatus:e.status,issueAssignee:e.assignee?.name??null,agentId:c.id,scriptName:"Recap",scriptPrompt:"Summarize recent activity and current state of this ticket. Focus on: what was done, what's outstanding, and any blockers."})})}catch(a){console.error(`Failed to start recap for ${e.identifier}:`,a)}bs(new Set)},[br,bN,aR,a,d,g]),cw=(0,c.useCallback)(async(b,c)=>{for(let e of Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean))try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:e.id,issueIdentifier:e.identifier,issueTitle:e.title,issueStatus:e.status,issueAssignee:e.assignee?.name??null,agentId:c,scriptPrompt:b})})}catch(a){console.error(`Failed to send prompt for ${e.identifier}:`,a)}bs(new Set)},[br,bN,a,d,g]),cx=(0,c.useCallback)(async()=>{let b=Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean);if(0===b.length||0===aR.length)return;let c=aR[0];for(let e of b)try{await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:e.id,issueIdentifier:e.identifier,issueTitle:e.title,issueStatus:e.status,issueAssignee:e.assignee?.name??null,agentId:c.id,scriptName:"Estimate",scriptPrompt:"Assess the complexity and scope of this ticket and assign a Fibonacci story-point estimate (1, 2, 3, 5, 8, 13, or 21). Consider: required investigation, files likely to change, unknowns, and testing effort. Briefly justify the number, then set the estimate using the available tooling."})})}catch(a){console.error(`Failed to start estimate for ${e.identifier}:`,a)}bs(new Set)},[br,bN,aR,a,d,g]),cy=(0,c.useCallback)(async b=>{let c=Array.from(br);if(0!==c.length&&d)try{await fetch(`/api/trackers/${a}/metadata/bulk`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d,issueIds:c,action:"add_labels",payload:{labels:[b]}})}),bU(),bX()}catch{}},[br,d,a,bU,bX]),cz=(0,c.useCallback)(async b=>{let c=Array.from(br);if(0!==c.length&&d)try{await fetch(`/api/trackers/${a}/metadata/bulk`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d,issueIds:c,action:"remove_label",payload:{label:b}})}),bU(),bX()}catch{}},[br,d,a,bU,bX]),[cA,cB]=(0,c.useState)(!1),cC=(0,c.useCallback)(async a=>{let b=Array.from(br).map(a=>bN.find(b=>b.id===a)).filter(Boolean);if(0!==b.length){for(let c of(cB(!0),b))await ct(c,a);cB(!1),bs(new Set)}},[br,bN,ct]),cD=(0,c.useCallback)(async a=>{d&&await bY(a)},[d,bY]),cE=(0,c.useCallback)(b=>({statusOptions:cj,onRecap:()=>{let c=d?`?projectId=${encodeURIComponent(d)}`:"";fetch(`/api/trackers/${encodeURIComponent(a)}/items/${encodeURIComponent(b.id)}/recap${c}`,{method:"POST"}).then(()=>{window.dispatchEvent(new CustomEvent("tracker:recap-triggered",{detail:{trackerType:a,issueId:b.id}}))})},onPrompt:(a,c)=>{cu(b,"Prompt",a,c)},onEstimate:()=>{cu(b,"Estimate","Assess the complexity and scope of this ticket and assign a Fibonacci story-point estimate (1, 2, 3, 5, 8, 13, or 21). Consider: required investigation, files likely to change, unknowns, and testing effort. Briefly justify the number, then set the estimate using the available tooling.")},onStatus:a=>{ct(b,a)}}),[cj,cu,ct,a,d]),cF=(0,c.useMemo)(()=>{let a=new Map;for(let b of br){let c=bT.get(b);a.set(b,c??{labels:[],estimate:null})}return a},[br,bT]);(0,c.useEffect)(()=>{if(!bh||!d)return void aJ(null);if(bZ)return void aJ(a=>a?.id===bh?bZ:null);let b=!1;return(async()=>{try{let c=await fetch(`/api/trackers/${a}/items/${encodeURIComponent(bh)}?projectId=${encodeURIComponent(d??"")}`);if(b)return;if(404===c.status)return void aJ(null);if(!c.ok)throw Error(`Failed to fetch selected tracker ticket: ${c.status}`);let e=await c.json().catch(()=>({}));if(!e.item?.id)return void aJ(null);aJ(e.item)}catch(a){b||console.error("Failed to hydrate selected tracker item",a)}})(),()=>{b=!0}},[bg,bZ,bh,a,d]),(0,c.useEffect)(()=>{if(!bh){bi&&bg({run:null});return}},[bg,bh,bi]),(0,c.useEffect)(()=>{b$&&bi&&!b4&&(b3.some(a=>a.id===bi)||bg({run:null}))},[bg,b3,b4,b$,bi]),(0,c.useEffect)(()=>{bh&&bi&&(0,N.persistLastRunForIssue)(bh,bi)},[bh,bi]),(0,c.useEffect)(()=>{cg&&!b4&&b5===bh&&(J.current=bh,cf&&b3.some(a=>a.id===cf)&&bg({run:cf}))},[cg,cf,bh,b3,b4,b5,bg]),(0,c.useEffect)(()=>{if(t){if(!b$)return void a0("runs");if(ce||0===b3.length)return void a0("ticket");a0("runs")}},[t,b3.length,b$,ce]),(0,c.useEffect)(()=>{if(!R)return;let a=a=>{let b=a.target;a9.current?.contains(b)||a8.current?.contains(b)||S(!1)},b=a=>{"Escape"===a.key&&S(!1)};return document.addEventListener("pointerdown",a),document.addEventListener("keydown",b),()=>{document.removeEventListener("pointerdown",a),document.removeEventListener("keydown",b)}},[R]);let cG=(0,c.useCallback)(async(b,c)=>{aV(null),aZ(null);try{let e=await fetch(`/api/trackers/${a}/runs/scripted`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:d??void 0,projectSlug:g??void 0,issueId:b.id,issueIdentifier:b.identifier,issueTitle:b.title,issueStatus:b.status,issueAssignee:b.assignee?.name??null,agentId:c.id,scriptName:ca?.name,scriptPrompt:ca?.prompt})}),f=await e.json().catch(()=>({}));if(!e.ok||!f.run||!f.chatRunId||!f.userMessageId)throw Error(f.error||"Failed to start scripted session");bf({issue:b.id,run:f.run.id})}catch(a){console.error("Failed to start scripted tracker session:",a),a instanceof Error&&window.alert(a.message)}},[ca,d,g,bf,a]),cH=(0,c.useCallback)((a,b)=>{if(S(!1),0===aR.length)return void window.alert("Add at least one agent to this project before starting a scripted session.");if(1===aR.length)return void cG(a,aR[0]);let c=b?.currentTarget?.getBoundingClientRect();aV(a),aZ(c?{top:c.bottom+4,left:c.left}:{top:200,left:200})},[cG,aR]),cI=(0,c.useRef)(null),cJ=(0,c.useRef)(null),cK=(0,c.useRef)(null),[cL,cM]=(0,c.useState)(!1);(0,c.useEffect)(()=>{let a=[cJ.current,cK.current].filter(Boolean);if(0===a.length)return;let b=a=>{cM(a.currentTarget.scrollTop>400)};return a.forEach(a=>a.addEventListener("scroll",b,{passive:!0})),()=>a.forEach(a=>a.removeEventListener("scroll",b))},[t]);let cN=(0,c.useCallback)(()=>{let a=cJ.current??cK.current;a?.scrollTo({top:0,behavior:"smooth"})},[]);return((0,c.useEffect)(()=>{let a=cI.current;if(!a||!bP)return;let b=new IntersectionObserver(a=>{a[0]?.isIntersecting&&bQ()},{threshold:.1});return b.observe(a),()=>b.disconnect()},[bP,bQ]),u)?(0,b.jsxs)("div",{className:"relative flex h-full overflow-hidden",children:[t?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col",children:[(0,b.jsxs)("div",{className:"shrink-0 border-b border-[var(--card-border)]",children:[(0,b.jsxs)("div",{className:"flex h-12 items-center gap-2 px-3",children:[(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-2 rounded-md border border-[var(--card-border)] bg-[var(--background)] px-2.5 py-1.5 transition-all focus-within:border-[var(--muted-foreground)] focus-within:ring-1 focus-within:ring-[var(--muted-foreground)]",children:[(0,b.jsx)(m.Search,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{type:"text",className:"flex-1 bg-transparent text-sm outline-none placeholder:text-[var(--muted-foreground)]",placeholder:"Search tickets...",value:V,onChange:a=>bL(a.target.value)})]}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-2 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)] disabled:cursor-not-allowed disabled:opacity-50",onClick:()=>void bR(),title:"Refresh tickets","aria-label":"Refresh tickets",disabled:bO,children:(0,b.jsx)(l.RefreshCw,{size:16,className:bO?"animate-spin":void 0})}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-2 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",onClick:()=>{S(!1),Q(!0)},title:"Tracker settings",children:(0,b.jsx)(n.Settings,{size:16})})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5 px-3 pb-2",children:[cn?(0,b.jsx)(au,{label:aq,value:av,options:cl,activeClasses:"border-purple-500/30 bg-purple-500/10 text-purple-400",onChange:ax}):null,cm?(0,b.jsx)(aw,{label:"Status",values:ah,options:ci,activeClasses:"border-amber-500/30 bg-amber-500/10 text-amber-300",onChange:ai,emptyLabel:"All statuses"}):null,(0,b.jsx)(aw,{label:"Assignee",values:af,options:ch,activeClasses:"border-blue-500/30 bg-blue-500/10 text-blue-400",onChange:ag,emptyLabel:"All assignees"}),cq.length>0&&(0,b.jsx)(aw,{label:"Label",values:aE,options:cq,activeClasses:"border-pink-500/30 bg-pink-500/10 text-pink-400",onChange:aF,emptyLabel:"All labels"}),co?(0,b.jsx)(au,{label:"Workspace",value:ay,options:ck,activeClasses:"border-emerald-500/30 bg-emerald-500/10 text-emerald-400",onChange:az}):null,(0,b.jsx)(au,{label:"Sort",value:aA,options:[{value:"activity",label:"Updated At"},{value:"identifier",label:"Ticket ID"},{value:"status",label:"Status"},{value:"created",label:"Created At"}],activeClasses:"border-sky-500/30 bg-sky-500/10 text-sky-400",onChange:a=>aB(a)}),(0,b.jsx)("button",{type:"button",className:"rounded-full border border-[var(--card-border)] p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",title:"desc"===aC?"Descending":"Ascending",onClick:()=>aD(a=>"desc"===a?"asc":"desc"),children:"desc"===aC?(0,b.jsx)(e.ArrowDown,{size:12}):(0,b.jsx)(f.ArrowUp,{size:12})})]})]}),(0,b.jsxs)("div",{className:"relative flex-1 min-h-0 flex flex-col",children:[(0,b.jsx)("div",{ref:cK,className:"flex-1 overflow-y-auto",children:bO&&0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"Loading tickets..."}):0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"No tickets found."}):(0,b.jsxs)(b.Fragment,{children:[b2.map(a=>{let d=aM.has(a.status);return(0,b.jsxs)(c.default.Fragment,{children:[(0,b.jsx)(a7,{status:a.status,categoryColor:bd[a.category]??"bg-zinc-400",count:a.items.length,collapsed:d,onToggle:()=>aN(b=>{let c=new Set(b);return c.has(a.status)?c.delete(a.status):c.add(a.status),c})}),!d&&a.items.map(a=>(0,b.jsx)(aQ,{item:a,selected:b$?.id===a.id,pinned:aG.has(a.id),activeAgents:aS.get(a.id),participants:aR,projectSlug:g,stats:aT.get(a.id),hideStatus:!0,estimate:bT.get(a.id)?.estimate,localLabels:bT.get(a.id)?.labels,labelDefinitions:bW,allLabels:bV,onToggleLabel:b=>cr(a.id,b),onAddLabel:cs,onSelect:()=>{a0("runs"),bf({issue:a.id,run:null})},onTogglePin:()=>bM(a.id),rowActions:cE(a),showGroup:!av},a.id))]},`sg-${a.status}`)}),bP?(0,b.jsx)("div",{ref:cI,className:"py-2 text-center text-xs text-[var(--muted-foreground)]",children:bO?"Loading...":"Load more"}):null]})}),(0,b.jsx)(bb.JumpToLatestButton,{visible:cL&&bN.length>20,direction:"top",onClick:cN})]})]}),b$?(0,b.jsxs)("div",{className:"absolute inset-0 z-20 flex flex-col bg-[var(--background)]",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3 border-b border-[var(--card-border)] px-4 py-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-[var(--muted-foreground)]",children:b$.identifier}),(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-[var(--foreground)]",children:b$.title})]}),(0,b.jsx)("button",{type:"button",className:"rounded p-2 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",onClick:()=>bg({issue:null,run:null}),"aria-label":"Close ticket panel",children:(0,b.jsx)(q.X,{size:16})})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 border-b border-[var(--card-border)] px-3 py-2",children:[(0,b.jsx)("button",{type:"button",className:`rounded-full px-3 py-1.5 text-xs font-medium transition-colors ${"runs"===a$?"bg-[var(--card-bg)] text-[var(--foreground)]":"text-[var(--muted-foreground)] hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"}`,onClick:()=>a0("runs"),children:"Runs"}),(0,b.jsx)("button",{type:"button",className:`rounded-full px-3 py-1.5 text-xs font-medium transition-colors ${"ticket"===a$?"bg-[var(--card-bg)] text-[var(--foreground)]":"text-[var(--muted-foreground)] hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"}`,onClick:()=>a0("ticket"),children:"Ticket"})]}),(0,b.jsx)("div",{className:"min-h-0 flex-1 overflow-hidden",children:"runs"===a$?(0,b.jsxs)("div",{className:"flex h-full flex-col overflow-hidden",children:[(0,b.jsxs)("div",{className:"relative flex items-center justify-between border-b border-[var(--card-border)] px-3 py-2",children:[(0,b.jsx)("h3",{className:"text-xs font-semibold text-[var(--foreground)]",children:"Sessions"}),(0,b.jsxs)("button",{ref:a8,type:"button",className:"inline-flex items-center gap-1 rounded px-2 py-1 text-[10px] font-medium text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)] disabled:cursor-not-allowed disabled:opacity-40",onClick:()=>{S(!1),a0("ticket"),bf({run:null})},title:"Open a fresh chat for this ticket. You can choose or edit the session script in the ticket tab.","aria-label":"New session",disabled:!b$,children:[(0,b.jsx)(k.Plus,{size:12}),"New session"]})]}),(0,b.jsx)("div",{className:"flex-1 overflow-y-auto",children:b4&&0===b3.length||cg?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"Loading sessions..."}):0===b3.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"No previous sessions yet."}):b3.map(a=>{let c=an(a);return(0,b.jsxs)("button",{type:"button",className:`w-full px-3 py-2 text-left text-xs transition-colors ${ce?.id===a.id?"bg-[var(--card-bg)]":"hover:bg-[var(--card-bg)]"}`,onClick:()=>{a0("ticket"),bf({run:a.id})},children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-1",children:[(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-[11px] font-medium text-[var(--foreground)]",children:ao(a)}),(0,b.jsx)("span",{className:"text-[10px] text-[var(--muted-foreground)]",children:new Date(a.startedAt).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),(0,b.jsxs)("div",{className:"mt-0.5 flex items-center gap-1.5 text-[10px]",children:[(0,b.jsx)("span",{className:`font-medium ${as[c.tone]}`,children:c.label}),(0,b.jsx)("span",{className:"truncate text-[var(--muted-foreground)]",children:a.agentName})]}),null!=a.durationMs?(0,b.jsxs)("div",{className:"text-[10px] text-[var(--muted-foreground)]",children:[(a.durationMs/1e3).toFixed(1),"s"]}):null]},a.id)})})]}):ce?(0,b.jsx)(be,{item:b$??{id:ce.issueId,identifier:ce.issueIdentifier,title:ce.issueTitle,status:ce.issueStatus,statusCategory:"todo",labels:[],trackerId:"",trackerType:a,assignee:ce.issueAssignee?{id:"",name:ce.issueAssignee}:void 0,updatedAt:ce.updatedAt,createdAt:ce.updatedAt,url:""},run:ce,participants:aR,itemStatusOptions:cj,itemStatusUpdating:aK===ce.issueId,onItemStatusChange:ct,onBack:()=>bg({run:null})}):cg?null:0===aR.length?(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]",children:"Add at least one agent to this project to start a session."}):(0,b.jsx)(aX,{item:b$,trackerType:a,runs:b3,participants:aR,projectId:d,projectSlug:g,itemStatusOptions:cj,itemStatusUpdating:aK===b$.id,onItemStatusChange:ct,activeSessionScriptLabel:cp,onOpenSessionScripts:()=>S(!0),onStartScriptedSession:a=>cH(b$,a),createRun:b6,updateRun:b7,onRunCreated:a=>bf({run:a}),onSelectRun:a=>bf({run:a})},b$.id)})]}):null]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex shrink-0 flex-col border-r border-[var(--card-border)]",style:{width:T},children:[(0,b.jsxs)("div",{className:"shrink-0 border-b border-[var(--card-border)]",children:[(0,b.jsxs)("div",{className:"flex h-12 items-center gap-2 px-3",children:[(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-2 rounded-md border border-[var(--card-border)] bg-[var(--background)] px-2.5 py-1.5 transition-all focus-within:border-[var(--muted-foreground)] focus-within:ring-1 focus-within:ring-[var(--muted-foreground)]",children:[(0,b.jsx)(m.Search,{size:14,className:"shrink-0 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{type:"text",className:"flex-1 bg-transparent text-sm outline-none placeholder:text-[var(--muted-foreground)]",placeholder:"Search tickets...",value:V,onChange:a=>bL(a.target.value)})]}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)] disabled:cursor-not-allowed disabled:opacity-50",onClick:()=>void bR(),title:"Refresh tickets","aria-label":"Refresh tickets",disabled:bO,children:(0,b.jsx)(l.RefreshCw,{size:16,className:bO?"animate-spin":void 0})}),(0,b.jsx)("button",{type:"button",className:"shrink-0 rounded p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",onClick:()=>{S(!1),Q(!0)},title:"Tracker settings",children:(0,b.jsx)(n.Settings,{size:16})})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 px-3 pb-2",children:[cn?(0,b.jsx)(au,{label:aq,value:av,options:cl,activeClasses:"border-purple-500/30 bg-purple-500/10 text-purple-400",onChange:ax}):null,cm?(0,b.jsx)(aw,{label:"Status",values:ah,options:ci,activeClasses:"border-amber-500/30 bg-amber-500/10 text-amber-300",onChange:ai,emptyLabel:"All statuses"}):null,(0,b.jsx)(aw,{label:"Assignee",values:af,options:ch,activeClasses:"border-blue-500/30 bg-blue-500/10 text-blue-400",onChange:ag,emptyLabel:"All assignees"}),cq.length>0&&(0,b.jsx)(aw,{label:"Label",values:aE,options:cq,activeClasses:"border-pink-500/30 bg-pink-500/10 text-pink-400",onChange:aF,emptyLabel:"All labels"}),co?(0,b.jsx)(au,{label:"Workspace",value:ay,options:ck,activeClasses:"border-emerald-500/30 bg-emerald-500/10 text-emerald-400",onChange:az}):null,(0,b.jsx)(au,{label:"Sort",value:aA,options:[{value:"activity",label:"Updated At"},{value:"identifier",label:"Ticket ID"},{value:"status",label:"Status"},{value:"created",label:"Created At"}],activeClasses:"border-sky-500/30 bg-sky-500/10 text-sky-400",onChange:a=>aB(a)}),(0,b.jsx)("button",{type:"button",className:"rounded-full border border-[var(--card-border)] p-0.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]",title:"desc"===aC?"Descending":"Ascending",onClick:()=>aD(a=>"desc"===a?"asc":"desc"),children:"desc"===aC?(0,b.jsx)(e.ArrowDown,{size:12}):(0,b.jsx)(f.ArrowUp,{size:12})}),b1.length>0&&(p=b1.length>0&&b1.every(a=>br.has(a.id)),(0,b.jsxs)("button",{type:"button",className:`flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${p?"border-[var(--primary)]/40 bg-[var(--primary)]/10 text-[var(--primary)]":"border-[var(--card-border)] text-[var(--muted-foreground)] hover:bg-[var(--card-bg)] hover:text-[var(--foreground)]"}`,title:p?"Clear selection":"Select all filtered tickets",onClick:()=>{p?bs(new Set):bs(new Set(b1.map(a=>a.id)))},children:[p?(0,b.jsx)(h,{size:12}):(0,b.jsx)(o,{size:12}),p?"Clear":`Select all (${b1.length})`]}))]})]}),(0,b.jsxs)(aO.DndContext,{sensors:bz,collisionDetection:aO.closestCenter,onDragStart:bJ,onDragEnd:bK,children:[(0,b.jsxs)("div",{className:"relative flex-1 min-h-0 flex flex-col",children:[(0,b.jsxs)("div",{ref:cJ,className:"flex-1 overflow-y-auto",children:[bO&&0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"Loading tickets..."}):0===bN.length?(0,b.jsx)("div",{className:"px-3 py-4 text-xs text-[var(--muted-foreground)]",children:"No tickets found."}):(0,b.jsxs)(b.Fragment,{children:[b2.map(a=>{let d=aM.has(a.status);return(0,b.jsxs)(c.default.Fragment,{children:[(0,b.jsx)(a7,{status:a.status,categoryColor:bd[a.category]??"bg-zinc-400",count:a.items.length,collapsed:d,onToggle:()=>aN(b=>{let c=new Set(b);return c.has(a.status)?c.delete(a.status):c.add(a.status),c})}),!d&&(()=>{let d=bt?new Set(bv):null,e=new Map;for(let b of bk){let c=a.items.find(a=>b.task_ids.includes(a.id));c&&e.set(c.id,b)}let f=bt?bv.map(b=>a.items.find(a=>a.id===b)).filter(Boolean).map(a=>({id:a.id,identifier:a.identifier,title:a.title,status:ap[a.status]??a.status})):[],h=new Set;return a.items.map(i=>{if(d?.has(i.id))return i.id===bx&&bt?(0,b.jsx)(a5,{tickets:f,onConfirm:bD,onCancel:()=>{bu(!1),bw([]),by(null)}},"__pending-group__"):null;let j=e.get(i.id);if(j&&!h.has(j.id)){h.add(j.id);let d=j.task_ids.map(b=>a.items.find(a=>a.id===b)).filter(Boolean);return(0,b.jsxs)(c.default.Fragment,{children:[(0,b.jsx)(a_,{groupId:j.id,name:j.name,count:d.length,collapsed:!!j.collapsed,selected:bj===j.id,projectSlug:g,onToggleCollapse:()=>bm(j.id,{collapsed:!j.collapsed}),onSelect:()=>bf({group:j.id,issue:null,run:null}),onUngroup:()=>{bn(j.id),bj===j.id&&bg({group:null})}}),!j.collapsed&&d.map((a,c)=>(0,b.jsx)(aQ,{item:a,selected:b$?.id===a.id,pinned:aG.has(a.id),activeAgents:aS.get(a.id),participants:aR,draggable:!0,multiSelected:br.has(a.id),treeConnector:c===d.length-1?"last":"mid",projectSlug:g,stats:aT.get(a.id),hideStatus:!0,estimate:bT.get(a.id)?.estimate,localLabels:bT.get(a.id)?.labels,labelDefinitions:bW,allLabels:bV,onToggleLabel:b=>cr(a.id,b),onAddLabel:cs,onSelect:b=>{b&&(b.metaKey||b.ctrlKey)?bC(a.id):bf({issue:a.id,run:null,group:null})},onTogglePin:()=>bM(a.id),rowActions:cE(a),showGroup:!av},a.id))]},`group-${j.id}`)}return bI.has(i.id)?null:(0,b.jsx)(aQ,{item:i,selected:b$?.id===i.id,pinned:aG.has(i.id),activeAgents:aS.get(i.id),participants:aR,draggable:!0,multiSelected:br.has(i.id),projectSlug:g,stats:aT.get(i.id),hideStatus:!0,estimate:bT.get(i.id)?.estimate,localLabels:bT.get(i.id)?.labels,labelDefinitions:bW,allLabels:bV,onToggleLabel:a=>cr(i.id,a),onAddLabel:cs,onSelect:a=>{a&&(a.metaKey||a.ctrlKey)?bC(i.id):bf({issue:i.id,run:null,group:null})},onTogglePin:()=>bM(i.id),rowActions:cE(i),showGroup:!av},i.id)})})()]},`sg-${a.status}`)}),bP?(0,b.jsx)("div",{ref:cI,className:"py-2 text-center text-xs text-[var(--muted-foreground)]",children:bO?"Loading...":"Load more"}):null]}),(0,b.jsx)(ba,{count:br.size,onGroup:bG,onClear:()=>bs(new Set),onBulkRecap:cv,onBulkPrompt:cw,onBulkEstimate:cx,onBulkAddLabel:cy,onBulkRemoveLabel:cz,onBulkStatus:cC,statusOptions:cj,participants:aR,labels:bV,onCreateLabel:cD,selectedMetadata:cF,statusUpdating:cA})]}),(0,b.jsx)(bb.JumpToLatestButton,{visible:cL&&bN.length>20,direction:"top",onClick:cN})]}),(0,b.jsx)(aO.DragOverlay,{dropAnimation:null,children:bA&&((s=bE.current.find(a=>a.id===bA))?(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-lg border border-[var(--primary)]/30 bg-[var(--card-bg)] px-4 py-2.5 text-sm shadow-xl backdrop-blur-sm",children:[(0,b.jsx)("span",{className:"w-24 shrink-0 whitespace-nowrap font-mono text-xs text-[var(--muted-foreground)]",children:s.identifier}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-xs font-medium text-[var(--foreground)]",children:s.title})]}):null)})]})]}),(0,b.jsx)(at.ResizeHandle,{onResize:a=>U(b=>{let c=Math.max(280,Math.min(960,b+a));return(0,M.persistLinearTicketPanelWidth)(c),c})}),R?(0,b.jsx)("div",{ref:a9,className:"absolute right-6 top-16 z-20 max-h-[80vh] overflow-y-auto rounded-2xl border border-[var(--card-border)] bg-[var(--background)] p-4 shadow-2xl",style:{width:"min(760px, calc(100vw - 32px))"},children:(0,b.jsx)(I,{projectSlug:g,scripts:b8,activeScriptId:b9,onSetActiveScriptId:cb,onSaveScript:cc,onDeleteScript:cd})}):null,(0,b.jsx)("div",{className:"flex min-w-0 flex-1 flex-col overflow-hidden",children:ce?(0,b.jsx)(be,{item:b$??{id:ce.issueId,identifier:ce.issueIdentifier,title:ce.issueTitle,status:ce.issueStatus,statusCategory:"todo",labels:[],trackerId:"",trackerType:a,assignee:ce.issueAssignee?{id:"",name:ce.issueAssignee}:void 0,updatedAt:ce.updatedAt,createdAt:ce.updatedAt,url:""},run:ce,participants:aR,itemStatusOptions:cj,itemStatusUpdating:aK===ce.issueId,onItemStatusChange:ct,onBack:()=>bg({run:null})}):bH&&!b$?(0,b.jsx)(a2,{group:bH,items:bN,trackerType:a,participants:aR,projectId:d,projectSlug:g,onUpdateName:a=>bm(bH.id,{name:a}),onDelete:async()=>{await bn(bH.id),bg({group:null})},onSelectItem:a=>bf({issue:a,group:null,run:null}),onRunCreated:a=>bf({run:a}),onSelectRun:a=>bf({run:a})}):b$?cg?null:0===aR.length?(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]",children:"Add at least one agent to this project to start a session."}):(0,b.jsx)(aX,{item:b$,trackerType:a,runs:b3,participants:aR,projectId:d,projectSlug:g,itemStatusOptions:cj,itemStatusUpdating:aK===b$.id,onItemStatusChange:ct,activeSessionScriptLabel:cp,onOpenSessionScripts:()=>S(!0),onStartScriptedSession:a=>cH(b$,a),createRun:b6,updateRun:b7,onRunCreated:a=>bf({run:a}),onSelectRun:a=>bf({run:a})},b$.id):(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-xs text-[var(--muted-foreground)]",children:"Select a ticket from the list."})})]}),O&&(0,b.jsx)(am,{trackerType:a,connected:u,user:B,clis:C,mcpConfigured:D,onConnect:E,onConnectWithKey:F,onDisconnect:G,onConfigureMcp:H,onClose:()=>Q(!1),projectId:d}),R&&t?(0,b.jsx)("div",{className:"absolute inset-0 z-30 flex items-center justify-center bg-black/50 p-4",children:(0,b.jsx)("div",{ref:a9,className:"max-h-[85vh] w-full max-w-3xl overflow-y-auto rounded-2xl border border-[var(--card-border)] bg-[var(--background)] p-4 shadow-2xl",children:(0,b.jsx)(I,{projectSlug:g,scripts:b8,activeScriptId:b9,onSetActiveScriptId:cb,onSaveScript:cc,onDeleteScript:cd})})}):null,aU&&aW&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"fixed inset-0 z-40",onClick:()=>{aV(null),aZ(null)}}),(0,b.jsxs)("div",{className:"fixed z-50 min-w-[180px] rounded border border-[var(--card-border)] bg-[var(--card-bg)] py-1 shadow-lg",style:{top:aW.top,left:aW.left},children:[(0,b.jsx)("div",{className:"px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Pick an agent"}),aR.map(a=>(0,b.jsxs)("button",{type:"button",className:"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors hover:bg-[var(--card-bg)]",onClick:()=>void cG(aU,a),children:[(0,b.jsx)("img",{src:aP(a.id,a.color,20),alt:"",className:"h-5 w-5 shrink-0 rounded-full"}),(0,b.jsxs)("span",{className:"flex flex-col",children:[(0,b.jsx)("span",{className:"font-medium text-[var(--foreground)]",children:a.name}),a.role?(0,b.jsx)("span",{className:"text-[10px] text-[var(--muted-foreground)]",children:a.role}):null]})]},a.id))]})]})]}):(0,b.jsx)(P.default,{trackerType:a,projectId:d??"",connected:u,onConnect:E,onConnectWithKey:F})}a.s(["default",()=>bf],859117)}];
|
|
49
49
|
|
|
50
50
|
//# sourceMappingURL=apps_local_components_TrackerBoard_tsx_98970bab._.js.map
|
|
@@ -15,8 +15,8 @@ When updating the objective, you can edit this file directly. Rules:
|
|
|
15
15
|
- NEVER change the \`id\` or \`createdAt\` fields.
|
|
16
16
|
- Always update \`updatedAt\` to the current ISO timestamp when making changes.
|
|
17
17
|
- After any edit, call \`GET ${u}\` to verify the file is still valid.
|
|
18
|
-
- If validation fails, fix the errors immediately before doing anything else.`,"Scheduled tasks live in the shared scheduled-task list and are filtered by this objective label.","Your job is to help the team develop the strategy needed to reach the goal, including the right combination of objective notes, scheduled tasks, and tracker tickets.","Use the current session history to build on prior reasoning. Only reset and start from scratch when the user explicitly starts a new session.","Use this thread to pressure-test strategy, suggest better tactics, rewrite the objective when asked, propose the right operational cadence, and take concrete follow-up actions when the user wants them applied.","When suggesting edits, prefer editing the frontmatter file directly or using the notes API. When the user asks you to make a change, edit the file, validate, then confirm.","Local objective APIs:",`- PATCH ${p} with JSON fields such as {"title","teamId","key"} to update the objective itself.`,`- GET ${r} to list all notes for this objective. Returns {"notes":[...],"total","page","limit","hasMore"}.`,`- POST ${r} with {"title","body"} to create a new note.`,`- GET ${r}/{noteId} to read a single note.`,`- PATCH ${r}/{noteId} with {"title","body"} to update a note.`,`- DELETE ${r}/{noteId} to delete a note.`,`- GET ${q} to inspect the scheduled tasks already tracked for this objective.`,`- POST ${q} with {"name","prompt","cadence","agentId"} to create a scheduled task for this objective.`,`- GET ${u} to validate the objective file on disk. Returns {"valid":true} or {"valid":false,"errors":[...]}.`,"Tracker integrations:",`- Available tracker types: ${o.available.length>0?o.available.map(a=>`${a.displayName} (${a.type})`).join(", "):"none registered"}.`,`- Configured for this project: ${o.configured.length>0?o.configured.map(a=>{let b=o.defaultType===a.type;return`${a.displayName} (${a.type})${b?" — default":""}`}).join(", "):"none — ask the user to connect a tracker in project settings if they want ticket workflows"}.`,o.defaultType?`- Default tracker for ticket workflows: ${o.defaultType}. Prefer this tracker when creating or referencing tickets for this objective unless the user asks otherwise.`:o.configured.length>1?"- No default tracker has been selected; ask the user which connected tracker to use before creating tickets.":"",...o.configured.map(b=>`- GET /api/trackers/${b.type}/items?projectId=${a} to list ${b.displayName} items. Filter client-side by label "${f.key}" to find tickets tied to this objective.`)].filter(Boolean).join("\n\n")),m].filter(Boolean).join("\n\n"),A=await Z(b,d,w,y,e,g,h?[h]:x,c,z,n);!y&&A&&(G(A),E("detail"))},[null,aj,ay,aC,av,f,N,a,c,F,Z,i]),aE=(0,e.useMemo)(()=>av?au?.messages??[]:[],[av,au]),aF=(0,e.useMemo)(()=>av&&F?Object.entries(ad).filter(([,a])=>a.rootMessageId===F):[],[av,F,ad]),aG=(0,e.useCallback)(a=>{p(b=>{let c=Math.max(320,Math.min(1200,b-a));return(0,al.persistObjectiveChatPanelWidth)(c),c})},[]);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(ap,{onResize:aG}),(0,b.jsxs)("aside",{className:"relative flex h-full min-h-[420px] w-full flex-col overflow-hidden border-t border-[var(--border)] bg-[var(--overlay-panel)] xl:min-h-0 xl:w-[var(--objective-chat-panel-width)] xl:shrink-0 xl:self-stretch xl:border-l xl:border-t-0",style:{"--objective-chat-panel-width":`${o}px`},children:[(0,b.jsx)(aw,{message:P}),av?(0,b.jsx)("div",{className:"border-b border-[var(--border)] px-4 py-4",children:(0,b.jsxs)("button",{type:"button",onClick:()=>E("list"),"aria-label":"Back to sessions",className:"inline-flex min-w-0 items-center gap-2 text-left text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]",children:[(0,b.jsx)(g.ArrowLeft,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{className:"truncate",children:au?.title??"Loading session..."})]})}):(0,b.jsx)("div",{className:"border-b border-[var(--border)] px-4 py-4",children:(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Strategy Sessions"}),(0,b.jsx)("p",{className:"text-xs text-[var(--muted-foreground)]",children:"Start a new strategy conversation below, or open an earlier session to keep building on it."})]})}),(0,b.jsx)("div",{ref:T,className:`min-h-0 flex-1 overflow-y-auto pb-[calc(15rem+env(safe-area-inset-bottom))] ${av?"px-4 py-4":"px-0 py-0"}`,children:av?0===aE.length?(0,b.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 px-4 text-center text-[var(--muted-foreground)]",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-[var(--foreground)]",children:"Loading strategy session"}),(0,b.jsx)("p",{className:"max-w-sm text-xs",children:"The conversation will appear here once the session history is ready."})]}):(0,b.jsxs)("div",{className:"space-y-5",children:[aE.map(a=>{let c=a.participantId?ao.get(a.participantId):null,d=H===a.id;return(0,b.jsxs)("div",{"data-objective-message-id":a.id,className:`flex gap-3 rounded-2xl transition-colors ${d?"bg-[var(--status-in-progress-bg)] p-2 -m-2":""}`,children:["user"===a.role?(0,b.jsx)("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--overlay-panel-soft)] text-[var(--muted-foreground)]",children:(0,b.jsx)(r.User,{className:"h-4 w-4"})}):(0,b.jsx)("img",{src:(0,B.agentAvatarUrl)(a.participantId??"assistant",32,c?.color),alt:c?.name??"Agent",className:"h-8 w-8 shrink-0 rounded-full border border-[var(--border)] object-cover"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[var(--foreground)]",children:"user"===a.role?"You":c?.name??"Agent"}),(0,b.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:new Date(a.timestamp).toLocaleString([],{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})})]}),(0,b.jsx)("div",{className:"mt-2 rounded-2xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] px-4 py-3 text-[15px] leading-relaxed text-[var(--foreground)]",children:"user"===a.role?(0,b.jsx)(z.Markdown,{content:(0,C.stripMarkers)(a.content),isUser:!0}):(0,b.jsx)(A.StreamingSegments,{content:(0,C.stripMarkers)(a.content)})})]})]},a.id)}),aF.map(([a])=>{let c=ao.get(a);return(0,b.jsxs)("div",{className:"flex items-center gap-3 text-sm text-[var(--muted-foreground)]",children:[(0,b.jsx)("img",{src:(0,B.agentAvatarUrl)(a,32,c?.color),alt:c?.name??"Agent",className:"h-8 w-8 shrink-0 rounded-full border border-[var(--border)] object-cover"}),(0,b.jsxs)("span",{children:[c?.name??"Agent"," is thinking..."]})]},`stream-${a}`)}),(0,b.jsx)("div",{ref:U})]}):0===as.length?(0,b.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 px-4 text-center text-[var(--muted-foreground)]",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-[var(--foreground)]",children:"No strategy sessions yet"}),(0,b.jsx)("p",{className:"max-w-sm text-xs",children:"Use the composer below to start the first conversation about how this objective should be reached."})]}):(0,b.jsx)("div",{className:"divide-y divide-[var(--border)]",children:as.map(a=>{var c;let d=az.get(a.rootMessageId)??null;return(0,b.jsxs)("button",{type:"button",onClick:()=>{G(a.rootMessageId),E("detail")},className:"flex w-full items-start justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-[var(--overlay-panel-soft)]",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("p",{className:"truncate text-sm font-medium text-[var(--foreground)]",children:a.title}),(0,b.jsxs)("p",{className:"mt-1 text-[11px] text-[var(--muted-foreground)]",children:[1===(c=a.messageCount)?"1 message":`${c} messages`," · Last"," ",aq(a.updatedAt)]})]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[d?(0,b.jsx)("span",{className:"rounded-full border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-[var(--status-in-progress-text)]",children:"queued"===d?"Queued":"Working"}):null,(0,b.jsx)(h.ArrowRight,{className:"mt-0.5 h-4 w-4 text-[var(--muted-foreground)]"})]})]},a.rootMessageId)})})}),(0,b.jsx)(ah.JumpToLatestButton,{visible:av&&V&&aE.length>10,onClick:ag,direction:"bottom",offsetClassName:"bottom-[calc(15rem+env(safe-area-inset-bottom))]"}),(0,b.jsx)("div",{className:"absolute bottom-0 left-0 right-0 bg-[var(--overlay-panel)] p-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]",children:(0,b.jsx)(y.Composer,{onSend:aD,onStop:aC,participants:N,commands:[],projectId:a,projectSlug:c,loading:"ready"!==aA,activityStatus:aA,sendInterruptsBusy:!0,placeholder:av?`Continue strategy for "${f.title}"...`:`Start a new strategy session for "${f.title}"...`,initialPinnedParticipantId:N[0]?.id})})]})]})}function av({label:a}){return(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-[var(--muted-foreground)]",children:a})}function aw({message:a}){return a?(0,b.jsxs)("div",{className:"mt-3 flex items-center gap-2 rounded-2xl border border-rose-500/20 bg-rose-500/10 px-3 py-2 text-sm text-rose-100",children:[(0,b.jsx)(f.AlertTriangle,{className:"h-4 w-4"}),(0,b.jsx)("span",{children:a})]}):null}function ax({content:a,editable:c=!1,onChange:d,placeholder:e}){let f=a.trim().length>0;return c||f?(0,b.jsx)("div",{className:"overflow-hidden border-l-2 border-[var(--border)]/60 pl-4 transition-all focus-within:border-indigo-500/60",children:c||f?(0,b.jsx)(D.default,{content:a,editable:c,onChange:d,placeholder:e}):null}):null}function ay({onResize:a}){let{isTouchLayout:c}=(0,aj.useInputCapabilities)();return c?null:(0,b.jsx)(ai.ResizeHandle,{onResize:a,ariaLabel:"Resize objective list panel"})}function az({objective:a,activityCount:c,lastActivityAt:d,activeAgentIds:e,participants:f,isSelected:g,onSelect:h}){let i,j=(i=1===c?"1 activity":`${c} activities`,d?`${i} \xb7 Last ${aq(d)}`:`${i} \xb7 No activity yet`);return(0,b.jsx)("article",{className:"px-2",children:(0,b.jsxs)("button",{type:"button",onClick:h,"aria-label":`Open details for ${a.title}`,className:`group flex w-full items-center gap-3 rounded-xl px-2 py-2 text-left transition-colors ${g?"bg-[var(--primary)]/10 border border-[var(--primary)]/20":"border border-transparent hover:bg-[var(--secondary)]"}`,children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1 py-0.5",children:[(0,b.jsx)("div",{className:"flex min-w-0 items-center gap-2",children:(0,b.jsx)("span",{className:`rounded-full border px-1.5 py-0 text-[9px] font-semibold uppercase tracking-[0.12em] ${ao[a.status].chipClass}`,children:ao[a.status].label})}),(0,b.jsx)("p",{className:"mt-1 truncate text-sm font-medium text-[var(--foreground)]",children:a.title}),(0,b.jsx)("p",{className:"mt-0.5 text-[11px] text-[var(--muted-foreground)]",children:j})]}),e&&e.length>0&&(0,b.jsx)("span",{className:"inline-flex items-center -space-x-1 shrink-0",children:e.slice(0,3).map(a=>{let c=f?.find(b=>b.id===a);return(0,b.jsxs)("span",{className:"relative inline-block",title:c?.name??a,children:[(0,b.jsx)("img",{src:(0,B.agentAvatarUrl)(a,16,c?.color??void 0),alt:c?.name??a,className:"h-3 w-3 rounded-full ring-[1.5px] ring-[var(--background)]"}),(0,b.jsx)("span",{className:"absolute -bottom-px -right-px h-1.5 w-1.5 rounded-full bg-green-500 ring-[1px] ring-[var(--background)]"})]},a)})})]})})}function aA({projectSlug:a,initialObjectiveId:c}){let{isLoading:d,project:f,workspace:g,teams:h,persistWorkspace:i}=as(a),j=g.objectives,[k,l]=(0,e.useState)(c??null),[m,n]=(0,e.useState)(()=>(0,al.loadObjectiveListPanelWidth)()||320),[p,q]=(0,e.useState)(null),[r,s]=(0,e.useState)(!1),[t,u]=(0,e.useState)(null),[v,w]=(0,e.useState)(new Map),[x,y]=(0,e.useState)([]);(0,e.useEffect)(()=>{!k&&j.length>0&&l(j[0].id)},[k,j]),(0,e.useEffect)(()=>{k&&j.length>0&&!j.some(a=>a.id===k)&&l(j[0]?.id??null)},[k,j]),(0,e.useEffect)(()=>{let a=!1;return async function(){try{let b=await fetch("/api/participants");b.ok&&!a&&y(await b.json())}catch{}}(),()=>{a=!0}},[]),(0,e.useEffect)(()=>{let a=new Map;for(let b of j)b.threadId&&a.set(b.threadId,b.id);if(0===a.size)return;let b=!1;async function c(){try{let c=Array.from(a.keys()).join(","),d=await fetch(`/api/chat-runs/active-agents?threadIds=${encodeURIComponent(c)}`);if(!d.ok||b)return;let e=await d.json(),f=new Map;for(let[b,c]of Object.entries(e.activeAgents??{})){let d=a.get(b);d&&Array.isArray(c)&&c.length>0&&f.set(d,c)}b||w(f)}catch{}}c();let d=setInterval(()=>void c(),5e3);return()=>{b=!0,clearInterval(d)}},[j]);let z=async()=>{if(!p)return;let a=p.title.trim();if(!a)return void u("Objective statement is required.");let b=p.teamId.trim();if(!b)return void u("Team is required.");let c=new Date().toISOString(),d=(0,an.createProjectObjective)({title:a,teamId:b,key:(0,an.generateProjectObjectiveKey)(a,g.objectives),summary:p.summary,now:c});s(!0),u(null);try{await i((0,an.upsertProjectObjective)(g,d));try{await fetch(`/api/projects/${f?.id}/objectives/${d.id}/worker`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}q(null),l(d.id)}catch(a){u(a instanceof Error?a.message:"Failed to save objective updates.")}finally{s(!1)}},A=(0,e.useCallback)(a=>{n(b=>{let c=Math.max(240,Math.min(480,b+a));return(0,al.persistObjectiveListPanelWidth)(c),c})},[]);return d&&!f?(0,b.jsx)(av,{label:"Loading objectives..."}):f?(0,b.jsxs)("div",{className:"flex h-full min-h-0 overflow-hidden bg-[var(--background)] text-[var(--foreground)]",children:[(0,b.jsxs)("div",{className:"flex flex-shrink-0 flex-col border-r border-[var(--border)] bg-[var(--background)]",style:{width:m},children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-4 py-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:"Objectives"}),(0,b.jsx)("p",{className:"mt-0.5 text-[11px] text-[var(--muted-foreground)]",children:0===j.length?"None yet":`${j.length} total`})]}),(0,b.jsx)("button",{type:"button",onClick:()=>q(ar()),className:"inline-flex h-7 w-7 items-center justify-center rounded-lg text-[var(--muted-foreground)] transition-colors hover:bg-[var(--secondary)] hover:text-[var(--foreground)]","aria-label":"New objective",children:(0,b.jsx)(o.Plus,{className:"h-4 w-4"})})]}),(0,b.jsx)(aw,{message:t}),(0,b.jsx)("div",{className:"flex-1 overflow-y-auto py-1",children:0===j.length?(0,b.jsxs)("div",{className:"px-4 py-8 text-center",children:[(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:"No objectives yet."}),(0,b.jsx)("button",{type:"button",onClick:()=>q(ar()),className:"mt-2 text-sm text-[var(--primary)] hover:underline",children:"Create one"})]}):(0,b.jsx)("div",{className:"space-y-0.5",children:j.map(a=>{let c=(0,an.buildObjectiveTimelineActivities)({objective:a,workspace:g});return(0,b.jsx)(az,{objective:a,activityCount:c.length,lastActivityAt:c[0]?.createdAt??null,activeAgentIds:v.get(a.id),participants:x,isSelected:k===a.id,onSelect:()=>l(a.id)},a.id)})})})]}),(0,b.jsx)(ay,{onResize:A}),(0,b.jsx)("div",{className:"flex-1 min-w-0 min-h-0 overflow-hidden",children:k?(0,b.jsx)(aB,{projectSlug:a,objectiveId:k,onObjectiveDeleted:()=>l(null)}):(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-[var(--muted-foreground)]",children:0===j.length?"Create an objective to get started.":"Select an objective from the list."})}),p?(0,b.jsx)(aD,{mode:"create",draft:p,teams:h,isSaving:r,onChange:q,onClose:()=>q(null),onSave:()=>void z()}):null]}):(0,b.jsx)(av,{label:"Project not found."})}function aB({projectSlug:a,objectiveId:f,onObjectiveDeleted:g}){var h;let i,r,v,w,x,y,A,B,C,D=(0,d.useRouter)(),{isLoading:F,project:G,workspace:H,teams:I,persistWorkspace:K,refetchProject:L}=as(a),M=(0,e.useMemo)(()=>H.objectives.find(a=>a.id===f)??null,[f,H.objectives]),N=M?(h=M.teamId,I.find(a=>a.id===h)?.name??null):null,[O,Q]=(0,e.useState)(null),[R,S]=(0,e.useState)(null),[T,U]=(0,e.useState)("activity"),[V,W]=(0,e.useState)(0),[Y,Z]=(0,e.useState)(!1),[$,_]=(0,e.useState)(null),[aa,ab]=(0,e.useState)([]),[ac,ad]=(0,e.useState)(!1),[ae,ai]=(0,e.useState)(null),[aj,ak]=(0,e.useState)({}),[al,am]=(0,e.useState)({}),[ap,ar]=(0,e.useState)(new Set),[at,ay]=(0,e.useState)(!1),[az,aA]=(0,e.useState)(""),[aB,aD]=(0,e.useState)([]),[aE,aF]=(0,e.useState)([]),[aG,aH]=(0,e.useState)([]),[aI,aJ]=(0,e.useState)(null),[aK,aL]=(0,e.useState)(!1),[aM,aN]=(0,e.useState)(null),[aO,aP]=(0,e.useState)(null),[aQ,aR]=(0,e.useState)(null),[aS,aT]=(0,e.useState)(!1),aU=(0,e.useRef)(null),[aV,aW]=(0,e.useState)(!1);(0,e.useEffect)(()=>{let a=aU.current;if(!a)return;let b=()=>aW(a.scrollTop>400);return a.addEventListener("scroll",b,{passive:!0}),()=>a.removeEventListener("scroll",b)},[f]);let aX=(0,e.useCallback)(()=>{aU.current?.scrollTo({top:0,behavior:"smooth"})},[]),{jobs:aY}=(0,J.usePromptJobs)(G?.id??null,{requireProjectId:!0,includeObjectiveJobs:!0,objectiveId:f}),aZ=(0,e.useMemo)(()=>aY.filter(a=>a.objectiveId===f).length,[aY,f]),a$=async a=>{Z(!0),_(null);try{await K(a)}catch(a){throw _(a instanceof Error?a.message:"Failed to save objective updates."),a}finally{Z(!1)}},a_=async()=>{if(!O||!M)return;let a=O.title.trim();if(!a)return void _("Objective statement is required.");let b={...M,title:a,updatedAt:new Date().toISOString()};await a$((0,an.upsertProjectObjective)(H,b)),Q(null)},a0=(0,e.useCallback)(async()=>{if(G?.id&&M?.id){ad(!0);try{let a=await fetch(`/api/projects/${G.id}/objectives/${M.id}/notes?limit=100`);if(a.ok){let b=await a.json();ab(b.notes??[])}}catch{}finally{ad(!1)}}},[G?.id,M?.id]);(0,e.useEffect)(()=>{a0()},[a0]);let a1=(0,e.useCallback)(async()=>{if(G?.id&&M?.id)try{let a=await fetch(`/api/projects/${G.id}/objectives/${M.id}/program`);if(a.ok){let b=await a.json();aN(b.program?.content??null),aP(b.program?.path??null)}}catch{}},[G?.id,M?.id]);(0,e.useEffect)(()=>{a1()},[a1]);let a2=(0,e.useCallback)(async()=>{if(G?.id&&M?.id&&null!==aQ){aT(!0);try{let a=await fetch(`/api/projects/${G.id}/objectives/${M.id}/program`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:aQ})});if(a.ok){let b=await a.json();aN(b.program?.content??null),aP(b.program?.path??null),aR(null)}}finally{aT(!1)}}},[G?.id,M?.id,aQ]);(0,e.useEffect)(()=>{"notes"===T&&a0()},[T,a0]),(0,e.useEffect)(()=>{if(!G?.id||!M?.id)return;let a=new Set;for(let[b,c]of Object.entries(aj)){let d=aa.find(a=>a.id===b);d&&d.body!==c&&a.add(b)}for(let[b,c]of Object.entries(al)){let d=aa.find(a=>a.id===b);d&&d.title!==c&&a.add(b)}if(0===a.size)return;let b=[];for(let c of a){let a={},d=aj[c],e=al[c],f=aa.find(a=>a.id===c);if(!f||(void 0!==d&&d!==f.body&&(a.body=d),void 0!==e&&e!==f.title&&e.trim()&&(a.title=e.trim()),0===Object.keys(a).length))continue;let g=window.setTimeout(async()=>{ar(a=>new Set(a).add(c));try{let b=await fetch(`/api/projects/${G.id}/objectives/${M.id}/notes/${c}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(b.ok){let a=await b.json();ab(b=>b.map(b=>b.id===c?a.note:b))}}catch{_("Failed to save note.")}finally{ar(a=>{let b=new Set(a);return b.delete(c),b})}},700);b.push(g)}return()=>{for(let a of b)window.clearTimeout(a)}},[aj,al,aa,G?.id,M?.id]);let a3=async()=>{if(G?.id&&M?.id){ay(!0);try{let a=await fetch(`/api/projects/${G.id}/objectives/${M.id}/notes`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:"Untitled",body:""})});if(a.ok){let b=await a.json();ab(a=>[b.note,...a]),ai(b.note.id)}}catch{_("Failed to create note.")}finally{ay(!1)}}},a4=async a=>{if(G?.id&&M?.id)try{let b=await fetch(`/api/projects/${G.id}/objectives/${M.id}/notes/${a}`,{method:"DELETE"});(b.ok||204===b.status)&&(ab(b=>b.filter(b=>b.id!==a)),ae===a&&ai(null))}catch{_("Failed to delete note.")}},a5=async()=>{!M||window.confirm(`Delete "${M.title}"?`)&&(await a$((0,an.removeProjectObjective)(H,M.id)),g?g():D.push(`/projects/${a}`))},a6=(0,e.useCallback)(async a=>{M&&M.threadId!==a&&await a$((0,an.upsertProjectObjective)(H,{...M,threadId:a,updatedAt:new Date().toISOString()}))},[M,a$,H]),a7=(0,e.useCallback)(async a=>{if(!G?.id||!M?.id)return _("Objective not found."),!1;_(null);try{let b=await fetch(`/api/projects/${G.id}/objectives/${M.id}/scheduled-tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...a,prompt:function(a,b){let c=b.trim();if(!c)return c;let d=`Objective label: ${a.key}`;return c.toLowerCase().includes(d.toLowerCase())?c:[d,`Write your output as an activity file at ~/.agx/projects/<project>/objectives/${a.key}/activities/<timestamp>-<slug>.md
|
|
18
|
+
- If validation fails, fix the errors immediately before doing anything else.`,"Scheduled tasks live in the shared scheduled-task list and are filtered by this objective label.","Your job is to help the team develop the strategy needed to reach the goal, including the right combination of objective notes, scheduled tasks, and tracker tickets.","Use the current session history to build on prior reasoning. Only reset and start from scratch when the user explicitly starts a new session.","Use this thread to pressure-test strategy, suggest better tactics, rewrite the objective when asked, propose the right operational cadence, and take concrete follow-up actions when the user wants them applied.","When suggesting edits, prefer editing the frontmatter file directly or using the notes API. When the user asks you to make a change, edit the file, validate, then confirm.","Local objective APIs:",`- PATCH ${p} with JSON fields such as {"title","teamId","key"} to update the objective itself.`,`- GET ${r} to list all notes for this objective. Returns {"notes":[...],"total","page","limit","hasMore"}.`,`- POST ${r} with {"title","body"} to create a new note.`,`- GET ${r}/{noteId} to read a single note.`,`- PATCH ${r}/{noteId} with {"title","body"} to update a note.`,`- DELETE ${r}/{noteId} to delete a note.`,`- GET ${q} to inspect the scheduled tasks already tracked for this objective.`,`- POST ${q} with {"name","prompt","cadence","agentId"} to create a scheduled task for this objective.`,`- GET ${u} to validate the objective file on disk. Returns {"valid":true} or {"valid":false,"errors":[...]}.`,"Tracker integrations:",`- Available tracker types: ${o.available.length>0?o.available.map(a=>`${a.displayName} (${a.type})`).join(", "):"none registered"}.`,`- Configured for this project: ${o.configured.length>0?o.configured.map(a=>{let b=o.defaultType===a.type;return`${a.displayName} (${a.type})${b?" — default":""}`}).join(", "):"none — ask the user to connect a tracker in project settings if they want ticket workflows"}.`,o.defaultType?`- Default tracker for ticket workflows: ${o.defaultType}. Prefer this tracker when creating or referencing tickets for this objective unless the user asks otherwise.`:o.configured.length>1?"- No default tracker has been selected; ask the user which connected tracker to use before creating tickets.":"",...o.configured.map(b=>`- GET /api/trackers/${b.type}/items?projectId=${a} to list ${b.displayName} items. Filter client-side by label "${f.key}" to find tickets tied to this objective.`)].filter(Boolean).join("\n\n")),m].filter(Boolean).join("\n\n"),A=await Z(b,d,w,y,e,g,h?[h]:x,c,z,n);!y&&A&&(G(A),E("detail"))},[null,aj,ay,aC,av,f,N,a,c,F,Z,i]),aE=(0,e.useMemo)(()=>av?au?.messages??[]:[],[av,au]),aF=(0,e.useMemo)(()=>av&&F?Object.entries(ad).filter(([,a])=>a.rootMessageId===F):[],[av,F,ad]),aG=(0,e.useCallback)(a=>{p(b=>{let c=Math.max(320,Math.min(1200,b-a));return(0,al.persistObjectiveChatPanelWidth)(c),c})},[]);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(ap,{onResize:aG}),(0,b.jsxs)("aside",{className:"relative flex h-full min-h-[420px] w-full flex-col overflow-hidden border-t border-[var(--border)] bg-[var(--overlay-panel)] xl:min-h-0 xl:w-[var(--objective-chat-panel-width)] xl:shrink-0 xl:self-stretch xl:border-l xl:border-t-0",style:{"--objective-chat-panel-width":`${o}px`},children:[(0,b.jsx)(aw,{message:P}),av?(0,b.jsx)("div",{className:"border-b border-[var(--border)] px-4 py-4",children:(0,b.jsxs)("button",{type:"button",onClick:()=>E("list"),"aria-label":"Back to sessions",className:"inline-flex min-w-0 items-center gap-2 text-left text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]",children:[(0,b.jsx)(g.ArrowLeft,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{className:"truncate",children:au?.title??"Loading session..."})]})}):(0,b.jsx)("div",{className:"border-b border-[var(--border)] px-4 py-4",children:(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:"Strategy Sessions"}),(0,b.jsx)("p",{className:"text-xs text-[var(--muted-foreground)]",children:"Start a new strategy conversation below, or open an earlier session to keep building on it."})]})}),(0,b.jsx)("div",{ref:T,className:`min-h-0 flex-1 overflow-y-auto pb-[calc(15rem+env(safe-area-inset-bottom))] ${av?"px-4 py-4":"px-0 py-0"}`,children:av?0===aE.length?(0,b.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 px-4 text-center text-[var(--muted-foreground)]",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-[var(--foreground)]",children:"Loading strategy session"}),(0,b.jsx)("p",{className:"max-w-sm text-xs",children:"The conversation will appear here once the session history is ready."})]}):(0,b.jsxs)("div",{className:"space-y-5",children:[aE.map(a=>{let c=a.participantId?ao.get(a.participantId):null,d=H===a.id;return(0,b.jsxs)("div",{"data-objective-message-id":a.id,className:`flex gap-3 rounded-2xl transition-colors ${d?"bg-[var(--status-in-progress-bg)] p-2 -m-2":""}`,children:["user"===a.role?(0,b.jsx)("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-[var(--overlay-panel-soft)] text-[var(--muted-foreground)]",children:(0,b.jsx)(r.User,{className:"h-4 w-4"})}):(0,b.jsx)("img",{src:(0,B.agentAvatarUrl)(a.participantId??"assistant",32,c?.color),alt:c?.name??"Agent",className:"h-8 w-8 shrink-0 rounded-full border border-[var(--border)] object-cover"}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[var(--foreground)]",children:"user"===a.role?"You":c?.name??"Agent"}),(0,b.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:new Date(a.timestamp).toLocaleString([],{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})})]}),(0,b.jsx)("div",{className:"mt-2 rounded-2xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] px-4 py-3 text-[15px] leading-relaxed text-[var(--foreground)]",children:"user"===a.role?(0,b.jsx)(z.Markdown,{content:(0,C.stripMarkers)(a.content),isUser:!0}):(0,b.jsx)(A.StreamingSegments,{content:(0,C.stripMarkers)(a.content)})})]})]},a.id)}),aF.map(([a])=>{let c=ao.get(a);return(0,b.jsxs)("div",{className:"flex items-center gap-3 text-sm text-[var(--muted-foreground)]",children:[(0,b.jsx)("img",{src:(0,B.agentAvatarUrl)(a,32,c?.color),alt:c?.name??"Agent",className:"h-8 w-8 shrink-0 rounded-full border border-[var(--border)] object-cover"}),(0,b.jsxs)("span",{children:[c?.name??"Agent"," is thinking..."]})]},`stream-${a}`)}),(0,b.jsx)("div",{ref:U})]}):0===as.length?(0,b.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 px-4 text-center text-[var(--muted-foreground)]",children:[(0,b.jsx)("p",{className:"text-sm font-medium text-[var(--foreground)]",children:"No strategy sessions yet"}),(0,b.jsx)("p",{className:"max-w-sm text-xs",children:"Use the composer below to start the first conversation about how this objective should be reached."})]}):(0,b.jsx)("div",{className:"divide-y divide-[var(--border)]",children:as.map(a=>{var c;let d=az.get(a.rootMessageId)??null;return(0,b.jsxs)("button",{type:"button",onClick:()=>{G(a.rootMessageId),E("detail")},className:"flex w-full items-start justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-[var(--overlay-panel-soft)]",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("p",{className:"truncate text-sm font-medium text-[var(--foreground)]",children:a.title}),(0,b.jsxs)("p",{className:"mt-1 text-[11px] text-[var(--muted-foreground)]",children:[1===(c=a.messageCount)?"1 message":`${c} messages`," · Last"," ",aq(a.updatedAt)]})]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[d?(0,b.jsx)("span",{className:"rounded-full border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-[var(--status-in-progress-text)]",children:"queued"===d?"Queued":"Working"}):null,(0,b.jsx)(h.ArrowRight,{className:"mt-0.5 h-4 w-4 text-[var(--muted-foreground)]"})]})]},a.rootMessageId)})})}),(0,b.jsx)(ah.JumpToLatestButton,{visible:av&&V&&aE.length>10,onClick:ag,direction:"bottom",offsetClassName:"bottom-[calc(15rem+env(safe-area-inset-bottom))]"}),(0,b.jsx)("div",{className:"absolute bottom-0 left-0 right-0 bg-[var(--overlay-panel)] p-3 pb-[calc(0.75rem+env(safe-area-inset-bottom))]",children:(0,b.jsx)(y.Composer,{onSend:aD,onStop:aC,participants:N,commands:[],projectId:a,projectSlug:c,loading:"ready"!==aA,activityStatus:aA,sendInterruptsBusy:!0,placeholder:av?`Continue strategy for "${f.title}"...`:`Start a new strategy session for "${f.title}"...`,initialPinnedParticipantId:N[0]?.id})})]})]})}function av({label:a}){return(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-[var(--muted-foreground)]",children:a})}function aw({message:a}){return a?(0,b.jsxs)("div",{className:"mt-3 flex items-center gap-2 rounded-2xl border border-rose-500/20 bg-rose-500/10 px-3 py-2 text-sm text-rose-100",children:[(0,b.jsx)(f.AlertTriangle,{className:"h-4 w-4"}),(0,b.jsx)("span",{children:a})]}):null}function ax({content:a,editable:c=!1,onChange:d,placeholder:e}){let f=a.trim().length>0;return c||f?(0,b.jsx)("div",{className:"overflow-hidden border-l-2 border-[var(--border)]/60 pl-4 transition-all focus-within:border-indigo-500/60",children:c||f?(0,b.jsx)(D.default,{content:a,editable:c,onChange:d,placeholder:e}):null}):null}function ay({onResize:a}){let{isTouchLayout:c}=(0,aj.useInputCapabilities)();return c?null:(0,b.jsx)(ai.ResizeHandle,{onResize:a,ariaLabel:"Resize objective list panel"})}function az({objective:a,activityCount:c,lastActivityAt:d,activeAgentIds:e,participants:f,isSelected:g,onSelect:h}){let i,j=(i=1===c?"1 activity":`${c} activities`,d?`${i} \xb7 Last ${aq(d)}`:`${i} \xb7 No activity yet`);return(0,b.jsx)("article",{className:"px-2",children:(0,b.jsxs)("button",{type:"button",onClick:h,"aria-label":`Open details for ${a.title}`,className:`group flex w-full items-center gap-3 rounded-xl px-2 py-2 text-left transition-colors ${g?"bg-[var(--primary)]/10 border border-[var(--primary)]/20":"border border-transparent hover:bg-[var(--secondary)]"}`,children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1 py-0.5",children:[(0,b.jsx)("div",{className:"flex min-w-0 items-center gap-2",children:(0,b.jsx)("span",{className:`rounded-full border px-1.5 py-0 text-[9px] font-semibold uppercase tracking-[0.12em] ${ao[a.status].chipClass}`,children:ao[a.status].label})}),(0,b.jsx)("p",{className:"mt-1 truncate text-sm font-medium text-[var(--foreground)]",children:a.title}),(0,b.jsx)("p",{className:"mt-0.5 text-[11px] text-[var(--muted-foreground)]",children:j})]}),e&&e.length>0&&(0,b.jsx)("span",{className:"inline-flex items-center -space-x-1 shrink-0",children:e.slice(0,3).map(a=>{let c=f?.find(b=>b.id===a);return(0,b.jsxs)("span",{className:"relative inline-block",title:c?.name??a,children:[(0,b.jsx)("img",{src:(0,B.agentAvatarUrl)(a,16,c?.color??void 0),alt:c?.name??a,className:"h-3 w-3 rounded-full ring-[1.5px] ring-[var(--background)]"}),(0,b.jsx)("span",{className:"absolute -bottom-px -right-px h-1.5 w-1.5 rounded-full bg-green-500 ring-[1px] ring-[var(--background)]"})]},a)})})]})})}function aA({projectSlug:a,initialObjectiveId:c}){let{isLoading:d,project:f,workspace:g,teams:h,persistWorkspace:i}=as(a),j=g.objectives,[k,l]=(0,e.useState)(c??null),[m,n]=(0,e.useState)(()=>(0,al.loadObjectiveListPanelWidth)()||320),[p,q]=(0,e.useState)(null),[r,s]=(0,e.useState)(!1),[t,u]=(0,e.useState)(null),[v,w]=(0,e.useState)(new Map),[x,y]=(0,e.useState)([]);(0,e.useEffect)(()=>{!k&&j.length>0&&l(j[0].id)},[k,j]),(0,e.useEffect)(()=>{k&&j.length>0&&!j.some(a=>a.id===k)&&l(j[0]?.id??null)},[k,j]),(0,e.useEffect)(()=>{let a=!1;return async function(){try{let b=await fetch("/api/participants");b.ok&&!a&&y(await b.json())}catch{}}(),()=>{a=!0}},[]),(0,e.useEffect)(()=>{let a=new Map;for(let b of j)b.threadId&&a.set(b.threadId,b.id);if(0===a.size)return;let b=!1;async function c(){try{let c=Array.from(a.keys()).join(","),d=await fetch(`/api/chat-runs/active-agents?threadIds=${encodeURIComponent(c)}`);if(!d.ok||b)return;let e=await d.json(),f=new Map;for(let[b,c]of Object.entries(e.activeAgents??{})){let d=a.get(b);d&&Array.isArray(c)&&c.length>0&&f.set(d,c)}b||w(f)}catch{}}c();let d=setInterval(()=>void c(),5e3);return()=>{b=!0,clearInterval(d)}},[j]);let z=async()=>{if(!p)return;let a=p.title.trim();if(!a)return void u("Objective statement is required.");let b=p.teamId.trim();if(!b)return void u("Team is required.");let c=new Date().toISOString(),d=(0,an.createProjectObjective)({title:a,teamId:b,key:(0,an.generateProjectObjectiveKey)(a,g.objectives),summary:p.summary,now:c});s(!0),u(null);try{await i((0,an.upsertProjectObjective)(g,d));try{await fetch(`/api/projects/${f?.id}/objectives/${d.id}/worker`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}q(null),l(d.id)}catch(a){u(a instanceof Error?a.message:"Failed to save objective updates.")}finally{s(!1)}},A=(0,e.useCallback)(a=>{n(b=>{let c=Math.max(240,Math.min(480,b+a));return(0,al.persistObjectiveListPanelWidth)(c),c})},[]);return d&&!f?(0,b.jsx)(av,{label:"Loading objectives..."}):f?(0,b.jsxs)("div",{className:"flex h-full min-h-0 overflow-hidden bg-[var(--background)] text-[var(--foreground)]",children:[(0,b.jsxs)("div",{className:`flex-shrink-0 flex-col border-r border-[var(--border)] bg-[var(--background)] max-md:!w-full max-md:border-r-0 ${k?"hidden md:flex":"flex"}`,style:{width:m},children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-4 py-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.12em] text-[var(--muted-foreground)]",children:"Objectives"}),(0,b.jsx)("p",{className:"mt-0.5 text-[11px] text-[var(--muted-foreground)]",children:0===j.length?"None yet":`${j.length} total`})]}),(0,b.jsx)("button",{type:"button",onClick:()=>q(ar()),className:"inline-flex h-7 w-7 items-center justify-center rounded-lg text-[var(--muted-foreground)] transition-colors hover:bg-[var(--secondary)] hover:text-[var(--foreground)]","aria-label":"New objective",children:(0,b.jsx)(o.Plus,{className:"h-4 w-4"})})]}),(0,b.jsx)(aw,{message:t}),(0,b.jsx)("div",{className:"flex-1 overflow-y-auto py-1",children:0===j.length?(0,b.jsxs)("div",{className:"px-4 py-8 text-center",children:[(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:"No objectives yet."}),(0,b.jsx)("button",{type:"button",onClick:()=>q(ar()),className:"mt-2 text-sm text-[var(--primary)] hover:underline",children:"Create one"})]}):(0,b.jsx)("div",{className:"space-y-0.5",children:j.map(a=>{let c=(0,an.buildObjectiveTimelineActivities)({objective:a,workspace:g});return(0,b.jsx)(az,{objective:a,activityCount:c.length,lastActivityAt:c[0]?.createdAt??null,activeAgentIds:v.get(a.id),participants:x,isSelected:k===a.id,onSelect:()=>l(a.id)},a.id)})})})]}),(0,b.jsx)(ay,{onResize:A}),(0,b.jsx)("div",{className:`flex-1 min-w-0 min-h-0 overflow-hidden ${k?"":"max-md:hidden"}`,children:k?(0,b.jsx)(aB,{projectSlug:a,objectiveId:k,onObjectiveDeleted:()=>l(null),onBack:()=>l(null)}):(0,b.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-[var(--muted-foreground)]",children:0===j.length?"Create an objective to get started.":"Select an objective from the list."})}),p?(0,b.jsx)(aD,{mode:"create",draft:p,teams:h,isSaving:r,onChange:q,onClose:()=>q(null),onSave:()=>void z()}):null]}):(0,b.jsx)(av,{label:"Project not found."})}function aB({projectSlug:a,objectiveId:f,onObjectiveDeleted:h,onBack:i}){var r;let v,w,x,y,A,B,C,D,F,G=(0,d.useRouter)(),{isLoading:H,project:I,workspace:K,teams:L,persistWorkspace:M,refetchProject:N}=as(a),O=(0,e.useMemo)(()=>K.objectives.find(a=>a.id===f)??null,[f,K.objectives]),Q=O?(r=O.teamId,L.find(a=>a.id===r)?.name??null):null,[R,S]=(0,e.useState)(null),[T,U]=(0,e.useState)(null),[V,W]=(0,e.useState)("activity"),[Y,Z]=(0,e.useState)(0),[$,_]=(0,e.useState)(!1),[aa,ab]=(0,e.useState)(null),[ac,ad]=(0,e.useState)([]),[ae,ai]=(0,e.useState)(!1),[aj,ak]=(0,e.useState)(null),[al,am]=(0,e.useState)({}),[ap,ar]=(0,e.useState)({}),[at,ay]=(0,e.useState)(new Set),[az,aA]=(0,e.useState)(!1),[aB,aD]=(0,e.useState)(""),[aE,aF]=(0,e.useState)([]),[aG,aH]=(0,e.useState)([]),[aI,aJ]=(0,e.useState)([]),[aK,aL]=(0,e.useState)(null),[aM,aN]=(0,e.useState)(!1),[aO,aP]=(0,e.useState)(null),[aQ,aR]=(0,e.useState)(null),[aS,aT]=(0,e.useState)(null),[aU,aV]=(0,e.useState)(!1),aW=(0,e.useRef)(null),[aX,aY]=(0,e.useState)(!1);(0,e.useEffect)(()=>{let a=aW.current;if(!a)return;let b=()=>aY(a.scrollTop>400);return a.addEventListener("scroll",b,{passive:!0}),()=>a.removeEventListener("scroll",b)},[f]);let aZ=(0,e.useCallback)(()=>{aW.current?.scrollTo({top:0,behavior:"smooth"})},[]),{jobs:a$}=(0,J.usePromptJobs)(I?.id??null,{requireProjectId:!0,includeObjectiveJobs:!0,objectiveId:f}),a_=(0,e.useMemo)(()=>a$.filter(a=>a.objectiveId===f).length,[a$,f]),a0=async a=>{_(!0),ab(null);try{await M(a)}catch(a){throw ab(a instanceof Error?a.message:"Failed to save objective updates."),a}finally{_(!1)}},a1=async()=>{if(!R||!O)return;let a=R.title.trim();if(!a)return void ab("Objective statement is required.");let b={...O,title:a,updatedAt:new Date().toISOString()};await a0((0,an.upsertProjectObjective)(K,b)),S(null)},a2=(0,e.useCallback)(async()=>{if(I?.id&&O?.id){ai(!0);try{let a=await fetch(`/api/projects/${I.id}/objectives/${O.id}/notes?limit=100`);if(a.ok){let b=await a.json();ad(b.notes??[])}}catch{}finally{ai(!1)}}},[I?.id,O?.id]);(0,e.useEffect)(()=>{a2()},[a2]);let a3=(0,e.useCallback)(async()=>{if(I?.id&&O?.id)try{let a=await fetch(`/api/projects/${I.id}/objectives/${O.id}/program`);if(a.ok){let b=await a.json();aP(b.program?.content??null),aR(b.program?.path??null)}}catch{}},[I?.id,O?.id]);(0,e.useEffect)(()=>{a3()},[a3]);let a4=(0,e.useCallback)(async()=>{if(I?.id&&O?.id&&null!==aS){aV(!0);try{let a=await fetch(`/api/projects/${I.id}/objectives/${O.id}/program`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:aS})});if(a.ok){let b=await a.json();aP(b.program?.content??null),aR(b.program?.path??null),aT(null)}}finally{aV(!1)}}},[I?.id,O?.id,aS]);(0,e.useEffect)(()=>{"notes"===V&&a2()},[V,a2]),(0,e.useEffect)(()=>{if(!I?.id||!O?.id)return;let a=new Set;for(let[b,c]of Object.entries(al)){let d=ac.find(a=>a.id===b);d&&d.body!==c&&a.add(b)}for(let[b,c]of Object.entries(ap)){let d=ac.find(a=>a.id===b);d&&d.title!==c&&a.add(b)}if(0===a.size)return;let b=[];for(let c of a){let a={},d=al[c],e=ap[c],f=ac.find(a=>a.id===c);if(!f||(void 0!==d&&d!==f.body&&(a.body=d),void 0!==e&&e!==f.title&&e.trim()&&(a.title=e.trim()),0===Object.keys(a).length))continue;let g=window.setTimeout(async()=>{ay(a=>new Set(a).add(c));try{let b=await fetch(`/api/projects/${I.id}/objectives/${O.id}/notes/${c}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(b.ok){let a=await b.json();ad(b=>b.map(b=>b.id===c?a.note:b))}}catch{ab("Failed to save note.")}finally{ay(a=>{let b=new Set(a);return b.delete(c),b})}},700);b.push(g)}return()=>{for(let a of b)window.clearTimeout(a)}},[al,ap,ac,I?.id,O?.id]);let a5=async()=>{if(I?.id&&O?.id){aA(!0);try{let a=await fetch(`/api/projects/${I.id}/objectives/${O.id}/notes`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:"Untitled",body:""})});if(a.ok){let b=await a.json();ad(a=>[b.note,...a]),ak(b.note.id)}}catch{ab("Failed to create note.")}finally{aA(!1)}}},a6=async a=>{if(I?.id&&O?.id)try{let b=await fetch(`/api/projects/${I.id}/objectives/${O.id}/notes/${a}`,{method:"DELETE"});(b.ok||204===b.status)&&(ad(b=>b.filter(b=>b.id!==a)),aj===a&&ak(null))}catch{ab("Failed to delete note.")}},a7=async()=>{!O||window.confirm(`Delete "${O.title}"?`)&&(await a0((0,an.removeProjectObjective)(K,O.id)),h?h():G.push(`/projects/${a}`))},a8=(0,e.useCallback)(async a=>{O&&O.threadId!==a&&await a0((0,an.upsertProjectObjective)(K,{...O,threadId:a,updatedAt:new Date().toISOString()}))},[O,a0,K]),a9=(0,e.useCallback)(async a=>{if(!I?.id||!O?.id)return ab("Objective not found."),!1;ab(null);try{let b=await fetch(`/api/projects/${I.id}/objectives/${O.id}/scheduled-tasks`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...a,prompt:function(a,b){let c=b.trim();if(!c)return c;let d=`Objective label: ${a.key}`;return c.toLowerCase().includes(d.toLowerCase())?c:[d,`Write your output as an activity file at ~/.agx/projects/<project>/objectives/${a.key}/activities/<timestamp>-<slug>.md
|
|
19
19
|
The file must have YAML frontmatter with: id (unique), source (your task ID), objectiveLabel: "${a.key}", createdAt (ISO), type (one of: metric-check, status-update, milestone, note).
|
|
20
|
-
The markdown body below the frontmatter contains your output.`,c].join("\n\n")}(M,a.prompt)})}),c=await b.json().catch(()=>({}));if(!b.ok)throw Error(c.error||"Failed to create scheduled task.");return await L(),!0}catch(a){return _(a instanceof Error?a.message:"Failed to create scheduled task."),!1}},[M,G?.id,L]),a8=(0,e.useCallback)(async()=>{if(!G?.id||!M?.id)return _("Objective not found."),!1;if(!M.teamId)return _("Assign a team to this objective before creating a worker."),!1;_(null);try{let a=await fetch(`/api/projects/${G.id}/objectives/${M.id}/worker`,{method:"PUT"}),b=await a.json().catch(()=>({}));if(!a.ok)throw Error(b.error||"Failed to trigger objective worker.");return await L(),!0}catch(a){return _(a instanceof Error?a.message:"Failed to trigger objective worker."),!1}},[M,G?.id,L]);return((0,e.useEffect)(()=>{if(!G?.id||!M?.id||!M?.key){aD([]),aF([]),aH([]);return}let a=G.id,b=M.key,c=!1;return async function(){try{let d=await fetch(`/api/trackers/connections?projectId=${encodeURIComponent(a)}`);if(!d.ok){c||(aD([]),aF([]),aH([]));return}let e=await d.json();if(c)return;let f=Array.isArray(e.available)?e.available:[],g=(e.connections??[]).map(a=>({type:a.type,displayName:f.find(b=>b.type===a.type)?.displayName??a.type,connected:!1!==a.connected})),h="string"==typeof e.defaultTracker&&e.defaultTracker?e.defaultTracker:null;aH(f),aF(g),aJ(h);let i=g.filter(a=>a.connected),j=h&&i.some(a=>a.type===h)?i.filter(a=>a.type===h):i;if(0===j.length)return void aD([]);let k=b.trim().toLowerCase(),l=await Promise.all(j.map(async b=>{try{let c=await fetch(`/api/trackers/${encodeURIComponent(b.type)}/items?projectId=${encodeURIComponent(a)}&limit=500`);if(!c.ok)return[];let d=await c.json();return(Array.isArray(d.items)?d.items:[]).filter(a=>(a.labels??[]).some(a=>a.trim().toLowerCase()===k)).map(a=>({id:a.id,trackerType:a.trackerType??b.type,identifier:a.identifier,title:a.title,url:a.url??null,status:a.status,assignee:a.assignee?.name??null,updatedAt:a.updatedAt,labels:a.labels}))}catch{return[]}}));if(c)return;aD(l.flat())}catch(a){if(c)return;console.warn("Failed to load objective tracker resources",a),aD([]),aF([]),aH([])}}(),()=>{c=!0}},[M?.id,M?.key,G?.id]),F&&!G)?(0,b.jsx)(av,{label:"Loading objective..."}):G?M?(0,b.jsx)("div",{className:"flex h-full min-h-0 flex-col bg-[radial-gradient(circle_at_top_left,rgba(59,130,246,0.1),transparent_28%),var(--background)] text-[var(--foreground)]",children:(0,b.jsx)("div",{className:"flex-1 min-h-0 overflow-hidden",children:(0,b.jsxs)("div",{className:"flex h-full min-h-0 flex-col xl:flex-row",children:[(0,b.jsxs)("div",{className:"relative min-h-0 flex-1 flex flex-col",children:[(0,b.jsx)("div",{ref:aU,className:"min-h-0 flex-1 overflow-y-auto",children:(0,b.jsxs)("div",{className:"max-w-5xl mx-auto pt-16 px-8 pb-20",children:[(0,b.jsx)(aw,{message:$}),(0,b.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,b.jsx)("span",{className:"rounded-full border border-[var(--tone-neutral-border)] bg-[var(--tone-neutral-bg)] px-2.5 py-0.5 text-[10px] font-mono uppercase tracking-wider text-[var(--tone-neutral)]",children:M.key}),(0,b.jsx)("span",{className:`rounded-full border px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.18em] ${ao[M.status].chipClass}`,children:ao[M.status].label})]}),(0,b.jsx)("div",{className:"mb-6",children:O?(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("input",{autoFocus:!0,value:O.title,onChange:a=>Q({...O,title:a.target.value}),onKeyDown:a=>{"Enter"===a.key&&a_(),"Escape"===a.key&&Q(null)},className:"flex-1 border-b-2 border-[var(--primary)] bg-transparent px-0 py-1 text-[28px] font-semibold leading-tight text-[var(--foreground)] outline-none",placeholder:"Objective statement"}),(0,b.jsx)("button",{type:"button",onClick:()=>void a_(),disabled:Y,className:"rounded-md p-1.5 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)]","aria-label":"Save objective",children:(0,b.jsx)(k.Check,{size:18})}),(0,b.jsx)("button",{type:"button",onClick:()=>Q(null),className:"rounded-md p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]","aria-label":"Cancel editing",children:(0,b.jsx)(u.X,{size:18})})]}):(0,b.jsxs)("button",{type:"button","aria-label":`Edit objective ${M.title}`,className:"flex items-center gap-3 group cursor-pointer text-left",onClick:()=>Q({id:M.id,title:M.title,teamId:M.teamId,summary:M.summary}),children:[(0,b.jsx)("h1",{className:"text-[28px] leading-tight font-semibold text-[var(--foreground)]",children:M.title}),(0,b.jsx)(n.Pencil,{size:16,className:"shrink-0 text-[var(--muted-foreground)] opacity-0 transition-opacity group-hover:opacity-100"})]})}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-x-6 gap-y-3 mb-10",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("span",{className:"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:[(0,b.jsx)(s.Users,{size:12})," Team"]}),(0,b.jsx)("span",{className:"text-[var(--app-shell-soft-text)]",children:"·"}),R?(0,b.jsx)("div",{className:"min-w-[180px]",children:(0,b.jsx)(E.default,{options:I.map(a=>({id:a.id,label:a.name})),value:R.teamId,onChange:a=>{S({teamId:a});let b=a.trim();b&&M&&(a$((0,an.upsertProjectObjective)(H,{...M,teamId:b,updatedAt:new Date().toISOString()})),S(null))},placeholder:"Select a team…"})}):(0,b.jsxs)("button",{type:"button","aria-label":`Edit team for ${M.title}`,onClick:()=>S({teamId:M.teamId}),className:"group -mx-1.5 -my-0.5 flex items-center gap-2 rounded px-1.5 py-0.5 transition-colors hover:bg-[var(--muted)]",children:[(0,b.jsx)("div",{className:"w-5 h-5 rounded-full bg-blue-500/20 text-blue-400 flex items-center justify-center text-[10px] font-bold border border-blue-500/30",children:(N??"?").charAt(0).toUpperCase()}),(0,b.jsx)("span",{className:"text-sm text-[var(--foreground)] transition-colors group-hover:text-[var(--primary)]",children:N??"Not assigned"})]})]}),G.id&&M.id?(0,b.jsx)(af,{projectId:G.id,objectiveId:M.id,objectiveKey:M.key,metadata:G.metadata,currentProgress:M.progress,currentStatus:M.status,objectiveUpdatedAt:M.updatedAt}):null]}),(0,b.jsxs)("div",{className:"mb-6 rounded-xl border border-[var(--border)] bg-[var(--card-bg)]",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-4 py-2.5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(m.FileText,{size:14,className:"text-[var(--muted-foreground)]"}),(0,b.jsx)("span",{className:"text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Program"}),aO?(0,b.jsx)("span",{className:"font-mono text-[10px] text-[var(--muted-foreground)] opacity-70",children:aO.replace(/^.*\/\.agx\//,"~/.agx/")}):null]}),null===aQ?(0,b.jsx)("button",{type:"button",onClick:()=>aR(aM??""),className:"rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]","aria-label":"Edit program",children:(0,b.jsx)(n.Pencil,{size:14})}):(0,b.jsxs)("div",{className:"flex items-center gap-1",children:[(0,b.jsx)("button",{type:"button",onClick:()=>void a2(),disabled:aS,className:"rounded-md p-1 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)] disabled:opacity-50","aria-label":"Save program",children:(0,b.jsx)(k.Check,{size:14})}),(0,b.jsx)("button",{type:"button",onClick:()=>aR(null),className:"rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]","aria-label":"Cancel editing",children:(0,b.jsx)(u.X,{size:14})})]})]}),(0,b.jsx)("div",{className:"px-4 py-3",children:null!==aQ?(0,b.jsx)("textarea",{autoFocus:!0,value:aQ,onChange:a=>aR(a.target.value),rows:8,placeholder:"Goal: why this exists\n\nDefinition of better: the metric or signal that says we're done\n\nBlast radius: paths/systems in scope, what's off-limits\n\nNotes: things we've learned",className:"w-full resize-y rounded-md border border-[var(--border)] bg-[var(--background)] px-3 py-2 font-mono text-xs text-[var(--foreground)] outline-none focus:border-[var(--primary)]"}):aM&&aM.trim().length>0?(0,b.jsx)("div",{className:"prose prose-sm max-w-none text-sm text-[var(--foreground)]",children:(0,b.jsx)(z.Markdown,{content:aM})}):(0,b.jsxs)("p",{className:"text-sm text-[var(--muted-foreground)]",children:["No program yet. Define what ",(0,b.jsx)("em",{children:"better"})," looks like for this objective — the metric, the scope, any constraints. Agents read this before every run, and will ask for it in chat if it's missing."]})})]}),(0,b.jsx)("div",{className:"mb-6",children:(0,b.jsxs)("button",{type:"button",onClick:async()=>{aL(!0),await a8(),aL(!1)},disabled:aK,className:"inline-flex items-center gap-2 rounded-xl border border-[var(--status-completed-border)] bg-[var(--status-completed-bg)] px-3 py-2 text-sm text-[var(--status-completed-text)] transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",children:[(0,b.jsx)(t.Sparkles,{className:"h-4 w-4"}),aK?"Working...":"Work on objective"]})}),(0,b.jsx)("div",{className:"mb-8 border-b border-[var(--border)]",children:(0,b.jsx)("nav",{className:"flex gap-1 -mb-px","aria-label":"Objective sections",children:[{id:"activity",label:"Activity",icon:l.Clock},{id:"notes",label:"Notes",icon:m.FileText},{id:"tasks",label:"Tasks",icon:a=>{let c=aE.filter(a=>a.connected),d=(aI&&c.some(a=>a.type===aI)?aI:c[0]?.type)??"tracker";return(0,b.jsx)(ag.TrackerIcon,{trackerType:d,className:"h-3.5 w-3.5"})}},{id:"scheduled-tasks",label:"Scheduled Jobs",icon:j}].map(a=>{let c,d;return(0,b.jsxs)("button",{type:"button",onClick:()=>U(a.id),className:`flex items-center gap-2 px-3 py-2.5 text-sm font-medium border-b-2 transition-colors ${T===a.id?"border-[var(--primary)] text-[var(--foreground)]":"border-transparent text-[var(--muted-foreground)] hover:border-[var(--border)] hover:text-[var(--foreground)]"}`,children:[(0,b.jsx)(a.icon,{size:14}),a.label,"activity"===a.id&&V>0&&(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:V}),"notes"===a.id&&aa.length>0&&(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:aa.length}),"tasks"===a.id&&(c=["done","canceled","cancelled","completed","duplicate"],(d=aB.filter((a,b,d)=>d.findIndex(b=>b.id===a.id)===b&&!c.includes(a.status.toLowerCase()))).length>0?(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:d.length}):null),"scheduled-tasks"===a.id&&aZ>0&&(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:aZ})]},a.id)})})}),(0,b.jsxs)("div",{className:"space-y-10",children:["notes"===T&&(0,b.jsxs)("section",{className:"space-y-4",children:[(0,b.jsxs)("div",{className:"flex gap-2 items-center",children:[(0,b.jsxs)("div",{className:"relative flex-1",children:[(0,b.jsx)(p.Search,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{type:"text",value:az,onChange:a=>aA(a.target.value),placeholder:"Search notes...",className:"w-full rounded-md border border-[var(--border)] bg-[var(--input)] py-1.5 pl-8 pr-3 text-sm text-[var(--foreground)] placeholder:text-[var(--app-shell-soft-text)] focus:border-[var(--primary)] focus:outline-none"})]}),(0,b.jsxs)("button",{type:"button",onClick:a3,disabled:at,className:"flex items-center gap-1.5 rounded-md border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-3 py-1.5 text-sm font-medium text-[var(--status-in-progress-text)] transition-opacity hover:opacity-90 disabled:opacity-50",children:[(0,b.jsx)(o.Plus,{size:14}),"New note"]})]}),ac?(0,b.jsx)("p",{className:"py-4 text-sm text-[var(--muted-foreground)]",children:"Loading notes..."}):0===aa.length?(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)] py-4",children:"No notes yet. Add one above."}):0===(r=(i=az.toLowerCase())?aa.filter(a=>a.title.toLowerCase().includes(i)||a.body.toLowerCase().includes(i)):aa).length?(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)] py-4",children:"No notes match your search."}):(0,b.jsx)("div",{className:"columns-1 gap-3 sm:columns-2 lg:columns-3",style:{columnFill:"balance"},children:r.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>ai(a.id),className:"mb-3 block w-full break-inside-avoid overflow-hidden rounded-lg border border-[var(--border)] bg-[var(--overlay-panel-muted)] text-left transition-shadow hover:shadow-md",children:[(0,b.jsx)("div",{className:"px-3 pt-3 pb-1",children:(0,b.jsx)("h4",{className:"text-sm font-medium text-[var(--foreground)] leading-snug",children:a.title})}),a.body.trim()&&(0,b.jsx)("div",{className:"px-3 pb-2 text-xs text-[var(--muted-foreground)] line-clamp-4",children:(0,b.jsx)(z.Markdown,{content:a.body})}),(0,b.jsx)("div",{className:"flex items-center justify-between px-3 pb-2",children:(0,b.jsx)("span",{className:"text-[10px] text-[var(--muted-foreground)]",children:new Date(a.updatedAt).toLocaleDateString()})})]},a.id))}),ae&&(()=>{let a=aa.find(a=>a.id===ae);if(!a)return null;let c=aj[a.id]??a.body,d=al[a.id]??a.title,e=ap.has(a.id);return(0,b.jsx)("div",{className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 pt-[5vh]",onClick:a=>{a.target===a.currentTarget&&ai(null)},children:(0,b.jsxs)("div",{className:"mx-6 w-full max-w-7xl rounded-xl border border-[var(--border)] bg-[var(--background)] shadow-xl",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[(0,b.jsx)("input",{type:"text",autoFocus:!0,value:d,onFocus:a=>{"Untitled"===d&&a.target.select()},onChange:b=>am(c=>({...c,[a.id]:b.target.value})),className:"flex-1 bg-transparent text-base font-semibold text-[var(--foreground)] focus:outline-none"}),(0,b.jsxs)("div",{className:"flex items-center gap-2 ml-3",children:[(0,b.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:e?"Saving...":new Date(a.updatedAt).toLocaleDateString()}),(0,b.jsx)("button",{type:"button",onClick:()=>a4(a.id),className:"p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--destructive)]",children:(0,b.jsx)(q.Trash2,{size:14})}),(0,b.jsx)("button",{type:"button",onClick:()=>ai(null),className:"p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:(0,b.jsx)(u.X,{size:14})})]})]}),(0,b.jsx)("div",{className:"max-h-[75vh] overflow-y-auto px-5 py-4",children:(0,b.jsx)(ax,{content:c,editable:!0,onChange:b=>ak(c=>({...c,[a.id]:b})),placeholder:"Write your note..."})})]})})})()]}),"activity"===T&&G.id&&M.id&&(0,b.jsx)(X,{projectId:G.id,objectiveId:M.id,onTotalChange:W}),"tasks"===T&&(v=aB.filter((a,b,c)=>c.findIndex(b=>b.id===a.id)===b),w=["done","canceled","cancelled","completed","duplicate"],x=v.filter(a=>!w.includes(a.status.toLowerCase())),y=v.filter(a=>w.includes(a.status.toLowerCase())).slice(-5),A=aE.filter(a=>a.connected),C=0===(B=aI&&A.some(a=>a.type===aI)?A.filter(a=>a.type===aI):A).length?null:B.map(a=>a.displayName).join(", "),(0,b.jsxs)("section",{children:[(0,b.jsx)("div",{className:"flex flex-wrap items-start justify-between gap-3 mb-4",children:(0,b.jsxs)("p",{className:"text-sm text-[var(--muted-foreground)]",children:["Tickets tracked by the objective label"," ",(0,b.jsx)("code",{className:"rounded bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[11px] text-[var(--foreground)]",children:M.key}),C?(0,b.jsxs)(b.Fragment,{children:[" across ",C,"."]}):"."]})}),0===B.length?(0,b.jsx)(aC,{label:0===aG.length?"No tracker integrations registered.":`Connect a tracker (${aG.map(a=>a.displayName).join(", ")}) to create and track tickets for this objective.`}):0===v.length?(0,b.jsx)(aC,{label:`No tracker tickets with label ${M.key} yet.`}):(0,b.jsxs)(b.Fragment,{children:[x.length>0&&(0,b.jsx)("div",{className:"space-y-3",children:x.map(c=>(0,b.jsxs)("div",{className:"rounded-xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] p-4",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:[(0,b.jsx)(ag.TrackerIcon,{trackerType:c.trackerType,className:"h-3 w-3"}),(0,b.jsx)("span",{children:c.identifier})]}),(0,b.jsx)("a",{href:c.url??`/projects/${a}/tracking/${c.trackerType}?issue=${c.id}`,target:c.url?"_blank":void 0,rel:c.url?"noreferrer":void 0,className:"mt-1 block text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]",children:c.title})]}),(0,b.jsx)("span",{className:"rounded-full border border-[var(--tone-neutral-border)] px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-[var(--tone-neutral)]",children:c.status})]}),(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2 text-[11px] text-[var(--muted-foreground)]",children:[(0,b.jsxs)("span",{children:["Updated ",aq(c.updatedAt)]}),(0,b.jsx)("span",{children:c.assignee?`Assigned to ${c.assignee}`:"Unassigned"})]})]},c.id))}),y.length>0&&(0,b.jsxs)("div",{className:x.length>0?"mt-6":"",children:[(0,b.jsx)("p",{className:"text-[11px] font-medium uppercase tracking-[0.18em] text-[var(--muted-foreground)] mb-2",children:"Completed"}),(0,b.jsx)("div",{className:"space-y-0.5",children:y.map(c=>(0,b.jsxs)("a",{href:c.url??`/projects/${a}/tracking/${c.trackerType}?issue=${c.id}`,target:c.url?"_blank":void 0,rel:c.url?"noreferrer":void 0,className:"group flex items-center gap-3 rounded-md px-2 py-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]",children:[(0,b.jsx)(ag.TrackerIcon,{trackerType:c.trackerType,className:"h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-[11px] font-mono shrink-0",children:c.identifier}),(0,b.jsx)("span",{className:"text-[12px] truncate",children:c.title}),(0,b.jsx)("span",{className:"ml-auto shrink-0 text-[10px] text-[var(--app-shell-soft-text)] group-hover:text-[var(--muted-foreground)]",children:c.status})]},c.id))})]})]})]})),"scheduled-tasks"===T&&(0,b.jsx)("section",{children:(0,b.jsx)(P,{projectId:G.id,objectiveId:M.id,objectiveKey:M.key,createDefaults:{name:`Work on ${M.title}`},onCreateTask:a7})}),(0,b.jsxs)("section",{className:"pt-10",children:[(0,b.jsx)("div",{className:"mb-4",children:(0,b.jsx)("h2",{className:"text-sm font-semibold text-[var(--destructive)]",children:"Danger Zone"})}),(0,b.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-[var(--destructive-border)] bg-[var(--destructive-bg)] p-5",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-medium text-[var(--foreground)]",children:"Delete Objective"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[var(--muted-foreground)]",children:"Once you delete an objective, there is no going back."})]}),(0,b.jsxs)("button",{type:"button",onClick:()=>void a5(),"aria-label":`Delete objective ${M.title}`,className:"flex items-center gap-2 whitespace-nowrap rounded-md border border-[var(--destructive-border)] bg-[var(--destructive-bg)] px-3 py-1.5 text-sm font-medium text-[var(--destructive)] transition-opacity hover:opacity-90",children:[(0,b.jsx)(q.Trash2,{size:14})," Delete"]})]})]})]})]})}),(0,b.jsx)(ah.JumpToLatestButton,{visible:aV,direction:"top",onClick:aX})]}),(0,b.jsx)(au,{projectId:G.id,projectSlug:a,objective:M,teamName:N,trackerConnections:aE,availableTrackers:aG,defaultTrackerType:aI,onThreadLinked:a6,onObjectiveUpdated:L})]})})}):(0,b.jsx)("div",{className:"flex h-full items-center justify-center px-4 bg-[var(--background)]",children:(0,b.jsxs)("div",{className:"rounded-xl border border-[var(--border)] bg-[var(--card-bg)] p-8 text-center",children:[(0,b.jsx)("p",{className:"text-lg font-semibold text-[var(--foreground)]",children:"Objective not found"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[var(--muted-foreground)]",children:"It may have been deleted or the link is stale."}),(0,b.jsx)(c.default,{href:`/projects/${a}`,className:"mt-4 inline-flex items-center gap-2 rounded-md border border-[var(--border)] bg-[var(--card-bg)] px-3 py-1.5 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:"Back to objectives"})]})}):(0,b.jsx)(av,{label:"Project not found."})}function aC({label:a}){return(0,b.jsx)("div",{className:"flex items-center rounded-xl border border-dashed border-[var(--border)] bg-[var(--overlay-panel-muted)] p-6",children:(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:a})})}function aD({mode:a,draft:c,teams:d=[],isSaving:e,onChange:f,onClose:g,onSave:h}){return(0,b.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/45 p-4",children:(0,b.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"edit"===a?"Edit objective":"New objective",className:"w-full max-w-3xl overflow-hidden rounded-[32px] border border-[var(--border)] bg-[var(--overlay-panel-strong)] shadow-2xl",children:[(0,b.jsxs)("div",{className:"border-b border-[var(--border)] px-5 py-4",children:[(0,b.jsx)("h3",{className:"text-lg font-semibold text-[var(--foreground)]",children:"edit"===a?"Edit objective":"New objective"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[var(--muted-foreground)]",children:"edit"===a?"Update the tracking details for this objective.":"Keep the statement measurable and use notes only for context that matters."})]}),(0,b.jsxs)("div",{className:"space-y-4 px-5 py-5",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)(aE,{label:"Objective statement"}),(0,b.jsx)("input",{value:c.title,onChange:a=>f({...c,title:a.target.value}),className:"w-full rounded-2xl border border-[var(--border)] bg-[var(--input)] px-4 py-3 text-sm text-[var(--foreground)] outline-none transition-colors focus:border-[var(--primary)]",placeholder:"Get 50 qualified visitors daily"})]}),"create"===a?(0,b.jsxs)("div",{children:[(0,b.jsx)(aE,{label:"Team"}),(0,b.jsxs)("select",{value:c.teamId,onChange:a=>f({...c,teamId:a.target.value}),className:"w-full rounded-2xl border border-[var(--border)] bg-[var(--input)] px-3 py-3 text-sm text-[var(--foreground)] outline-none transition-colors focus:border-[var(--primary)]",children:[(0,b.jsx)("option",{value:"",children:"Select a team"}),d.map(a=>(0,b.jsx)("option",{value:a.id,children:a.name},a.id))]}),(0,b.jsx)("p",{className:"mt-2 text-xs text-[var(--muted-foreground)]",children:"Teams can only own one objective at a time."})]}):null]}),(0,b.jsxs)("div",{className:"flex items-center justify-end gap-2 border-t border-[var(--border)] px-5 py-4",children:[(0,b.jsx)("button",{type:"button",onClick:g,className:"rounded-xl border border-[var(--border)] px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:"Cancel"}),(0,b.jsx)("button",{type:"button",onClick:h,disabled:e,className:"rounded-xl border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-3 py-2 text-sm font-medium text-[var(--status-in-progress-text)] transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",children:e?"Saving...":"edit"===a?"Save objective":"Create objective"})]})]})})}function aE({label:a}){return(0,b.jsx)("label",{className:"mb-2 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:a})}a.s(["ProjectObjectivesOverview",()=>aA],739515)}];
|
|
20
|
+
The markdown body below the frontmatter contains your output.`,c].join("\n\n")}(O,a.prompt)})}),c=await b.json().catch(()=>({}));if(!b.ok)throw Error(c.error||"Failed to create scheduled task.");return await N(),!0}catch(a){return ab(a instanceof Error?a.message:"Failed to create scheduled task."),!1}},[O,I?.id,N]),ba=(0,e.useCallback)(async()=>{if(!I?.id||!O?.id)return ab("Objective not found."),!1;if(!O.teamId)return ab("Assign a team to this objective before creating a worker."),!1;ab(null);try{let a=await fetch(`/api/projects/${I.id}/objectives/${O.id}/worker`,{method:"PUT"}),b=await a.json().catch(()=>({}));if(!a.ok)throw Error(b.error||"Failed to trigger objective worker.");return await N(),!0}catch(a){return ab(a instanceof Error?a.message:"Failed to trigger objective worker."),!1}},[O,I?.id,N]);return((0,e.useEffect)(()=>{if(!I?.id||!O?.id||!O?.key){aF([]),aH([]),aJ([]);return}let a=I.id,b=O.key,c=!1;return async function(){try{let d=await fetch(`/api/trackers/connections?projectId=${encodeURIComponent(a)}`);if(!d.ok){c||(aF([]),aH([]),aJ([]));return}let e=await d.json();if(c)return;let f=Array.isArray(e.available)?e.available:[],g=(e.connections??[]).map(a=>({type:a.type,displayName:f.find(b=>b.type===a.type)?.displayName??a.type,connected:!1!==a.connected})),h="string"==typeof e.defaultTracker&&e.defaultTracker?e.defaultTracker:null;aJ(f),aH(g),aL(h);let i=g.filter(a=>a.connected),j=h&&i.some(a=>a.type===h)?i.filter(a=>a.type===h):i;if(0===j.length)return void aF([]);let k=b.trim().toLowerCase(),l=await Promise.all(j.map(async b=>{try{let c=await fetch(`/api/trackers/${encodeURIComponent(b.type)}/items?projectId=${encodeURIComponent(a)}&limit=500`);if(!c.ok)return[];let d=await c.json();return(Array.isArray(d.items)?d.items:[]).filter(a=>(a.labels??[]).some(a=>a.trim().toLowerCase()===k)).map(a=>({id:a.id,trackerType:a.trackerType??b.type,identifier:a.identifier,title:a.title,url:a.url??null,status:a.status,assignee:a.assignee?.name??null,updatedAt:a.updatedAt,labels:a.labels}))}catch{return[]}}));if(c)return;aF(l.flat())}catch(a){if(c)return;console.warn("Failed to load objective tracker resources",a),aF([]),aH([]),aJ([])}}(),()=>{c=!0}},[O?.id,O?.key,I?.id]),H&&!I)?(0,b.jsx)(av,{label:"Loading objective..."}):I?O?(0,b.jsx)("div",{className:"flex h-full min-h-0 flex-col bg-[radial-gradient(circle_at_top_left,rgba(59,130,246,0.1),transparent_28%),var(--background)] text-[var(--foreground)]",children:(0,b.jsx)("div",{className:"flex-1 min-h-0 overflow-hidden",children:(0,b.jsxs)("div",{className:"flex h-full min-h-0 flex-col xl:flex-row",children:[(0,b.jsxs)("div",{className:"relative min-h-0 flex-1 flex flex-col",children:[(0,b.jsx)("div",{ref:aW,className:"min-h-0 flex-1 overflow-y-auto",children:(0,b.jsxs)("div",{className:"max-w-5xl mx-auto pt-16 px-8 pb-20",children:[(0,b.jsx)(aw,{message:aa}),i?(0,b.jsxs)("button",{type:"button",onClick:i,className:"md:hidden mb-4 inline-flex items-center gap-1.5 rounded-md border border-[var(--border)] bg-[var(--card-bg)] px-2.5 py-1 text-xs text-[var(--muted-foreground)] transition-colors hover:bg-[var(--secondary)] hover:text-[var(--foreground)]",children:[(0,b.jsx)(g.ArrowLeft,{className:"h-3.5 w-3.5"}),"Back to objectives"]}):null,(0,b.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,b.jsx)("span",{className:"rounded-full border border-[var(--tone-neutral-border)] bg-[var(--tone-neutral-bg)] px-2.5 py-0.5 text-[10px] font-mono uppercase tracking-wider text-[var(--tone-neutral)]",children:O.key}),(0,b.jsx)("span",{className:`rounded-full border px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.18em] ${ao[O.status].chipClass}`,children:ao[O.status].label})]}),(0,b.jsx)("div",{className:"mb-6",children:R?(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("input",{autoFocus:!0,value:R.title,onChange:a=>S({...R,title:a.target.value}),onKeyDown:a=>{"Enter"===a.key&&a1(),"Escape"===a.key&&S(null)},className:"flex-1 border-b-2 border-[var(--primary)] bg-transparent px-0 py-1 text-[28px] font-semibold leading-tight text-[var(--foreground)] outline-none",placeholder:"Objective statement"}),(0,b.jsx)("button",{type:"button",onClick:()=>void a1(),disabled:$,className:"rounded-md p-1.5 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)]","aria-label":"Save objective",children:(0,b.jsx)(k.Check,{size:18})}),(0,b.jsx)("button",{type:"button",onClick:()=>S(null),className:"rounded-md p-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]","aria-label":"Cancel editing",children:(0,b.jsx)(u.X,{size:18})})]}):(0,b.jsxs)("button",{type:"button","aria-label":`Edit objective ${O.title}`,className:"flex items-center gap-3 group cursor-pointer text-left",onClick:()=>S({id:O.id,title:O.title,teamId:O.teamId,summary:O.summary}),children:[(0,b.jsx)("h1",{className:"text-[28px] leading-tight font-semibold text-[var(--foreground)]",children:O.title}),(0,b.jsx)(n.Pencil,{size:16,className:"shrink-0 text-[var(--muted-foreground)] opacity-0 transition-opacity group-hover:opacity-100"})]})}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-x-6 gap-y-3 mb-10",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("span",{className:"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:[(0,b.jsx)(s.Users,{size:12})," Team"]}),(0,b.jsx)("span",{className:"text-[var(--app-shell-soft-text)]",children:"·"}),T?(0,b.jsx)("div",{className:"min-w-[180px]",children:(0,b.jsx)(E.default,{options:L.map(a=>({id:a.id,label:a.name})),value:T.teamId,onChange:a=>{U({teamId:a});let b=a.trim();b&&O&&(a0((0,an.upsertProjectObjective)(K,{...O,teamId:b,updatedAt:new Date().toISOString()})),U(null))},placeholder:"Select a team…"})}):(0,b.jsxs)("button",{type:"button","aria-label":`Edit team for ${O.title}`,onClick:()=>U({teamId:O.teamId}),className:"group -mx-1.5 -my-0.5 flex items-center gap-2 rounded px-1.5 py-0.5 transition-colors hover:bg-[var(--muted)]",children:[(0,b.jsx)("div",{className:"w-5 h-5 rounded-full bg-blue-500/20 text-blue-400 flex items-center justify-center text-[10px] font-bold border border-blue-500/30",children:(Q??"?").charAt(0).toUpperCase()}),(0,b.jsx)("span",{className:"text-sm text-[var(--foreground)] transition-colors group-hover:text-[var(--primary)]",children:Q??"Not assigned"})]})]}),I.id&&O.id?(0,b.jsx)(af,{projectId:I.id,objectiveId:O.id,objectiveKey:O.key,metadata:I.metadata,currentProgress:O.progress,currentStatus:O.status,objectiveUpdatedAt:O.updatedAt}):null]}),(0,b.jsxs)("div",{className:"mb-6 rounded-xl border border-[var(--border)] bg-[var(--card-bg)]",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-4 py-2.5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(m.FileText,{size:14,className:"text-[var(--muted-foreground)]"}),(0,b.jsx)("span",{className:"text-xs font-semibold uppercase tracking-wider text-[var(--muted-foreground)]",children:"Program"}),aQ?(0,b.jsx)("span",{className:"font-mono text-[10px] text-[var(--muted-foreground)] opacity-70",children:aQ.replace(/^.*\/\.agx\//,"~/.agx/")}):null]}),null===aS?(0,b.jsx)("button",{type:"button",onClick:()=>aT(aO??""),className:"rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]","aria-label":"Edit program",children:(0,b.jsx)(n.Pencil,{size:14})}):(0,b.jsxs)("div",{className:"flex items-center gap-1",children:[(0,b.jsx)("button",{type:"button",onClick:()=>void a4(),disabled:aU,className:"rounded-md p-1 text-[var(--primary)] transition-colors hover:bg-[var(--status-in-progress-bg)] disabled:opacity-50","aria-label":"Save program",children:(0,b.jsx)(k.Check,{size:14})}),(0,b.jsx)("button",{type:"button",onClick:()=>aT(null),className:"rounded-md p-1 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)]","aria-label":"Cancel editing",children:(0,b.jsx)(u.X,{size:14})})]})]}),(0,b.jsx)("div",{className:"px-4 py-3",children:null!==aS?(0,b.jsx)("textarea",{autoFocus:!0,value:aS,onChange:a=>aT(a.target.value),rows:8,placeholder:"Goal: why this exists\n\nDefinition of better: the metric or signal that says we're done\n\nBlast radius: paths/systems in scope, what's off-limits\n\nNotes: things we've learned",className:"w-full resize-y rounded-md border border-[var(--border)] bg-[var(--background)] px-3 py-2 font-mono text-xs text-[var(--foreground)] outline-none focus:border-[var(--primary)]"}):aO&&aO.trim().length>0?(0,b.jsx)("div",{className:"prose prose-sm max-w-none text-sm text-[var(--foreground)]",children:(0,b.jsx)(z.Markdown,{content:aO})}):(0,b.jsxs)("p",{className:"text-sm text-[var(--muted-foreground)]",children:["No program yet. Define what ",(0,b.jsx)("em",{children:"better"})," looks like for this objective — the metric, the scope, any constraints. Agents read this before every run, and will ask for it in chat if it's missing."]})})]}),(0,b.jsx)("div",{className:"mb-6",children:(0,b.jsxs)("button",{type:"button",onClick:async()=>{aN(!0),await ba(),aN(!1)},disabled:aM,className:"inline-flex items-center gap-2 rounded-xl border border-[var(--status-completed-border)] bg-[var(--status-completed-bg)] px-3 py-2 text-sm text-[var(--status-completed-text)] transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",children:[(0,b.jsx)(t.Sparkles,{className:"h-4 w-4"}),aM?"Working...":"Work on objective"]})}),(0,b.jsx)("div",{className:"mb-8 border-b border-[var(--border)]",children:(0,b.jsx)("nav",{className:"flex gap-1 -mb-px","aria-label":"Objective sections",children:[{id:"activity",label:"Activity",icon:l.Clock},{id:"notes",label:"Notes",icon:m.FileText},{id:"tasks",label:"Tasks",icon:a=>{let c=aG.filter(a=>a.connected),d=(aK&&c.some(a=>a.type===aK)?aK:c[0]?.type)??"tracker";return(0,b.jsx)(ag.TrackerIcon,{trackerType:d,className:"h-3.5 w-3.5"})}},{id:"scheduled-tasks",label:"Scheduled Jobs",icon:j}].map(a=>{let c,d;return(0,b.jsxs)("button",{type:"button",onClick:()=>W(a.id),className:`flex items-center gap-2 px-3 py-2.5 text-sm font-medium border-b-2 transition-colors ${V===a.id?"border-[var(--primary)] text-[var(--foreground)]":"border-transparent text-[var(--muted-foreground)] hover:border-[var(--border)] hover:text-[var(--foreground)]"}`,children:[(0,b.jsx)(a.icon,{size:14}),a.label,"activity"===a.id&&Y>0&&(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:Y}),"notes"===a.id&&ac.length>0&&(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:ac.length}),"tasks"===a.id&&(c=["done","canceled","cancelled","completed","duplicate"],(d=aE.filter((a,b,d)=>d.findIndex(b=>b.id===a.id)===b&&!c.includes(a.status.toLowerCase()))).length>0?(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:d.length}):null),"scheduled-tasks"===a.id&&a_>0&&(0,b.jsx)("span",{className:"rounded-full bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--tone-neutral)]",children:a_})]},a.id)})})}),(0,b.jsxs)("div",{className:"space-y-10",children:["notes"===V&&(0,b.jsxs)("section",{className:"space-y-4",children:[(0,b.jsxs)("div",{className:"flex gap-2 items-center",children:[(0,b.jsxs)("div",{className:"relative flex-1",children:[(0,b.jsx)(p.Search,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]"}),(0,b.jsx)("input",{type:"text",value:aB,onChange:a=>aD(a.target.value),placeholder:"Search notes...",className:"w-full rounded-md border border-[var(--border)] bg-[var(--input)] py-1.5 pl-8 pr-3 text-sm text-[var(--foreground)] placeholder:text-[var(--app-shell-soft-text)] focus:border-[var(--primary)] focus:outline-none"})]}),(0,b.jsxs)("button",{type:"button",onClick:a5,disabled:az,className:"flex items-center gap-1.5 rounded-md border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-3 py-1.5 text-sm font-medium text-[var(--status-in-progress-text)] transition-opacity hover:opacity-90 disabled:opacity-50",children:[(0,b.jsx)(o.Plus,{size:14}),"New note"]})]}),ae?(0,b.jsx)("p",{className:"py-4 text-sm text-[var(--muted-foreground)]",children:"Loading notes..."}):0===ac.length?(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)] py-4",children:"No notes yet. Add one above."}):0===(w=(v=aB.toLowerCase())?ac.filter(a=>a.title.toLowerCase().includes(v)||a.body.toLowerCase().includes(v)):ac).length?(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)] py-4",children:"No notes match your search."}):(0,b.jsx)("div",{className:"columns-1 gap-3 sm:columns-2 lg:columns-3",style:{columnFill:"balance"},children:w.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>ak(a.id),className:"mb-3 block w-full break-inside-avoid overflow-hidden rounded-lg border border-[var(--border)] bg-[var(--overlay-panel-muted)] text-left transition-shadow hover:shadow-md",children:[(0,b.jsx)("div",{className:"px-3 pt-3 pb-1",children:(0,b.jsx)("h4",{className:"text-sm font-medium text-[var(--foreground)] leading-snug",children:a.title})}),a.body.trim()&&(0,b.jsx)("div",{className:"px-3 pb-2 text-xs text-[var(--muted-foreground)] line-clamp-4",children:(0,b.jsx)(z.Markdown,{content:a.body})}),(0,b.jsx)("div",{className:"flex items-center justify-between px-3 pb-2",children:(0,b.jsx)("span",{className:"text-[10px] text-[var(--muted-foreground)]",children:new Date(a.updatedAt).toLocaleDateString()})})]},a.id))}),aj&&(()=>{let a=ac.find(a=>a.id===aj);if(!a)return null;let c=al[a.id]??a.body,d=ap[a.id]??a.title,e=at.has(a.id);return(0,b.jsx)("div",{className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 pt-[5vh]",onClick:a=>{a.target===a.currentTarget&&ak(null)},children:(0,b.jsxs)("div",{className:"mx-6 w-full max-w-7xl rounded-xl border border-[var(--border)] bg-[var(--background)] shadow-xl",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[(0,b.jsx)("input",{type:"text",autoFocus:!0,value:d,onFocus:a=>{"Untitled"===d&&a.target.select()},onChange:b=>ar(c=>({...c,[a.id]:b.target.value})),className:"flex-1 bg-transparent text-base font-semibold text-[var(--foreground)] focus:outline-none"}),(0,b.jsxs)("div",{className:"flex items-center gap-2 ml-3",children:[(0,b.jsx)("span",{className:"text-[11px] text-[var(--muted-foreground)]",children:e?"Saving...":new Date(a.updatedAt).toLocaleDateString()}),(0,b.jsx)("button",{type:"button",onClick:()=>a6(a.id),className:"p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--destructive)]",children:(0,b.jsx)(q.Trash2,{size:14})}),(0,b.jsx)("button",{type:"button",onClick:()=>ak(null),className:"p-1 text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:(0,b.jsx)(u.X,{size:14})})]})]}),(0,b.jsx)("div",{className:"max-h-[75vh] overflow-y-auto px-5 py-4",children:(0,b.jsx)(ax,{content:c,editable:!0,onChange:b=>am(c=>({...c,[a.id]:b})),placeholder:"Write your note..."})})]})})})()]}),"activity"===V&&I.id&&O.id&&(0,b.jsx)(X,{projectId:I.id,objectiveId:O.id,onTotalChange:Z}),"tasks"===V&&(x=aE.filter((a,b,c)=>c.findIndex(b=>b.id===a.id)===b),y=["done","canceled","cancelled","completed","duplicate"],A=x.filter(a=>!y.includes(a.status.toLowerCase())),B=x.filter(a=>y.includes(a.status.toLowerCase())).slice(-5),C=aG.filter(a=>a.connected),F=0===(D=aK&&C.some(a=>a.type===aK)?C.filter(a=>a.type===aK):C).length?null:D.map(a=>a.displayName).join(", "),(0,b.jsxs)("section",{children:[(0,b.jsx)("div",{className:"flex flex-wrap items-start justify-between gap-3 mb-4",children:(0,b.jsxs)("p",{className:"text-sm text-[var(--muted-foreground)]",children:["Tickets tracked by the objective label"," ",(0,b.jsx)("code",{className:"rounded bg-[var(--tone-neutral-bg)] px-1.5 py-0.5 font-mono text-[11px] text-[var(--foreground)]",children:O.key}),F?(0,b.jsxs)(b.Fragment,{children:[" across ",F,"."]}):"."]})}),0===D.length?(0,b.jsx)(aC,{label:0===aI.length?"No tracker integrations registered.":`Connect a tracker (${aI.map(a=>a.displayName).join(", ")}) to create and track tickets for this objective.`}):0===x.length?(0,b.jsx)(aC,{label:`No tracker tickets with label ${O.key} yet.`}):(0,b.jsxs)(b.Fragment,{children:[A.length>0&&(0,b.jsx)("div",{className:"space-y-3",children:A.map(c=>(0,b.jsxs)("div",{className:"rounded-xl border border-[var(--border)] bg-[var(--overlay-panel-muted)] p-4",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:[(0,b.jsx)(ag.TrackerIcon,{trackerType:c.trackerType,className:"h-3 w-3"}),(0,b.jsx)("span",{children:c.identifier})]}),(0,b.jsx)("a",{href:c.url??`/projects/${a}/tracking/${c.trackerType}?issue=${c.id}`,target:c.url?"_blank":void 0,rel:c.url?"noreferrer":void 0,className:"mt-1 block text-sm font-medium text-[var(--foreground)] transition-colors hover:text-[var(--primary)]",children:c.title})]}),(0,b.jsx)("span",{className:"rounded-full border border-[var(--tone-neutral-border)] px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-[var(--tone-neutral)]",children:c.status})]}),(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2 text-[11px] text-[var(--muted-foreground)]",children:[(0,b.jsxs)("span",{children:["Updated ",aq(c.updatedAt)]}),(0,b.jsx)("span",{children:c.assignee?`Assigned to ${c.assignee}`:"Unassigned"})]})]},c.id))}),B.length>0&&(0,b.jsxs)("div",{className:A.length>0?"mt-6":"",children:[(0,b.jsx)("p",{className:"text-[11px] font-medium uppercase tracking-[0.18em] text-[var(--muted-foreground)] mb-2",children:"Completed"}),(0,b.jsx)("div",{className:"space-y-0.5",children:B.map(c=>(0,b.jsxs)("a",{href:c.url??`/projects/${a}/tracking/${c.trackerType}?issue=${c.id}`,target:c.url?"_blank":void 0,rel:c.url?"noreferrer":void 0,className:"group flex items-center gap-3 rounded-md px-2 py-1.5 text-[var(--muted-foreground)] transition-colors hover:bg-[var(--muted)] hover:text-[var(--foreground)]",children:[(0,b.jsx)(ag.TrackerIcon,{trackerType:c.trackerType,className:"h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-[11px] font-mono shrink-0",children:c.identifier}),(0,b.jsx)("span",{className:"text-[12px] truncate",children:c.title}),(0,b.jsx)("span",{className:"ml-auto shrink-0 text-[10px] text-[var(--app-shell-soft-text)] group-hover:text-[var(--muted-foreground)]",children:c.status})]},c.id))})]})]})]})),"scheduled-tasks"===V&&(0,b.jsx)("section",{children:(0,b.jsx)(P,{projectId:I.id,objectiveId:O.id,objectiveKey:O.key,createDefaults:{name:`Work on ${O.title}`},onCreateTask:a9})}),(0,b.jsxs)("section",{className:"pt-10",children:[(0,b.jsx)("div",{className:"mb-4",children:(0,b.jsx)("h2",{className:"text-sm font-semibold text-[var(--destructive)]",children:"Danger Zone"})}),(0,b.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-[var(--destructive-border)] bg-[var(--destructive-bg)] p-5",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-medium text-[var(--foreground)]",children:"Delete Objective"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[var(--muted-foreground)]",children:"Once you delete an objective, there is no going back."})]}),(0,b.jsxs)("button",{type:"button",onClick:()=>void a7(),"aria-label":`Delete objective ${O.title}`,className:"flex items-center gap-2 whitespace-nowrap rounded-md border border-[var(--destructive-border)] bg-[var(--destructive-bg)] px-3 py-1.5 text-sm font-medium text-[var(--destructive)] transition-opacity hover:opacity-90",children:[(0,b.jsx)(q.Trash2,{size:14})," Delete"]})]})]})]})]})}),(0,b.jsx)(ah.JumpToLatestButton,{visible:aX,direction:"top",onClick:aZ})]}),(0,b.jsx)(au,{projectId:I.id,projectSlug:a,objective:O,teamName:Q,trackerConnections:aG,availableTrackers:aI,defaultTrackerType:aK,onThreadLinked:a8,onObjectiveUpdated:N})]})})}):(0,b.jsx)("div",{className:"flex h-full items-center justify-center px-4 bg-[var(--background)]",children:(0,b.jsxs)("div",{className:"rounded-xl border border-[var(--border)] bg-[var(--card-bg)] p-8 text-center",children:[(0,b.jsx)("p",{className:"text-lg font-semibold text-[var(--foreground)]",children:"Objective not found"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[var(--muted-foreground)]",children:"It may have been deleted or the link is stale."}),(0,b.jsx)(c.default,{href:`/projects/${a}`,className:"mt-4 inline-flex items-center gap-2 rounded-md border border-[var(--border)] bg-[var(--card-bg)] px-3 py-1.5 text-sm text-[var(--foreground)] transition-colors hover:bg-[var(--secondary)]",children:"Back to objectives"})]})}):(0,b.jsx)(av,{label:"Project not found."})}function aC({label:a}){return(0,b.jsx)("div",{className:"flex items-center rounded-xl border border-dashed border-[var(--border)] bg-[var(--overlay-panel-muted)] p-6",children:(0,b.jsx)("p",{className:"text-sm text-[var(--muted-foreground)]",children:a})})}function aD({mode:a,draft:c,teams:d=[],isSaving:e,onChange:f,onClose:g,onSave:h}){return(0,b.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/45 p-4",children:(0,b.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"edit"===a?"Edit objective":"New objective",className:"w-full max-w-3xl overflow-hidden rounded-[32px] border border-[var(--border)] bg-[var(--overlay-panel-strong)] shadow-2xl",children:[(0,b.jsxs)("div",{className:"border-b border-[var(--border)] px-5 py-4",children:[(0,b.jsx)("h3",{className:"text-lg font-semibold text-[var(--foreground)]",children:"edit"===a?"Edit objective":"New objective"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[var(--muted-foreground)]",children:"edit"===a?"Update the tracking details for this objective.":"Keep the statement measurable and use notes only for context that matters."})]}),(0,b.jsxs)("div",{className:"space-y-4 px-5 py-5",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)(aE,{label:"Objective statement"}),(0,b.jsx)("input",{value:c.title,onChange:a=>f({...c,title:a.target.value}),className:"w-full rounded-2xl border border-[var(--border)] bg-[var(--input)] px-4 py-3 text-sm text-[var(--foreground)] outline-none transition-colors focus:border-[var(--primary)]",placeholder:"Get 50 qualified visitors daily"})]}),"create"===a?(0,b.jsxs)("div",{children:[(0,b.jsx)(aE,{label:"Team"}),(0,b.jsxs)("select",{value:c.teamId,onChange:a=>f({...c,teamId:a.target.value}),className:"w-full rounded-2xl border border-[var(--border)] bg-[var(--input)] px-3 py-3 text-sm text-[var(--foreground)] outline-none transition-colors focus:border-[var(--primary)]",children:[(0,b.jsx)("option",{value:"",children:"Select a team"}),d.map(a=>(0,b.jsx)("option",{value:a.id,children:a.name},a.id))]}),(0,b.jsx)("p",{className:"mt-2 text-xs text-[var(--muted-foreground)]",children:"Teams can only own one objective at a time."})]}):null]}),(0,b.jsxs)("div",{className:"flex items-center justify-end gap-2 border-t border-[var(--border)] px-5 py-4",children:[(0,b.jsx)("button",{type:"button",onClick:g,className:"rounded-xl border border-[var(--border)] px-3 py-2 text-sm text-[var(--muted-foreground)] transition-colors hover:text-[var(--foreground)]",children:"Cancel"}),(0,b.jsx)("button",{type:"button",onClick:h,disabled:e,className:"rounded-xl border border-[var(--status-in-progress-border)] bg-[var(--status-in-progress-bg)] px-3 py-2 text-sm font-medium text-[var(--status-in-progress-text)] transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",children:e?"Saving...":"edit"===a?"Save objective":"Create objective"})]})]})})}function aE({label:a}){return(0,b.jsx)("label",{className:"mb-2 block text-[11px] font-semibold uppercase tracking-[0.18em] text-[var(--muted-foreground)]",children:a})}a.s(["ProjectObjectivesOverview",()=>aA],739515)}];
|
|
21
21
|
|
|
22
22
|
//# sourceMappingURL=apps_local_components_projects_ProjectObjectivesWorkspace_tsx_751ab3d3._.js.map
|