@useorgx/openclaw-plugin 0.4.9 → 0.7.2
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 +77 -11
- package/dashboard/dist/assets/6mILZQ2a.js +1 -0
- package/dashboard/dist/assets/6mILZQ2a.js.br +0 -0
- package/dashboard/dist/assets/6mILZQ2a.js.gz +0 -0
- package/dashboard/dist/assets/8dksYiq4.js +2 -0
- package/dashboard/dist/assets/8dksYiq4.js.br +0 -0
- package/dashboard/dist/assets/8dksYiq4.js.gz +0 -0
- package/dashboard/dist/assets/B5zYRHc3.js +1 -0
- package/dashboard/dist/assets/B5zYRHc3.js.br +0 -0
- package/dashboard/dist/assets/B5zYRHc3.js.gz +0 -0
- package/dashboard/dist/assets/B6wPWJ35.js +1 -0
- package/dashboard/dist/assets/B6wPWJ35.js.br +0 -0
- package/dashboard/dist/assets/B6wPWJ35.js.gz +0 -0
- package/dashboard/dist/assets/BJgZIVUQ.js +53 -0
- package/dashboard/dist/assets/BJgZIVUQ.js.br +0 -0
- package/dashboard/dist/assets/BJgZIVUQ.js.gz +0 -0
- package/dashboard/dist/assets/BWEwjt1W.js +1 -0
- package/dashboard/dist/assets/BWEwjt1W.js.br +0 -0
- package/dashboard/dist/assets/BWEwjt1W.js.gz +0 -0
- package/dashboard/dist/assets/BgOYB78t.js +4 -0
- package/dashboard/dist/assets/BgOYB78t.js.br +0 -0
- package/dashboard/dist/assets/BgOYB78t.js.gz +0 -0
- package/dashboard/dist/assets/BzRbDCAD.css +1 -0
- package/dashboard/dist/assets/BzRbDCAD.css.br +0 -0
- package/dashboard/dist/assets/BzRbDCAD.css.gz +0 -0
- package/dashboard/dist/assets/C-KIc3Wc.js.br +0 -0
- package/dashboard/dist/assets/C-KIc3Wc.js.gz +0 -0
- package/dashboard/dist/assets/C8uM3AX8.js +1 -0
- package/dashboard/dist/assets/C8uM3AX8.js.br +0 -0
- package/dashboard/dist/assets/C8uM3AX8.js.gz +0 -0
- package/dashboard/dist/assets/C9jy61eu.js +212 -0
- package/dashboard/dist/assets/C9jy61eu.js.br +0 -0
- package/dashboard/dist/assets/C9jy61eu.js.gz +0 -0
- package/dashboard/dist/assets/CC63EwFD.js +1 -0
- package/dashboard/dist/assets/CC63EwFD.js.br +0 -0
- package/dashboard/dist/assets/CC63EwFD.js.gz +0 -0
- package/dashboard/dist/assets/CL_wXqR7.js +1 -0
- package/dashboard/dist/assets/CL_wXqR7.js.br +0 -0
- package/dashboard/dist/assets/CL_wXqR7.js.gz +0 -0
- package/dashboard/dist/assets/CZaT3ob_.js +1 -0
- package/dashboard/dist/assets/CZaT3ob_.js.br +0 -0
- package/dashboard/dist/assets/CZaT3ob_.js.gz +0 -0
- package/dashboard/dist/assets/CgaottFX.js +1 -0
- package/dashboard/dist/assets/CgaottFX.js.br +0 -0
- package/dashboard/dist/assets/CgaottFX.js.gz +0 -0
- package/dashboard/dist/assets/{CpJsfbXo.js → CxQ08qFN.js} +2 -2
- package/dashboard/dist/assets/CxQ08qFN.js.br +0 -0
- package/dashboard/dist/assets/CxQ08qFN.js.gz +0 -0
- package/dashboard/dist/assets/CzCxAZlW.js +1 -0
- package/dashboard/dist/assets/CzCxAZlW.js.br +0 -0
- package/dashboard/dist/assets/CzCxAZlW.js.gz +0 -0
- package/dashboard/dist/assets/D3iMTYEj.js +1 -0
- package/dashboard/dist/assets/D3iMTYEj.js.br +0 -0
- package/dashboard/dist/assets/D3iMTYEj.js.gz +0 -0
- package/dashboard/dist/assets/D8JNX8kq.js +2 -0
- package/dashboard/dist/assets/D8JNX8kq.js.br +0 -0
- package/dashboard/dist/assets/D8JNX8kq.js.gz +0 -0
- package/dashboard/dist/assets/DnA8dpj6.js +1 -0
- package/dashboard/dist/assets/DnA8dpj6.js.br +0 -0
- package/dashboard/dist/assets/DnA8dpj6.js.gz +0 -0
- package/dashboard/dist/assets/IUexzymk.js +1 -0
- package/dashboard/dist/assets/IUexzymk.js.br +0 -0
- package/dashboard/dist/assets/IUexzymk.js.gz +0 -0
- package/dashboard/dist/assets/cNrhgGc1.js +8 -0
- package/dashboard/dist/assets/cNrhgGc1.js.br +0 -0
- package/dashboard/dist/assets/cNrhgGc1.js.gz +0 -0
- package/dashboard/dist/assets/ic2FaMnh.js +1 -0
- package/dashboard/dist/assets/ic2FaMnh.js.br +0 -0
- package/dashboard/dist/assets/ic2FaMnh.js.gz +0 -0
- package/dashboard/dist/assets/qm8xLgv-.css +1 -0
- package/dashboard/dist/assets/qm8xLgv-.css.br +0 -0
- package/dashboard/dist/assets/qm8xLgv-.css.gz +0 -0
- package/dashboard/dist/assets/rttbDbEx.js +1 -0
- package/dashboard/dist/assets/rttbDbEx.js.br +0 -0
- package/dashboard/dist/assets/rttbDbEx.js.gz +0 -0
- package/dashboard/dist/brand/anthropic-mark.svg.br +0 -0
- package/dashboard/dist/brand/anthropic-mark.svg.gz +0 -0
- package/dashboard/dist/brand/openai-mark.svg.br +0 -0
- package/dashboard/dist/brand/openai-mark.svg.gz +0 -0
- package/dashboard/dist/brand/openclaw-mark.svg.br +0 -0
- package/dashboard/dist/brand/openclaw-mark.svg.gz +0 -0
- package/dashboard/dist/brand/xandy-orchestrator.png +0 -0
- package/dashboard/dist/index.html +7 -5
- package/dashboard/dist/index.html.br +0 -0
- package/dashboard/dist/index.html.gz +0 -0
- package/dist/activity-actor-fields.js +26 -4
- package/dist/activity-store.js +34 -8
- package/dist/agent-context-store.js +79 -17
- package/dist/agent-run-store.js +44 -3
- package/dist/agent-suite.d.ts +9 -0
- package/dist/agent-suite.js +149 -9
- package/dist/artifacts/artifact-domain-schemas.d.ts +66 -0
- package/dist/artifacts/artifact-domain-schemas.js +357 -0
- package/dist/artifacts/register-artifact.d.ts +4 -3
- package/dist/artifacts/register-artifact.js +170 -57
- package/dist/chat-store.d.ts +157 -0
- package/dist/chat-store.js +586 -0
- package/dist/cli/orgx.js +11 -0
- package/dist/contracts/client.d.ts +43 -3
- package/dist/contracts/client.js +159 -30
- package/dist/contracts/practice-exercise-schema.d.ts +216 -0
- package/dist/contracts/practice-exercise-schema.js +314 -0
- package/dist/contracts/retro-schema.d.ts +81 -0
- package/dist/contracts/retro-schema.js +80 -0
- package/dist/contracts/shared-types.d.ts +159 -0
- package/dist/contracts/shared-types.js +199 -1
- package/dist/contracts/skill-pack-schema.d.ts +192 -0
- package/dist/contracts/skill-pack-schema.js +180 -0
- package/dist/contracts/types.d.ts +247 -2
- package/dist/entities/auto-assignment.js +43 -17
- package/dist/event-sanitization.d.ts +11 -0
- package/dist/event-sanitization.js +113 -0
- package/dist/gateway-watchdog.d.ts +5 -0
- package/dist/gateway-watchdog.js +50 -0
- package/dist/hooks/post-reporting-event.mjs +1 -5
- package/dist/http/helpers/activity-headline.js +13 -132
- package/dist/http/helpers/auto-continue-engine.d.ts +198 -10
- package/dist/http/helpers/auto-continue-engine.js +3145 -186
- package/dist/http/helpers/autopilot-operations.d.ts +19 -0
- package/dist/http/helpers/autopilot-operations.js +182 -31
- package/dist/http/helpers/autopilot-runtime.d.ts +1 -0
- package/dist/http/helpers/autopilot-runtime.js +328 -25
- package/dist/http/helpers/autopilot-slice-utils.d.ts +18 -0
- package/dist/http/helpers/autopilot-slice-utils.js +514 -93
- package/dist/http/helpers/decision-mapper.d.ts +40 -0
- package/dist/http/helpers/decision-mapper.js +223 -7
- package/dist/http/helpers/dispatch-lifecycle.d.ts +19 -2
- package/dist/http/helpers/dispatch-lifecycle.js +242 -37
- package/dist/http/helpers/kickoff-context.js +104 -0
- package/dist/http/helpers/llm-client.d.ts +47 -0
- package/dist/http/helpers/llm-client.js +256 -0
- package/dist/http/helpers/mission-control.d.ts +102 -3
- package/dist/http/helpers/mission-control.js +498 -9
- package/dist/http/helpers/sentinel-catalog.d.ts +23 -0
- package/dist/http/helpers/sentinel-catalog.js +193 -0
- package/dist/http/helpers/session-classification.d.ts +9 -0
- package/dist/http/helpers/session-classification.js +564 -0
- package/dist/http/helpers/slice-experience-v2.d.ts +137 -0
- package/dist/http/helpers/slice-experience-v2.js +677 -0
- package/dist/http/helpers/slice-run-projections.d.ts +72 -0
- package/dist/http/helpers/slice-run-projections.js +877 -0
- package/dist/http/helpers/triage-mapper.d.ts +43 -0
- package/dist/http/helpers/triage-mapper.js +549 -0
- package/dist/http/helpers/value-utils.js +7 -2
- package/dist/http/helpers/workspace-scope.d.ts +15 -0
- package/dist/http/helpers/workspace-scope.js +170 -0
- package/dist/http/index.js +1420 -105
- package/dist/http/routes/agent-suite.d.ts +9 -0
- package/dist/http/routes/agent-suite.js +294 -8
- package/dist/http/routes/agents-catalog.js +64 -19
- package/dist/http/routes/chat.d.ts +19 -0
- package/dist/http/routes/chat.js +522 -0
- package/dist/http/routes/decision-actions.d.ts +8 -1
- package/dist/http/routes/decision-actions.js +42 -5
- package/dist/http/routes/dispatch-gateway-envelope.d.ts +25 -0
- package/dist/http/routes/dispatch-gateway-envelope.js +26 -0
- package/dist/http/routes/entities.d.ts +16 -0
- package/dist/http/routes/entities.js +232 -6
- package/dist/http/routes/live-legacy.d.ts +5 -0
- package/dist/http/routes/live-legacy.js +23 -509
- package/dist/http/routes/live-misc.d.ts +12 -0
- package/dist/http/routes/live-misc.js +251 -31
- package/dist/http/routes/live-snapshot.d.ts +49 -2
- package/dist/http/routes/live-snapshot.js +653 -23
- package/dist/http/routes/live-terminal.d.ts +11 -0
- package/dist/http/routes/live-terminal.js +154 -0
- package/dist/http/routes/live-triage.d.ts +61 -0
- package/dist/http/routes/live-triage.js +192 -0
- package/dist/http/routes/mission-control-actions.d.ts +49 -1
- package/dist/http/routes/mission-control-actions.js +1246 -84
- package/dist/http/routes/mission-control-read.d.ts +48 -3
- package/dist/http/routes/mission-control-read.js +1658 -20
- package/dist/http/routes/realtime-orchestrator.d.ts +10 -0
- package/dist/http/routes/realtime-orchestrator.js +74 -0
- package/dist/http/routes/run-control.d.ts +5 -2
- package/dist/http/routes/run-control.js +10 -0
- package/dist/http/routes/sentinels-catalog.d.ts +7 -0
- package/dist/http/routes/sentinels-catalog.js +24 -0
- package/dist/http/routes/summary.js +10 -3
- package/dist/http/routes/usage.d.ts +24 -0
- package/dist/http/routes/usage.js +362 -0
- package/dist/http/routes/work-artifacts.js +28 -9
- package/dist/index.js +165 -27
- package/dist/local-openclaw.js +29 -6
- package/dist/mcp-client-setup.js +3 -3
- package/dist/mcp-http-handler.d.ts +3 -0
- package/dist/mcp-http-handler.js +34 -60
- package/dist/next-up-queue-store.d.ts +16 -1
- package/dist/next-up-queue-store.js +89 -7
- package/dist/outbox.d.ts +5 -0
- package/dist/outbox.js +113 -9
- package/dist/paths.js +36 -5
- package/dist/reporting/rollups.d.ts +41 -0
- package/dist/reporting/rollups.js +113 -0
- package/dist/retro/domain-templates.d.ts +45 -0
- package/dist/retro/domain-templates.js +297 -0
- package/dist/retro/quality-rubric.d.ts +33 -0
- package/dist/retro/quality-rubric.js +213 -0
- package/dist/runtime-cleanup.d.ts +18 -0
- package/dist/runtime-cleanup.js +87 -0
- package/dist/services/background.d.ts +11 -0
- package/dist/services/background.js +22 -0
- package/dist/services/experiment-randomization.d.ts +21 -0
- package/dist/services/experiment-randomization.js +63 -0
- package/dist/skill-pack-state.d.ts +36 -5
- package/dist/skill-pack-state.js +273 -29
- package/dist/sync/local-agent-telemetry.d.ts +13 -0
- package/dist/sync/local-agent-telemetry.js +128 -0
- package/dist/sync/outbox-replay.js +131 -24
- package/dist/team-context-store.d.ts +23 -0
- package/dist/team-context-store.js +116 -0
- package/dist/telemetry/posthog.js +4 -2
- package/dist/tools/core-tools.d.ts +10 -14
- package/dist/tools/core-tools.js +1289 -24
- package/dist/types.d.ts +2 -0
- package/dist/types.js +2 -0
- package/dist/worker-supervisor.js +23 -0
- package/package.json +20 -6
- package/dashboard/dist/assets/B3ziCA02.js +0 -8
- package/dashboard/dist/assets/B5NEElEI.css +0 -1
- package/dashboard/dist/assets/BhapSNAs.js +0 -215
- package/dashboard/dist/assets/iFdvE7lx.js +0 -1
- package/dashboard/dist/assets/jRJsmpYM.js +0 -1
- package/dashboard/dist/assets/sAhvFnpk.js +0 -4
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as d,j as e}from"./cNrhgGc1.js";import{A as w,m as y}from"./CxQ08qFN.js";import"./C-KIc3Wc.js";import"./BJgZIVUQ.js";function v(t){switch(t){case"decision_required":return"Decision required";case"blocked_intervention":return"Blocked — needs intervention";case"review_required":return"Review required";case"failure_diagnostic":return"Failure diagnostic";default:return t}}function m(t){switch(t){case"critical":return"#FF6B6B";case"high":return"#F5B700";case"medium":return"#0AD4C4";default:return"#8B8FA3"}}function b({children:t}){return e.jsx("h4",{className:"text-micro font-semibold uppercase tracking-wider text-muted mb-1.5",children:t})}function k({item:t}){const s=t.proofBundle;return s.artifactRefs.length>0||s.fileChanges.length>0||s.prRefs.length>0||s.logRefs.length>0||s.decisionRefs.length>0?e.jsxs("div",{children:[e.jsx(b,{children:"Proof"}),e.jsxs("div",{className:"space-y-1",children:[s.prRefs.map((r,n)=>e.jsx(x,{icon:"pr",label:r},`pr-${n}`)),s.fileChanges.map((r,n)=>e.jsx(x,{icon:"file",label:r},`file-${n}`)),s.artifactRefs.map((r,n)=>e.jsx(x,{icon:"artifact",label:r},`art-${n}`)),s.logRefs.map((r,n)=>e.jsx(x,{icon:"log",label:r},`log-${n}`)),s.decisionRefs.map((r,n)=>e.jsx(x,{icon:"decision",label:r},`dec-${n}`))]})]}):null}function x({icon:t,label:s}){const o=t==="pr"?"⎇":t==="file"?"◇":t==="log"?"▸":t==="decision"?"◈":"▪";return e.jsxs("div",{className:"flex items-center gap-2 text-caption text-secondary",children:[e.jsx("span",{className:"text-muted flex-shrink-0 w-4 text-center",children:o}),e.jsx("span",{className:"truncate",children:s})]})}function g({item:t}){const{impact:s}=t;return s.initiativeCount===0&&s.workstreamCount===0&&s.downstreamBlockedCount===0?null:e.jsxs("div",{children:[e.jsx(b,{children:"Impact if ignored"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[s.initiativeCount>0&&e.jsx(f,{label:`${s.initiativeCount} initiative${s.initiativeCount>1?"s":""}`}),s.workstreamCount>0&&e.jsx(f,{label:`${s.workstreamCount} workstream${s.workstreamCount>1?"s":""}`}),s.downstreamBlockedCount>0&&e.jsx(f,{label:`${s.downstreamBlockedCount} blocked downstream`,tone:"red"})]})]})}function f({label:t,tone:s="amber"}){const o=s==="red"?"bg-[#FF6B6B]/14":"bg-[#F5B700]/14",r=s==="red"?"text-[#FFA8A8]":"text-[#FFE7A8]";return e.jsx("span",{className:`rounded-full px-2 py-0.5 text-micro font-medium ${o} ${r}`,children:t})}function C({triageAction:t,onPerform:s,isActing:o}){const[r,n]=d.useState(!1),[i,h]=d.useState(""),[c,a]=d.useState(!1),l=t.action==="approve"||t.action==="autofix",p=t.action==="dismiss",u=l?"bg-[#0AD4C4]/20 text-[#7AEDE5] hover:bg-[#0AD4C4]/30":p?"bg-[#FF6B6B]/14 text-[#FFA8A8] hover:bg-[#FF6B6B]/20":"bg-white/[0.08] text-secondary hover:bg-white/[0.12]";return t.available?t.requiresNote&&r?e.jsxs("div",{className:"flex flex-col gap-1.5 w-full",children:[e.jsx("textarea",{value:i,onChange:j=>h(j.target.value),placeholder:"Add a note...",className:"w-full rounded-lg border border-subtle bg-white/[0.04] px-2.5 py-1.5 text-caption text-primary placeholder:text-muted resize-none",rows:2}),e.jsxs("div",{className:"flex gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>s(t.action,i),disabled:o,className:`rounded-lg px-3 py-1 text-caption font-medium transition-colors disabled:opacity-40 ${u}`,children:"Confirm"}),e.jsx("button",{type:"button",onClick:()=>n(!1),className:"text-caption text-muted hover:text-secondary",children:"Cancel"})]})]}):e.jsx("div",{className:"relative group",children:e.jsxs("button",{type:"button",onClick:()=>{t.requiresNote?n(!0):s(t.action)},onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),disabled:o,className:`relative overflow-hidden rounded-lg px-3 py-1.5 text-caption font-medium transition-colors disabled:opacity-40 ${u}`,title:t.consequences,children:[e.jsx("span",{children:t.label}),c&&t.consequences&&e.jsxs("span",{className:"ml-1.5 text-micro opacity-80",children:["— ",t.consequences]})]})}):e.jsx("button",{type:"button",disabled:!0,className:"rounded-lg px-3 py-1.5 text-caption font-medium opacity-30 bg-white/[0.06] text-muted cursor-not-allowed",title:"Not available",children:t.label})}function N({item:t}){const[s,o]=d.useState(!1),r=[["ID",t.id],["Kind",t.kind],["Dedupe key",t.dedupeKey],["Source system",t.sourceSystem],["Conflict source",t.conflictSource],["Agent ID",t.agentId],["Source decision",t.sourceDecisionId],["Source activity",t.sourceActivityId],["First seen",t.firstSeenAt],["Last seen",t.lastSeenAt],["Created",t.createdAt]].filter(([,n])=>n!=null);return e.jsxs("div",{className:"border-t border-subtle pt-2",children:[e.jsxs("button",{type:"button",onClick:()=>o(n=>!n),className:"flex w-full items-center justify-between text-micro font-semibold uppercase tracking-wider text-muted hover:text-secondary transition-colors",children:[e.jsx("span",{children:"Technical details"}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${s?"rotate-180":""}`,children:e.jsx("path",{d:"m6 9 6 6 6-6"})})]}),s&&e.jsx("div",{className:"mt-2 space-y-0.5",children:r.map(([n,i])=>e.jsxs("div",{className:"flex gap-2 text-micro",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:n}),e.jsx("span",{className:"text-secondary truncate",children:i})]},n))})]})}function $({item:t,actions:s,onClose:o,onNavigate:r,currentIndex:n,totalCount:i}){const h=d.useRef(null);d.useEffect(()=>{if(!t)return;const a=l=>{var u;const p=(u=l.target)==null?void 0:u.tagName;if(!(p==="INPUT"||p==="TEXTAREA"))switch(l.key){case"j":case"ArrowRight":l.preventDefault(),r==null||r(1);break;case"k":case"ArrowLeft":l.preventDefault(),r==null||r(-1);break;case"a":l.preventDefault(),c("approve");break;case"d":l.preventDefault(),c("dismiss");break;case"r":l.preventDefault(),c("retry");break;case"s":l.preventDefault(),c("snooze");break;case"Escape":l.preventDefault(),o();break}};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[t,r,o]);const c=d.useCallback(async(a,l)=>{if(t)try{await s.performAction(t.id,a,{note:l}),r==null||r(1)}catch{}},[t,s,r]);return t?e.jsx(w,{mode:"wait",children:e.jsxs(y.div,{ref:h,initial:{opacity:0,x:44,scale:.985},animate:{opacity:1,x:0,scale:1},exit:{opacity:0,x:-44,scale:.985},transition:{duration:.28},className:"flex h-full min-h-0 flex-col overflow-y-auto px-5 pb-5 pt-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[r&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>r(-1),className:"rounded p-1 text-muted hover:text-secondary hover:bg-white/[0.06] transition-colors",title:"Previous (k)",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"m15 18-6-6 6-6"})})}),e.jsx("button",{type:"button",onClick:()=>r(1),className:"rounded p-1 text-muted hover:text-secondary hover:bg-white/[0.06] transition-colors",title:"Next (j)",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"m9 18 6-6-6-6"})})})]}),n!=null&&i!=null&&e.jsxs("span",{className:"text-micro text-muted tabular-nums",children:[n+1," of ",i]})]}),e.jsx("button",{type:"button",onClick:o,className:"rounded p-1 text-muted hover:text-secondary hover:bg-white/[0.06] transition-colors",title:"Close (Esc)",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6 6 18M6 6l12 12"})})})]}),e.jsxs("div",{className:"mb-4 pl-3 border-l-2",style:{borderColor:`${m(t.severity)}50`},children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-1",children:[e.jsx("span",{className:"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider",style:{backgroundColor:`${m(t.severity)}20`,color:m(t.severity)},children:v(t.kind)}),t.occurrenceCount>1&&e.jsxs("span",{className:"text-micro text-muted",children:["×",t.occurrenceCount," occurrences"]})]}),e.jsx("h3",{className:"text-heading font-semibold text-primary mt-1",children:t.title}),e.jsx("p",{className:"text-body text-secondary mt-1 leading-relaxed rounded-xl rounded-tl-sm bg-white/[0.04] px-3 py-2.5 border-l-2 border-white/[0.08]",children:t.summary}),(t.initiativeTitle||t.workstreamTitle)&&e.jsx("p",{className:"text-micro text-muted mt-2",children:[t.initiativeTitle,t.workstreamTitle,t.taskTitle].filter(Boolean).join(" › ")})]}),e.jsx("div",{className:"space-y-4 mb-4",children:e.jsx(k,{item:t})}),e.jsx("div",{className:"mb-4",children:e.jsx(g,{item:t})}),e.jsxs("div",{className:"mb-4",children:[e.jsx(b,{children:"Actions"}),e.jsx("div",{className:"space-y-1.5",children:t.actionContract.map(a=>e.jsx(C,{triageAction:a,onPerform:c,isActing:s.isActing},a.action))}),t.recommendedAction&&e.jsxs("p",{className:"mt-2 text-micro text-[#7AEDE5]",children:["Recommended: ",t.recommendedAction]})]}),e.jsx(N,{item:t}),e.jsxs("div",{className:"mt-4 flex flex-wrap gap-x-3 gap-y-1 text-micro text-muted opacity-60",children:[e.jsx("span",{children:"j/k nav"}),e.jsx("span",{children:"a approve"}),e.jsx("span",{children:"d dismiss"}),e.jsx("span",{children:"r retry"}),e.jsx("span",{children:"s snooze"}),e.jsx("span",{children:"esc close"})]})]},t.id)}):null}export{$ as TriageDetailModal};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@charset "UTF-8";.react-datepicker__navigation-icon:before,.react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view--down-arrow{border-color:#ccc;border-style:solid;border-width:3px 3px 0 0;content:"";display:block;height:9px;position:absolute;top:6px;width:9px}.react-datepicker-wrapper{display:inline-block;padding:0;border:0}.react-datepicker{font-family:Helvetica Neue,helvetica,arial,sans-serif;font-size:.8rem;background-color:#fff;color:#000;border:1px solid #aeaeae;border-radius:.3rem;display:inline-block;position:relative;line-height:initial}.react-datepicker--time-only .react-datepicker__time-container{border-left:0}.react-datepicker--time-only .react-datepicker__time,.react-datepicker--time-only .react-datepicker__time-box{border-bottom-left-radius:.3rem;border-bottom-right-radius:.3rem}.react-datepicker-popper{z-index:1;line-height:0}.react-datepicker-popper .react-datepicker__triangle{stroke:#aeaeae}.react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle{fill:#f0f0f0;color:#f0f0f0}.react-datepicker-popper[data-placement^=top] .react-datepicker__triangle{fill:#fff;color:#fff}.react-datepicker__header{text-align:center;background-color:#f0f0f0;border-bottom:1px solid #aeaeae;border-top-left-radius:.3rem;padding:8px 0;position:relative}.react-datepicker__header--time{padding-bottom:8px;padding-left:5px;padding-right:5px}.react-datepicker__header--time:not(.react-datepicker__header--time--only){border-top-left-radius:0}.react-datepicker__header:not(.react-datepicker__header--has-time-select){border-top-right-radius:.3rem}.react-datepicker__year-dropdown-container--select,.react-datepicker__month-dropdown-container--select,.react-datepicker__month-year-dropdown-container--select,.react-datepicker__year-dropdown-container--scroll,.react-datepicker__month-dropdown-container--scroll,.react-datepicker__month-year-dropdown-container--scroll{display:inline-block;margin:0 15px}.react-datepicker__current-month,.react-datepicker-time__header,.react-datepicker-year-header{margin-top:0;color:#000;font-weight:700;font-size:.944rem}h2.react-datepicker__current-month{padding:0;margin:0}.react-datepicker-time__header{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.react-datepicker__navigation{align-items:center;background:none;display:flex;justify-content:center;text-align:center;cursor:pointer;position:absolute;top:2px;padding:0;border:none;z-index:1;height:32px;width:32px;text-indent:-999em;overflow:hidden}.react-datepicker__navigation--previous{left:2px}.react-datepicker__navigation--next{right:2px}.react-datepicker__navigation--next--with-time:not(.react-datepicker__navigation--next--with-today-button){right:85px}.react-datepicker__navigation--years{position:relative;top:0;display:block;margin-left:auto;margin-right:auto}.react-datepicker__navigation--years-previous{top:4px}.react-datepicker__navigation--years-upcoming{top:-4px}.react-datepicker__navigation:hover *:before{border-color:#a6a6a6}.react-datepicker__navigation-icon{position:relative;top:-1px;font-size:20px;width:0}.react-datepicker__navigation-icon--next{left:-2px}.react-datepicker__navigation-icon--next:before{transform:rotate(45deg);left:-7px}.react-datepicker__navigation-icon--previous{right:-2px}.react-datepicker__navigation-icon--previous:before{transform:rotate(225deg);right:-7px}.react-datepicker__month-container{float:left}.react-datepicker__year{margin:.4rem;text-align:center}.react-datepicker__year-wrapper{display:flex;flex-wrap:wrap;max-width:180px}.react-datepicker__year .react-datepicker__year-text{display:inline-block;width:4rem;margin:2px}.react-datepicker__month{margin:.4rem;text-align:center}.react-datepicker__month .react-datepicker__month-text,.react-datepicker__month .react-datepicker__quarter-text{display:inline-block;width:4rem;margin:2px}.react-datepicker__input-time-container{clear:both;width:100%;float:left;margin:5px 0 10px 15px;text-align:left}.react-datepicker__input-time-container .react-datepicker-time__caption,.react-datepicker__input-time-container .react-datepicker-time__input-container{display:inline-block}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input{display:inline-block;margin-left:10px}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input{width:auto}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-inner-spin-button,.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]{-moz-appearance:textfield}.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__delimiter{margin-left:5px;display:inline-block}.react-datepicker__time-container{float:right;border-left:1px solid #aeaeae;width:85px}.react-datepicker__time-container--with-today-button{display:inline;border:1px solid #aeaeae;border-radius:.3rem;position:absolute;right:-87px;top:0}.react-datepicker__time-container .react-datepicker__time{position:relative;background:#fff;border-bottom-right-radius:.3rem}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box{width:85px;overflow-x:hidden;margin:0 auto;text-align:center;border-bottom-right-radius:.3rem}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list{list-style:none;margin:0;height:calc(195px + .85rem);overflow-y:scroll;padding-right:0;padding-left:0;width:100%;box-sizing:content-box}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item{height:30px;padding:5px 10px;white-space:nowrap}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item:hover{cursor:pointer;background-color:#f0f0f0}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected{background-color:#216ba5;color:#fff;font-weight:700}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected:hover{background-color:#216ba5}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled{color:#ccc}.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled:hover{cursor:default;background-color:transparent}.react-datepicker__week-number{color:#ccc;display:inline-block;width:1.7rem;line-height:1.7rem;text-align:center;margin:.166rem}.react-datepicker__week-number.react-datepicker__week-number--clickable{cursor:pointer}.react-datepicker__week-number.react-datepicker__week-number--clickable:not(.react-datepicker__week-number--selected):hover{border-radius:.3rem;background-color:#f0f0f0}.react-datepicker__week-number--selected{border-radius:.3rem;background-color:#216ba5;color:#fff}.react-datepicker__week-number--selected:hover{background-color:#1d5d90}.react-datepicker__day-names{white-space:nowrap;margin-bottom:-8px}.react-datepicker__week{white-space:nowrap}.react-datepicker__day-name,.react-datepicker__day,.react-datepicker__time-name{color:#000;display:inline-block;width:1.7rem;line-height:1.7rem;text-align:center;margin:.166rem}.react-datepicker__day,.react-datepicker__month-text,.react-datepicker__quarter-text,.react-datepicker__year-text{cursor:pointer}.react-datepicker__day:not([aria-disabled=true]):hover,.react-datepicker__month-text:not([aria-disabled=true]):hover,.react-datepicker__quarter-text:not([aria-disabled=true]):hover,.react-datepicker__year-text:not([aria-disabled=true]):hover{border-radius:.3rem;background-color:#f0f0f0}.react-datepicker__day--today,.react-datepicker__month-text--today,.react-datepicker__quarter-text--today,.react-datepicker__year-text--today{font-weight:700}.react-datepicker__day--highlighted,.react-datepicker__month-text--highlighted,.react-datepicker__quarter-text--highlighted,.react-datepicker__year-text--highlighted{border-radius:.3rem;background-color:#3dcc4a;color:#fff}.react-datepicker__day--highlighted:not([aria-disabled=true]):hover,.react-datepicker__month-text--highlighted:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--highlighted:not([aria-disabled=true]):hover,.react-datepicker__year-text--highlighted:not([aria-disabled=true]):hover{background-color:#32be3f}.react-datepicker__day--highlighted-custom-1,.react-datepicker__month-text--highlighted-custom-1,.react-datepicker__quarter-text--highlighted-custom-1,.react-datepicker__year-text--highlighted-custom-1{color:#f0f}.react-datepicker__day--highlighted-custom-2,.react-datepicker__month-text--highlighted-custom-2,.react-datepicker__quarter-text--highlighted-custom-2,.react-datepicker__year-text--highlighted-custom-2{color:green}.react-datepicker__day--holidays,.react-datepicker__month-text--holidays,.react-datepicker__quarter-text--holidays,.react-datepicker__year-text--holidays{position:relative;border-radius:.3rem;background-color:#ff6803;color:#fff}.react-datepicker__day--holidays .overlay,.react-datepicker__month-text--holidays .overlay,.react-datepicker__quarter-text--holidays .overlay,.react-datepicker__year-text--holidays .overlay{position:absolute;bottom:100%;left:50%;transform:translate(-50%);background-color:#333;color:#fff;padding:4px;border-radius:4px;white-space:nowrap;visibility:hidden;opacity:0;transition:visibility 0s,opacity .3s ease-in-out}.react-datepicker__day--holidays:not([aria-disabled=true]):hover,.react-datepicker__month-text--holidays:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--holidays:not([aria-disabled=true]):hover,.react-datepicker__year-text--holidays:not([aria-disabled=true]):hover{background-color:#cf5300}.react-datepicker__day--holidays:hover .overlay,.react-datepicker__month-text--holidays:hover .overlay,.react-datepicker__quarter-text--holidays:hover .overlay,.react-datepicker__year-text--holidays:hover .overlay{visibility:visible;opacity:1}.react-datepicker__day--selected,.react-datepicker__day--in-selecting-range,.react-datepicker__day--in-range,.react-datepicker__month-text--selected,.react-datepicker__month-text--in-selecting-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--selected,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--selected,.react-datepicker__year-text--in-selecting-range,.react-datepicker__year-text--in-range{border-radius:.3rem;background-color:#216ba5;color:#fff}.react-datepicker__day--selected:not([aria-disabled=true]):hover,.react-datepicker__day--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__day--in-range:not([aria-disabled=true]):hover,.react-datepicker__month-text--selected:not([aria-disabled=true]):hover,.react-datepicker__month-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__month-text--in-range:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--selected:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--in-range:not([aria-disabled=true]):hover,.react-datepicker__year-text--selected:not([aria-disabled=true]):hover,.react-datepicker__year-text--in-selecting-range:not([aria-disabled=true]):hover,.react-datepicker__year-text--in-range:not([aria-disabled=true]):hover{background-color:#1d5d90}.react-datepicker__day--keyboard-selected,.react-datepicker__month-text--keyboard-selected,.react-datepicker__quarter-text--keyboard-selected,.react-datepicker__year-text--keyboard-selected{border-radius:.3rem;background-color:#bad9f1;color:#000}.react-datepicker__day--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__month-text--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__quarter-text--keyboard-selected:not([aria-disabled=true]):hover,.react-datepicker__year-text--keyboard-selected:not([aria-disabled=true]):hover{background-color:#1d5d90}.react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__month-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__quarter-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range),.react-datepicker__year-text--in-selecting-range:not(.react-datepicker__day--in-range,.react-datepicker__month-text--in-range,.react-datepicker__quarter-text--in-range,.react-datepicker__year-text--in-range){background-color:#216ba580}.react-datepicker__month--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__month--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range),.react-datepicker__year--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,.react-datepicker__month-text--in-selecting-range,.react-datepicker__quarter-text--in-selecting-range,.react-datepicker__year-text--in-selecting-range){background-color:#f0f0f0;color:#000}.react-datepicker__day--disabled,.react-datepicker__month-text--disabled,.react-datepicker__quarter-text--disabled,.react-datepicker__year-text--disabled{cursor:default;color:#ccc}.react-datepicker__day--disabled .overlay,.react-datepicker__month-text--disabled .overlay,.react-datepicker__quarter-text--disabled .overlay,.react-datepicker__year-text--disabled .overlay{position:absolute;bottom:70%;left:50%;transform:translate(-50%);background-color:#333;color:#fff;padding:4px;border-radius:4px;white-space:nowrap;visibility:hidden;opacity:0;transition:visibility 0s,opacity .3s ease-in-out}.react-datepicker__input-container{position:relative;display:inline-block;width:100%}.react-datepicker__input-container .react-datepicker__calendar-icon{position:absolute;padding:.5rem;box-sizing:content-box}.react-datepicker__view-calendar-icon input{padding:6px 10px 5px 25px}.react-datepicker__year-read-view,.react-datepicker__month-read-view,.react-datepicker__month-year-read-view{border:1px solid transparent;border-radius:.3rem;position:relative}.react-datepicker__year-read-view:hover,.react-datepicker__month-read-view:hover,.react-datepicker__month-year-read-view:hover{cursor:pointer}.react-datepicker__year-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__year-read-view:hover .react-datepicker__month-read-view--down-arrow,.react-datepicker__month-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view:hover .react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view:hover .react-datepicker__year-read-view--down-arrow,.react-datepicker__month-year-read-view:hover .react-datepicker__month-read-view--down-arrow{border-top-color:#b3b3b3}.react-datepicker__year-read-view--down-arrow,.react-datepicker__month-read-view--down-arrow,.react-datepicker__month-year-read-view--down-arrow{transform:rotate(135deg);right:-16px;top:0}.react-datepicker__year-dropdown,.react-datepicker__month-dropdown,.react-datepicker__month-year-dropdown{background-color:#f0f0f0;position:absolute;width:50%;left:25%;top:30px;z-index:1;text-align:center;border-radius:.3rem;border:1px solid #aeaeae}.react-datepicker__year-dropdown:hover,.react-datepicker__month-dropdown:hover,.react-datepicker__month-year-dropdown:hover{cursor:pointer}.react-datepicker__year-dropdown--scrollable,.react-datepicker__month-dropdown--scrollable,.react-datepicker__month-year-dropdown--scrollable{height:150px;overflow-y:scroll}.react-datepicker__year-option,.react-datepicker__month-option,.react-datepicker__month-year-option{line-height:20px;width:100%;display:block;margin-left:auto;margin-right:auto}.react-datepicker__year-option:first-of-type,.react-datepicker__month-option:first-of-type,.react-datepicker__month-year-option:first-of-type{border-top-left-radius:.3rem;border-top-right-radius:.3rem}.react-datepicker__year-option:last-of-type,.react-datepicker__month-option:last-of-type,.react-datepicker__month-year-option:last-of-type{-webkit-user-select:none;-moz-user-select:none;user-select:none;border-bottom-left-radius:.3rem;border-bottom-right-radius:.3rem}.react-datepicker__year-option:hover,.react-datepicker__month-option:hover,.react-datepicker__month-year-option:hover{background-color:#ccc}.react-datepicker__year-option:hover .react-datepicker__navigation--years-upcoming,.react-datepicker__month-option:hover .react-datepicker__navigation--years-upcoming,.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-upcoming{border-bottom-color:#b3b3b3}.react-datepicker__year-option:hover .react-datepicker__navigation--years-previous,.react-datepicker__month-option:hover .react-datepicker__navigation--years-previous,.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-previous{border-top-color:#b3b3b3}.react-datepicker__year-option--selected,.react-datepicker__month-option--selected,.react-datepicker__month-year-option--selected{position:absolute;left:15px}.react-datepicker__close-icon{cursor:pointer;background-color:transparent;border:0;outline:0;padding:0 6px 0 0;position:absolute;top:0;right:0;height:100%;display:table-cell;vertical-align:middle}.react-datepicker__close-icon:after{cursor:pointer;background-color:#216ba5;color:#fff;border-radius:50%;height:16px;width:16px;padding:2px;font-size:12px;line-height:1;text-align:center;display:table-cell;vertical-align:middle;content:"×"}.react-datepicker__close-icon--disabled{cursor:default}.react-datepicker__close-icon--disabled:after{cursor:default;background-color:#ccc}.react-datepicker__today-button{background:#f0f0f0;border-top:1px solid #aeaeae;cursor:pointer;text-align:center;font-weight:700;padding:5px 0;clear:left}.react-datepicker__portal{position:fixed;width:100vw;height:100vh;background-color:#000c;left:0;top:0;justify-content:center;align-items:center;display:flex;z-index:2147483647}.react-datepicker__portal .react-datepicker__day-name,.react-datepicker__portal .react-datepicker__day,.react-datepicker__portal .react-datepicker__time-name{width:3rem;line-height:3rem}@media(max-width:400px),(max-height:550px){.react-datepicker__portal .react-datepicker__day-name,.react-datepicker__portal .react-datepicker__day,.react-datepicker__portal .react-datepicker__time-name{width:2rem;line-height:2rem}}.react-datepicker__portal .react-datepicker__current-month,.react-datepicker__portal .react-datepicker-time__header{font-size:1.44rem}.react-datepicker__children-container{width:13.8rem;margin:.4rem;padding-right:.2rem;padding-left:.2rem;height:auto}.react-datepicker__aria-live{position:absolute;clip-path:circle(0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;width:1px;white-space:nowrap}.react-datepicker__calendar-icon{width:1em;height:1em;vertical-align:-.125em}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as l,j as e}from"./cNrhgGc1.js";import{E as Z,d as M,r as $e,W as Q,K as Ie,X as Fe,Y as Pe,M as Le,h as Te,P as Be,w as ve}from"./C9jy61eu.js";import{E as De}from"./C8uM3AX8.js";import{A as Ee,m as se,u as Re}from"./CxQ08qFN.js";import{u as We}from"./B6wPWJ35.js";import"./C-KIc3Wc.js";import"./BJgZIVUQ.js";const ze={pr:"⎋",file:"◇",artifact:"▪",log:"▸",decision:"◈"};function Ue(c){return c>=.8?"#BFFF00":c>=.5?"#F5B700":"#FF6B88"}function Oe(c){const t=c.match(/https?:\/\/\S+/);return t?t[0]:null}function Xe({evidenceType:c,title:t,summary:h,sourceUrl:y,confidence:C,payload:b,icon:_,label:f,onOpenTerminal:Y}){const[R,X]=l.useState(!1),E=t??f??null,$=c??(_?_.toUpperCase():null),w=_?ze[_]:null,v=_==="pr"&&f?Oe(f):null;return e.jsxs("div",{className:"rounded-xl border border-white/[0.06] bg-white/[0.02] px-3 py-2.5",children:[e.jsxs("div",{className:"flex items-start gap-2.5 cursor-pointer",onClick:()=>X(g=>!g),children:[($||w)&&e.jsxs("span",{className:"mt-0.5 flex-shrink-0 rounded bg-white/[0.06] px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-secondary",children:[w?e.jsx("span",{className:"mr-1",children:w}):null,$]}),e.jsxs("div",{className:"min-w-0 flex-1",children:[E&&e.jsx("p",{className:"text-body font-medium text-primary",children:y?e.jsx("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:"text-[#D8FFA1] hover:underline",onClick:g=>g.stopPropagation(),children:E}):v?e.jsx("a",{href:v,target:"_blank",rel:"noopener noreferrer",className:"text-[#D8FFA1] hover:underline",onClick:g=>g.stopPropagation(),children:E}):E}),h&&e.jsx("p",{className:`mt-0.5 text-caption text-secondary ${R?"":"line-clamp-2"}`,children:h})]}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`mt-1 flex-shrink-0 text-muted transition-transform ${R?"rotate-180":""}`,children:e.jsx("path",{d:"m6 9 6 6 6-6"})})]}),C!=null&&e.jsxs("div",{className:"mt-2 flex items-center gap-2",children:[e.jsx("div",{className:"h-1 flex-1 overflow-hidden rounded-full bg-white/[0.06]",children:e.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${Math.round(C*100)}%`,backgroundColor:Ue(C)}})}),e.jsxs("span",{className:"text-micro text-muted tabular-nums",children:[Math.round(C*100),"%"]})]}),e.jsx(Ee,{children:R&&e.jsx(se.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.2},className:"overflow-hidden",children:e.jsxs("div",{className:"mt-2 space-y-2",children:[_==="log"&&Y&&e.jsxs("button",{type:"button",onClick:g=>{g.stopPropagation(),Y()},className:"inline-flex items-center gap-1.5 rounded-lg border border-white/[0.12] bg-white/[0.04] px-3 py-1.5 text-caption font-semibold text-primary transition-colors hover:bg-white/[0.08]",children:[e.jsx("span",{className:"font-mono text-micro",children:">_"}),"Open in terminal"]}),b&&Object.keys(b).length>0&&e.jsx("pre",{className:"max-h-40 overflow-auto rounded-lg bg-black/40 p-2.5 text-micro text-secondary font-mono",children:JSON.stringify(b,null,2)})]})})})]})}function Ke({segments:c}){return c.length===0?null:e.jsx("nav",{className:"flex items-center gap-1.5 min-w-0 text-caption text-secondary",children:c.map((t,h)=>e.jsxs("span",{className:"flex items-center gap-1.5 min-w-0",children:[h>0&&e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"flex-shrink-0 text-faint",children:e.jsx("path",{d:"m9 18 6-6-6-6"})}),t.icon&&e.jsx(Z,{type:t.icon,size:11,className:"flex-shrink-0 opacity-80"}),t.onClick?e.jsx("button",{type:"button",onClick:t.onClick,className:"truncate transition-colors hover:text-primary",children:t.label}):e.jsx("span",{className:"truncate",children:t.label})]},h))})}const _e=typeof navigator<"u"&&/Mac|iPhone|iPad/.test(navigator.userAgent);function Je(c){try{return JSON.stringify(c,null,2)}catch{return null}}function qe(c){if(typeof c!="string")return null;const t=c.trim().toLowerCase();return t==="rejected"?"declined":t==="approved"||t==="declined"||t==="cancelled"?t:null}function Ne(c,t){return!c||c.trim().length===0?t:Te(c.trim())||t}function Ve(c){switch(c){case"spawn_guard_blocked":return"Spawn Guard";case"autopilot_failure":return"Autopilot Failure";case"budget_exceeded":return"Budget Exceeded";case"scope_change":return"Scope Change";case"conflict_resolution":return"Conflict Resolution";case"approval_required":return"Approval Required";case"review_required":return"Review Required";case"permission_request":return"Permission Request";default:return c.replace(/[_-]/g," ").replace(/\b\w/g,t=>t.toUpperCase())}}function Ge(c){const t=c.toLowerCase();return t==="critical"||t==="p0"?M.red:t==="high"||t==="p1"?M.amber:t==="medium"||t==="p2"?M.iris:"rgba(255,255,255,0.5)"}function Qe({open:c,decision:t,onClose:h,onApprove:y,onReject:C,initiativeTitle:b,workstreamTitle:_,onNavigate:f,currentIndex:Y,totalCount:R,onFocusRunId:X}){const[E,$]=l.useState("idle"),[w,v]=l.useState(null),[g,F]=l.useState(null),[N,W]=l.useState(""),[z,P]=l.useState(!1),[xe,ne]=l.useState(!1),[ie,me]=l.useState(!1),K=l.useRef(null),ae=l.useRef(),L=l.useRef(h);L.current=h,l.useEffect(()=>{if(c){$("idle"),v(null);const i=(t==null?void 0:t.selectedOptionId)??(t!=null&&t.options&&t.options.length===1?t.options[0].id:null);F(i),W(""),P(!1),ne(!1),me(!1)}return()=>{ae.current&&clearTimeout(ae.current)}},[c,t==null?void 0:t.id]);const m=t==null?void 0:t.metadata,le=l.useMemo(()=>{if(!m)return[];const i=m,n=i.decision_options??i.options??i.actions??null;if(!Array.isArray(n))return[];const I=[],B=new Set;for(let A=0;A<n.length;A+=1){const G=n[A];if(typeof G=="string"){const pe=G.trim();if(!pe)continue;const r=`option-${A+1}`;if(B.has(r))continue;B.add(r),I.push({id:r,label:pe,description:null,impliedStatus:null,actionType:null,requiresNote:!1});continue}if(!G||typeof G!="object")continue;const x=G,ue=typeof x.id=="string"&&x.id.trim()||typeof x.option_id=="string"&&x.option_id.trim()||typeof x.action_id=="string"&&x.action_id.trim()||`option-${A+1}`;if(B.has(ue))continue;const ye=typeof x.label=="string"&&x.label.trim()||typeof x.title=="string"&&x.title.trim()||typeof x.name=="string"&&x.name.trim()||typeof x.action=="string"&&x.action.trim()||null;ye&&(B.add(ue),I.push({id:ue,label:ye,description:typeof x.description=="string"?x.description:null,impliedStatus:qe(x.implied_status)??qe(x.status),actionType:typeof x.action_type=="string"&&x.action_type||typeof x.type=="string"&&x.type||null,requiresNote:x.requires_note===!0||x.requiresNote===!0||x.note_required===!0}))}return I.slice(0,12)},[m]),q=l.useMemo(()=>t!=null&&t.options&&t.options.length>0?t.options:le,[t==null?void 0:t.options,le]),u=l.useMemo(()=>q.find(i=>i.id===g)??null,[q,g]),T=l.useMemo(()=>{const i=((t==null?void 0:t.context)??"").trim();if(i)return i;if(!m)return"";const n=m,I=(typeof n.summary=="string"?n.summary:null)??(typeof n.description=="string"?n.description:null)??"";return String(I??"").trim()},[t==null?void 0:t.context,m]),U=l.useMemo(()=>{const i=(t==null?void 0:t.waitingMinutes)??0;return i>=15?M.red:i>=5?M.amber:M.teal},[t==null?void 0:t.waitingMinutes]),p=l.useCallback(async()=>{if(!t)return;const i=Je({decision:t,metadata:m});if(i)try{await navigator.clipboard.writeText(i),ne(!0),setTimeout(()=>ne(!1),2e3)}catch{}},[t,m]),O=l.useCallback(()=>{const i=N.trim(),n=u==null?void 0:u.id;if(!(!i&&!n))return{note:i.length>0?i:void 0,optionId:n??void 0}},[N,u]),k=l.useCallback(async()=>{if(!t||!y)return;if(q.length>0&&!u){v("Select an option before approving this decision.");return}if(u!=null&&u.requiresNote&&N.trim().length===0){v("A note is required for the selected option."),P(!0),requestAnimationFrame(()=>{var n;return(n=K.current)==null?void 0:n.focus()});return}let i=!1;if($(n=>n==="approving"||n==="rejecting"?n:(i=!0,"approving")),!!i){v(null);try{const n=await y(t.id,O());n.failed>0?($("error"),v(Ne(n.firstError,"Approval failed. Please try again."))):($("success"),ae.current=setTimeout(()=>L.current(),800))}catch(n){$("error");const I=n instanceof Error?n.message:"";v(Ne(I,"Approval failed."))}}},[O,t,N,y,q.length,u]),H=l.useCallback(async()=>{if(!t||!C)return;if(q.length>0&&!u){v("Select an option before rejecting this decision.");return}if(u!=null&&u.requiresNote&&N.trim().length===0){v("A note is required for the selected option."),P(!0),requestAnimationFrame(()=>{var n;return(n=K.current)==null?void 0:n.focus()});return}let i=!1;if($(n=>n==="approving"||n==="rejecting"?n:(i=!0,"rejecting")),!!i){v(null);try{const n=await C(t.id,O());n.failed>0?($("error"),v(Ne(n.firstError,"Rejection failed. Please try again."))):($("rejected"),ae.current=setTimeout(()=>L.current(),800))}catch(n){$("error");const I=n instanceof Error?n.message:"";v(Ne(I,"Rejection failed."))}}},[O,t,N,C,q.length,u]);if(l.useEffect(()=>{if(!c)return;const i=n=>{var B;if((n.metaKey||n.ctrlKey)&&n.key==="Enter"){n.preventDefault(),k();return}const I=(B=n.target)==null?void 0:B.tagName;if(!(I==="INPUT"||I==="TEXTAREA"))switch(n.key){case"j":n.preventDefault(),f==null||f(1);break;case"k":n.preventDefault(),f==null||f(-1);break;case"a":n.preventDefault(),k();break;case"r":n.preventDefault(),H();break;case"n":n.preventDefault(),P(A=>!A),z||requestAnimationFrame(()=>{var A;return(A=K.current)==null?void 0:A.focus()});break}};return document.addEventListener("keydown",i),()=>document.removeEventListener("keydown",i)},[c,k,H,f,z]),!c||!t)return null;const oe=E==="approving"||E==="rejecting",ee=E==="success"||E==="rejected",J=(t.status??"pending").toLowerCase(),he=!J.includes("approved")&&!J.includes("resolved")&&!J.includes("rejected")&&!J.includes("declined")&&!J.includes("cancelled"),Ce=q.length>0&&!u,fe=(u==null?void 0:u.requiresNote)===!0&&N.trim().length===0,V=oe||Ce||fe,te=t.evidenceRefs??[],S=te.length>0,ge=t.recommendedAction??null,be=t.decisionType??null,re=t.priority??null,ce=t.occurrenceCount??null,je=t.sourceRunId??null,j=[];b&&j.push({label:b,icon:"initiative"}),_&&j.push({label:_,icon:"workstream"});const de=[["ID",t.id],["Type",t.decisionType],["Dedupe key",t.dedupeKey],["Source system",t.sourceSystem],["Conflict source",t.conflictSource],["Agent ID",t.agentId],["Source run",t.sourceRunId],["Source session",t.sourceSessionId],["Source stream",t.sourceStreamId]].filter(([,i])=>i!=null);if(ee){const i=E==="success",n=i?M.lime:M.red;return e.jsx($e,{open:c,onClose:h,maxWidth:"max-w-xl",fitContent:!0,children:e.jsxs("div",{className:"flex flex-col items-center justify-center px-8 py-12",children:[e.jsx("div",{className:"mb-4 flex h-16 w-16 items-center justify-center rounded-full",style:{backgroundColor:`${n}18`,border:`1.5px solid ${n}40`},children:i?e.jsx("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:n,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}):e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:n,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M18 6L6 18"}),e.jsx("path",{d:"M6 6l12 12"})]})}),e.jsx("p",{className:"text-heading font-semibold text-white",children:i?"Approved":"Rejected"}),e.jsx("p",{className:"mt-1 text-body text-secondary",children:t.title})]})})}return e.jsx($e,{open:c,onClose:h,maxWidth:"max-w-xl",children:e.jsxs("div",{className:"flex h-full min-h-0 w-full flex-col",children:[e.jsx("div",{className:"h-[2px] w-full flex-shrink-0",style:{background:`linear-gradient(90deg, ${U}60, ${U}20, transparent)`}}),f&&e.jsxs("div",{className:"flex items-center justify-between px-6 pt-3 pb-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:()=>f(-1),className:"rounded p-1 text-muted hover:text-secondary hover:bg-white/[0.06] transition-colors",title:"Previous (k)",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"m15 18-6-6 6-6"})})}),e.jsx("button",{type:"button",onClick:()=>f(1),className:"rounded p-1 text-muted hover:text-secondary hover:bg-white/[0.06] transition-colors",title:"Next (j)",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"m9 18 6-6-6-6"})})}),Y!=null&&R!=null&&e.jsxs("span",{className:"text-micro text-muted tabular-nums",children:[Y+1," of ",R]})]}),e.jsx("button",{type:"button",onClick:h,"aria-label":"Close",className:"rounded p-1 text-muted hover:text-secondary hover:bg-white/[0.06] transition-colors",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M18 6 6 18M6 6l12 12"})})})]}),j.length>0&&e.jsx("div",{className:"px-6 pt-2",children:e.jsx(Ke,{segments:j})}),e.jsxs("div",{className:"flex items-start justify-between gap-3 px-6 pt-4 pb-4",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("div",{className:"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg",style:{backgroundColor:`${U}14`,border:`1px solid ${U}30`},children:e.jsx(Z,{type:"decision",size:14})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h2",{className:"text-title font-medium leading-tight text-white mb-2",children:t.title||"Decision Required"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-body text-secondary",children:[e.jsx("span",{children:t.agentName||"OrgX Autopilot"}),e.jsx("span",{className:"text-white/[0.15]",children:"|"}),e.jsx("span",{children:Q(t.waitingMinutes).text}),be&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-white/[0.15]",children:"|"}),e.jsx("span",{className:"text-primary",children:Ve(be)})]}),re&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-white/[0.15]",children:"|"}),e.jsx("span",{className:"font-medium",style:{color:Ge(re)},children:re})]})]}),ce!=null&&ce>1&&e.jsxs("p",{className:"mt-2 text-caption text-muted",children:["Seen ",ce," times",t.firstSeenAt&&e.jsxs(e.Fragment,{children:[" · first ",Ie(t.firstSeenAt)]}),t.lastSeenAt&&e.jsxs(e.Fragment,{children:[" · last ",Ie(t.lastSeenAt)]})]})]})]})}),!f&&e.jsx("button",{type:"button",onClick:h,"aria-label":"Close",className:"mt-0.5 flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg text-muted transition-colors hover:bg-white/[0.06] hover:text-white",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M18 6L6 18"}),e.jsx("path",{d:"M6 6l12 12"})]})})]}),e.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto px-6 pb-4",children:[(t.initiativeId||t.workstreamId)&&e.jsx("div",{className:"mb-4",children:e.jsx(Fe,{nodes:Pe({initiativeId:t.initiativeId,initiativeTitle:b,workstreamId:t.workstreamId,workstreamTitle:_,agentName:t.agentName,agentId:t.agentId}),activeId:t.workstreamId,compact:!0})}),ge&&e.jsxs("div",{className:"mb-4 rounded-xl border border-cyan-300/[0.28] bg-cyan-500/[0.12] px-4 py-3",children:[e.jsx("p",{className:"text-micro font-semibold uppercase tracking-wider text-cyan-200 mb-1",children:"Recommended"}),e.jsx("p",{className:"text-body text-cyan-100",children:ge})]}),S&&e.jsxs("div",{className:"mb-4",children:[e.jsx("p",{className:"mb-2 px-1 text-micro font-semibold uppercase tracking-wider text-muted",children:"Evidence"}),e.jsx("div",{className:"space-y-1.5",children:te.map((i,n)=>e.jsx(Xe,{evidenceType:i.evidenceType,title:i.title,summary:i.summary,sourceUrl:i.sourceUrl,confidence:i.confidence,payload:i.payload},n))})]}),T?e.jsx("div",{className:"rounded-xl border border-white/[0.06] bg-white/[0.02] px-4 py-3",children:e.jsx(Le,{text:T,mode:"block"})}):e.jsx("p",{className:"px-1 text-body text-muted italic",children:"No additional context provided."}),q.length>0&&e.jsxs("div",{className:"mt-8",children:[e.jsx("p",{className:"mb-3 px-1 text-[11px] font-semibold uppercase tracking-widest text-muted",children:"Options"}),e.jsx("div",{className:"space-y-1 relative",children:q.map(i=>{const n=g===i.id;return e.jsxs("button",{type:"button",onClick:()=>{F(n?null:i.id),i.requiresNote&&P(!0)},disabled:oe,className:"group relative flex w-full items-start gap-4 px-4 py-4 text-left focus:outline-none",children:[n&&e.jsx(se.div,{layoutId:"decision-option-bg",className:"absolute inset-0 rounded-xl",style:{backgroundColor:`${M.lime}12`},transition:{type:"spring",stiffness:400,damping:25}}),!n&&e.jsx("div",{className:"absolute inset-0 rounded-xl opacity-0 transition-opacity group-hover:bg-white/[0.03]"}),e.jsx("div",{className:"relative mt-0.5 flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full border-[1.5px] transition-colors",style:{borderColor:n?M.lime:"rgba(255,255,255,0.2)"},children:e.jsx(Ee,{children:n&&e.jsx(se.div,{initial:{scale:0},animate:{scale:1},exit:{scale:0},transition:{type:"spring",stiffness:500,damping:30},className:"h-2.5 w-2.5 rounded-full",style:{backgroundColor:M.lime}})})}),e.jsxs("div",{className:"relative min-w-0 flex-1",children:[e.jsx("span",{className:`block text-[15px] ${n?"font-medium text-white":"text-primary"}`,children:i.label}),i.description&&e.jsx("p",{className:"mt-1 text-[13px] leading-relaxed text-secondary",children:i.description}),i.requiresNote&&e.jsx("p",{className:"mt-1.5 text-[11px] font-medium uppercase tracking-wider text-amber-400",children:"Note required"})]})]},i.id)})})]}),he&&e.jsxs("div",{className:"mt-4",children:[e.jsxs("button",{type:"button",onClick:()=>{P(i=>!i),z||requestAnimationFrame(()=>{var i;return(i=K.current)==null?void 0:i.focus()})},className:"flex w-full items-center gap-2 px-1 text-caption text-secondary transition-colors hover:text-white",children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"transition-transform",style:{transform:z?"rotate(90deg)":"rotate(0deg)"},children:e.jsx("polyline",{points:"9 18 15 12 9 6"})}),"Add a note"]}),z&&e.jsxs("div",{className:"mt-2",children:[e.jsx("textarea",{ref:K,value:N,onChange:i=>W(i.target.value),disabled:oe,placeholder:"Optional context for this decision...",rows:3,className:"w-full resize-none rounded-xl border border-white/[0.08] bg-white/[0.03] px-4 py-3 text-body text-primary placeholder-white/30 outline-none transition-colors focus:border-white/[0.16] focus:bg-white/[0.04]"}),(u==null?void 0:u.requiresNote)&&N.trim().length===0&&e.jsx("p",{className:"mt-2 text-caption text-amber-300",children:"This option requires a note before submission."})]})]}),je&&X&&e.jsx("div",{className:"mt-4",children:e.jsxs("button",{type:"button",onClick:()=>X(je),className:"inline-flex items-center gap-1.5 text-caption text-[#D8FFA1] transition-colors hover:text-white",children:[e.jsx(Z,{type:"session",size:12}),"View source run"]})}),e.jsx("div",{className:"mt-4 border-t border-white/[0.06] pt-4",children:e.jsx(De,{entityType:"decision",entityId:t.id})}),de.length>0&&e.jsxs("div",{className:"mt-4 border-t border-white/[0.06] pt-2",children:[e.jsxs("button",{type:"button",onClick:()=>me(i=>!i),className:"flex w-full items-center justify-between text-micro font-semibold uppercase tracking-wider text-muted hover:text-secondary transition-colors",children:[e.jsx("span",{children:"Technical details"}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${ie?"rotate-180":""}`,children:e.jsx("path",{d:"m6 9 6 6 6-6"})})]}),ie&&e.jsx("div",{className:"mt-2 space-y-0.5",children:de.map(([i,n])=>e.jsxs("div",{className:"flex gap-2 text-micro",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:i}),e.jsx("span",{className:"text-secondary truncate",children:n})]},i))})]}),e.jsxs("div",{className:"mt-4 flex flex-wrap gap-x-3 gap-y-1 text-micro text-muted opacity-60",children:[f&&e.jsx("span",{children:"j/k nav"}),e.jsx("span",{children:"a approve"}),e.jsx("span",{children:"r reject"}),e.jsx("span",{children:"n note"}),e.jsxs("span",{children:[_e?"⌘":"Ctrl","+Enter approve"]}),e.jsx("span",{children:"esc close"})]})]}),w&&e.jsxs("div",{className:"flex items-center gap-2 border-t border-white/[0.06] px-6 py-3",children:[e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:M.red,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"12",x2:"12",y1:"8",y2:"12"}),e.jsx("line",{x1:"12",x2:"12.01",y1:"16",y2:"16"})]}),e.jsx("p",{className:"text-caption text-red-300",children:w})]}),he&&e.jsx("div",{className:"relative mt-auto border-t border-white/[0.04] bg-black/60 px-6 py-5 backdrop-blur-xl",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[C&&e.jsx(se.button,{whileTap:{scale:.97},type:"button",onClick:H,disabled:V,className:"rounded-lg px-4 py-2 text-[14px] font-medium text-secondary transition-colors hover:text-red-400 disabled:opacity-40 focus:outline-none",children:E==="rejecting"?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"inline-block h-3 w-3 animate-spin rounded-full border-[1.5px] border-current border-t-transparent"}),"Rejecting"]}):"Reject"}),e.jsx("button",{type:"button",onClick:p,className:"rounded-lg px-2 py-2 text-[13px] text-muted transition-colors hover:text-secondary focus:outline-none",title:"Copy decision as JSON",children:xe?"Copied":"Copy JSON"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("span",{className:"hidden text-[13px] text-muted sm:block",children:[_e?"⌘":"Ctrl","+Enter"]}),e.jsx(se.button,{whileTap:!y||V?void 0:{scale:.97},type:"button",onClick:k,disabled:!y||V,"data-modal-autofocus":"true",className:"rounded-lg px-6 py-2.5 text-[14px] font-semibold transition-all focus:outline-none",style:{backgroundColor:!y||V?"rgba(255,255,255,0.06)":M.lime,color:!y||V?"rgba(255,255,255,0.4)":"#000"},children:E==="approving"?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"inline-block h-3 w-3 animate-spin rounded-full border-[1.5px] border-black/40 border-t-black"}),"Approving"]}):"Approve"})]})]})})]})})}const Ae=40;function ke(c,t){return!c||c.trim().length===0?t:Te(c.trim())||t}function Me(c,t,h){const y=c==="approve"?`Approval failed for ${t} decision${t===1?"":"s"}.`:`Rejection failed for ${t} decision${t===1?"":"s"}.`;return ke(h,y)}function Ze(c,t){return`${c}_${t}`}const it=l.memo(function({decisions:t,focusDecisionId:h=null,onFocusDecisionHandled:y,onApproveDecision:C,onRejectDecision:b,onApproveAll:_,onBulkDecisionAction:f,mutationState:Y,showHeader:R=!0,panelStyle:X="card",className:E}){var pe;const $=Re(),[w,v]=l.useState(!1),[g,F]=l.useState(new Set),[N,W]=l.useState(new Set),[z,P]=l.useState(new Set),{enqueue:xe,ToastRenderer:ne}=We(),[ie,me]=l.useState("approve_selected"),[K,ae]=l.useState(""),[L,m]=l.useState(null),[le,q]=l.useState(Ae),[u,T]=l.useState(null),U=l.useRef(null),p=l.useMemo(()=>{const r=new Set;return[...t].filter(a=>r.has(a.id)?!1:(r.add(a.id),!0)).sort((a,s)=>{if(a.waitingMinutes!==s.waitingMinutes)return s.waitingMinutes-a.waitingMinutes;const o=Date.parse(a.requestedAt??a.updatedAt??""),d=Date.parse(s.requestedAt??s.updatedAt??""),D=Number.isFinite(o)?o:0;return(Number.isFinite(d)?d:0)-D})},[t]);l.useEffect(()=>{W(r=>{const a=new Set(p.map(o=>o.id)),s=new Set;for(const o of r)a.has(o)&&s.add(o);return s})},[p]);const O=N.size,k=l.useMemo(()=>p.filter(r=>!z.has(r.id)).slice(0,le),[p,le,z]),H=l.useMemo(()=>{if(k.length===0)return!1;for(const r of k)if(!N.has(r.id))return!1;return!0},[N,k]),oe=l.useMemo(()=>u?p.find(r=>r.id===u)??null:null,[u,p]),ee=l.useMemo(()=>u?p.findIndex(r=>r.id===u):-1,[u,p]),J=l.useCallback(r=>{const a=ee+r;a>=0&&a<p.length&&T(p[a].id)},[ee,p]),he=async(r,a)=>{m(null),F(o=>{const d=new Set(o);return d.add(r),d});const s=await C(r,a);return s.failed>0?m(Me("approve",s.failed,s.firstError)):s.updated>0&&m("Decision approved. Changes synced."),F(o=>{const d=new Set(o);return d.delete(r),d}),s},Ce=b?async(r,a)=>{m(null),F(o=>{const d=new Set(o);return d.add(r),d});const s=await b(r,a);return s.failed>0?m(Me("reject",s.failed,s.firstError)):s.updated>0&&m("Decision rejected. Changes synced."),F(o=>{const d=new Set(o);return d.delete(r),d}),s}:void 0;l.useEffect(()=>{q(r=>p.length===0?0:Math.min(Math.max(Ae,r),p.length))},[p.length]),l.useEffect(()=>{const r=(h??"").trim();if(!r){U.current=null;return}U.current===r||!p.some(s=>s.id===r)||(U.current=r,T(r),y==null||y(r))},[h,y,p]);const fe=r=>{W(a=>{const s=new Set(a);return s.has(r)?s.delete(r):s.add(r),s})},V=()=>{W(r=>{if(k.length===0)return r;const a=new Set(r),s=H;for(const o of k)s?a.delete(o.id):a.add(o.id);return a})},te=l.useMemo(()=>{const r=p.map(s=>s.id).filter(s=>N.has(s)),a=k.map(s=>s.id);return[{id:"approve_selected",label:`Approve selected (${r.length})`,action:"approve",ids:r},{id:"reject_selected",label:`Reject selected (${r.length})`,action:"reject",ids:r,hidden:!b},{id:"approve_visible",label:`Approve visible (${a.length})`,action:"approve",ids:a},{id:"reject_visible",label:`Reject visible (${a.length})`,action:"reject",ids:a,hidden:!b}].filter(s=>!s.hidden)},[b,N,p,k]),S=l.useMemo(()=>te.find(r=>r.id===ie)??te[0]??null,[ie,te]),ge=async(r,a,s)=>{if(r.length===0)return{updated:0,failed:0};if(a==="approve"&&r.length===p.length&&!s)return _();let o=0,d=0,D;for(const Se of r)try{const we=a==="approve"?await C(Se,s?{note:s}:void 0):b?await b(Se,s?{note:s}:void 0):{updated:0,failed:1};o+=we.updated,d+=we.failed,!D&&we.firstError&&(D=we.firstError)}catch{d+=1}return{updated:o,failed:d,firstError:D}},be=async()=>{if(!S||w)return;const r=S.ids;if(r.length===0){m("No decisions selected for this action.");return}m(null),v(!0),F(new Set(r));const a=K.trim();try{const s=f?await f(r,S.action,a.length>0?a:void 0):await ge(r,S.action,a.length>0?a:void 0),o=S.action==="approve"?"Approved":"Rejected";if(s.failed>0){const d=`${o} ${s.updated}; ${s.failed} failed.`,D=ke(s.firstError,d);m(D===d?d:`${d} ${D}`)}else s.updated>0?m(`${o} ${s.updated} decision${s.updated===1?"":"s"}.`):m("No decisions were updated.");W(new Set)}catch(s){const o=s instanceof Error?s.message:"";m(ke(o,"Bulk decision action failed."))}finally{v(!1),F(new Set)}},re=async r=>{if(!(g.has(r)||w)){m(null),F(a=>{const s=new Set(a);return s.add(r),s});try{const a=await C(r);a.failed>0?m(Me("approve",a.failed,a.firstError)):a.updated>0&&m("Decision approved.")}catch(a){const s=a instanceof Error?a.message:"";m(ke(s,"Decision approval failed."))}finally{F(a=>{const s=new Set(a);return s.delete(r),s}),W(a=>{if(!a.has(r))return a;const s=new Set(a);return s.delete(r),s})}}},ce=l.useCallback(r=>{g.has(r.id)||w||(P(a=>new Set(a).add(r.id)),xe({message:`Approved '${r.title.length>40?r.title.slice(0,40)+"…":r.title}'`,onUndo:()=>{P(a=>{const s=new Set(a);return s.delete(r.id),s})},onCommit:()=>{P(a=>{const s=new Set(a);return s.delete(r.id),s}),C(r.id).catch(()=>{m("Approval failed. Try again from the decision panel.")})}}))},[g,w,xe,C]);l.useEffect(()=>{if(!L)return;const r=window.setTimeout(()=>m(null),5200);return()=>window.clearTimeout(r)},[L]);const je=L!==null&&!L.toLowerCase().includes("fail"),j=w||g.size>0,de=Math.max(g.size,w?O:0),i=j?`Applying ${de} decision action${de===1?"":"s"}…`:L??null,n=j?"processing":L?je?"success":"warning":"idle",I=!$&&k.length<=32,B=S!==null&&S.ids.length>0&&!w,A=p.length;(pe=p[0])==null||pe.waitingMinutes;const G=S!=null&&S.id.includes("visible")?"visible":"selected",x=(S==null?void 0:S.action)??"approve",ue=i!==null||n!=="idle",ye=X==="card"?Be:"div";return e.jsxs(ye,{className:ve("flex h-full min-h-0 flex-col",X==="card"&&"card-enter",E),children:[e.jsx(Qe,{open:u!==null,decision:oe,onClose:()=>T(null),onApprove:he,onReject:Ce,onNavigate:J,currentIndex:ee>=0?ee:void 0,totalCount:p.length}),R?e.jsxs("div",{className:"space-y-2.5 border-b border-subtle px-4 py-3.5",children:[e.jsx("div",{className:"flex items-start justify-between gap-3",children:e.jsxs("div",{className:"min-w-0",children:[e.jsxs("h2",{className:"inline-flex items-center gap-2 text-heading font-semibold text-white",children:[e.jsx(Z,{type:"decision",size:14}),"Decisions"]}),e.jsx("p",{className:"mt-0.5 text-caption text-secondary",children:A>0?`${A} decision${A===1?"":"s"} need${A===1?"s":""} your input`:"All clear — no decisions pending"})]})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[p.length>0&&e.jsx("button",{onClick:V,disabled:j,className:"control-pill h-8 flex-shrink-0 px-3 text-caption font-semibold disabled:opacity-45",children:H?"Clear all":"Select all"}),O>0&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:be,disabled:!B||j,"data-state":B?"active":"idle",className:"control-pill h-8 flex-shrink-0 px-3 text-caption font-semibold disabled:opacity-45",children:w?"Approving…":`Approve ${O} selected`}),b&&e.jsx("button",{type:"button",onClick:()=>me(Ze("reject",G)),disabled:j,"data-state":x==="reject"?"active":"idle",className:ve("control-pill h-8 px-2.5 text-caption font-semibold disabled:opacity-45",x==="reject"&&"border-amber-300/35 bg-amber-400/[0.12] text-amber-100"),children:"Reject"})]})]}),ue?e.jsxs("div",{"aria-live":"polite",className:ve("flex min-h-[32px] items-center gap-2 rounded-lg border px-2.5 py-1.5 text-caption transition-colors",n==="processing"?"border-amber-300/25 bg-amber-400/[0.08] text-amber-100":n==="success"?"border-lime/30 bg-lime/10 text-lime":n==="warning"?"border-red-400/25 bg-red-500/[0.08] text-red-100":"border-strong bg-white/[0.02] text-secondary"),children:[n==="processing"?e.jsx("span",{"aria-hidden":!0,className:"h-3.5 w-3.5 rounded-full border-2 border-amber-200/45 border-t-transparent animate-spin"}):n==="success"?e.jsx(Z,{type:"decision",size:12,className:"opacity-90"}):n==="warning"?e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"opacity-90",children:[e.jsx("path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"}),e.jsx("line",{x1:"12",x2:"12",y1:"9",y2:"13"}),e.jsx("line",{x1:"12",x2:"12.01",y1:"17",y2:"17"})]}):e.jsx("span",{"aria-hidden":!0,className:"h-1.5 w-1.5 rounded-full bg-white/35"}),e.jsx("span",{className:"min-w-0 truncate",children:i})]}):null]}):null,e.jsxs("div",{className:ve("min-h-0 flex-1 space-y-2 overflow-y-auto",R?"p-3":"p-0"),children:[p.length===0&&e.jsx("div",{className:"flex flex-col items-center gap-2.5 rounded-xl border border-subtle bg-white/[0.02] p-4 text-center",children:j?e.jsxs(e.Fragment,{children:[e.jsx("span",{"aria-hidden":!0,className:"h-5 w-5 rounded-full border-2 border-amber-200/45 border-t-transparent animate-spin"}),e.jsx("p",{className:"text-body text-secondary",children:"Finalizing decision updates…"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",className:"text-faint",children:[e.jsx("path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"}),e.jsx("polyline",{points:"22 4 12 14.01 9 11.01"})]}),e.jsx("p",{className:"text-body text-secondary",children:"No pending decisions. All clear."})]})}),I?e.jsx(Ee,{mode:"popLayout",children:k.map((r,a)=>{const s=g.has(r.id),o=N.has(r.id);return e.jsx(se.article,{role:"button",tabIndex:0,onClick:()=>T(r.id),onKeyDown:d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),T(r.id))},drag:!j&&!s?"x":!1,dragConstraints:{left:0,right:0},dragElastic:.3,onDragEnd:(d,D)=>{D.offset.x>120&&ce(r)},initial:w?{opacity:0,x:300}:{opacity:0,y:8,scale:.98},animate:{opacity:1,y:0,x:0,scale:1},exit:{opacity:0,x:300,scale:.95},transition:{duration:.25,ease:[.22,1,.36,1],...w?{delay:a*.04}:{}},layout:!0,className:"rounded-xl border bg-white/[0.03] px-3 py-2.5 transition-[border-color,box-shadow] cv-auto",style:{borderColor:o?`${M.lime}50`:"rgba(255, 255, 255, 0.1)",boxShadow:o?"0 0 0 1px rgba(191, 255, 0, 0.14)":"none"},children:e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:()=>fe(r.id),disabled:s||j,onClick:d=>d.stopPropagation(),className:"mt-0.5 h-4 w-4 rounded border-white/20 bg-black/40 text-lime focus:ring-lime/40"}),e.jsx("div",{className:"min-w-0 flex-1",children:e.jsxs("div",{className:"min-w-0",children:[e.jsxs("p",{className:"flex min-w-0 items-start gap-1.5 text-body font-medium text-white",title:r.title,children:[e.jsx(Z,{type:"decision",size:12,className:"mt-[3px] flex-shrink-0 opacity-90"}),e.jsx("span",{className:"line-clamp-2",children:r.title})]}),r.context&&e.jsx("p",{className:"mt-1 line-clamp-2 text-caption text-secondary",title:r.context,children:r.context}),e.jsxs("div",{className:"mt-1.5 flex items-center justify-between gap-2",children:[e.jsxs("p",{className:`min-w-0 truncate text-micro ${(()=>{const d=Q(r.waitingMinutes);return d.tone==="urgent"?"text-red-400":d.tone==="attention"?"text-amber-400":"text-muted"})()}`,title:`${r.agentName??"OrgX Autopilot"} · ${Q(r.waitingMinutes).text}`,children:[r.agentName??"OrgX Autopilot"," · ",Q(r.waitingMinutes).text]}),e.jsx("button",{onClick:d=>{d.stopPropagation(),re(r.id)},disabled:s||j,className:"flex-shrink-0 rounded-md border border-lime/25 bg-lime/10 px-2.5 py-1 text-micro font-semibold text-lime transition-colors hover:bg-lime/20 disabled:cursor-not-allowed disabled:border-white/10 disabled:bg-white/[0.08] disabled:text-secondary",children:s?"Approving…":"Approve"}),b&&e.jsx("button",{onClick:d=>{d.stopPropagation(),T(r.id)},disabled:s||j,className:"flex-shrink-0 rounded-md border border-white/[0.08] bg-white/[0.03] px-2.5 py-1 text-micro font-semibold text-secondary transition-colors hover:border-red-400/30 hover:bg-red-400/[0.08] hover:text-red-300 disabled:cursor-not-allowed disabled:opacity-40",children:"Reject"})]})]})})]})},r.id)})}):e.jsx(e.Fragment,{children:k.map(r=>{const a=g.has(r.id),s=N.has(r.id);return e.jsx("article",{role:"button",tabIndex:0,onClick:()=>T(r.id),onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),T(r.id))},className:"rounded-xl border bg-white/[0.03] px-3 py-2.5 transition-[border-color,box-shadow] cv-auto",style:{borderColor:s?`${M.lime}50`:"rgba(255, 255, 255, 0.1)",boxShadow:s?"0 0 0 1px rgba(191, 255, 0, 0.14)":"none"},children:e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsx("input",{type:"checkbox",checked:s,onChange:()=>fe(r.id),disabled:a||j,onClick:o=>o.stopPropagation(),className:"mt-0.5 h-4 w-4 rounded border-white/20 bg-black/40 text-lime focus:ring-lime/40"}),e.jsx("div",{className:"min-w-0 flex-1",children:e.jsxs("div",{className:"min-w-0",children:[e.jsxs("p",{className:"flex min-w-0 items-start gap-1.5 text-body font-medium text-white",title:r.title,children:[e.jsx(Z,{type:"decision",size:12,className:"mt-[3px] flex-shrink-0 opacity-90"}),e.jsx("span",{className:"line-clamp-2",children:r.title})]}),r.context&&e.jsx("p",{className:"mt-1 line-clamp-2 text-caption text-secondary",title:r.context,children:r.context}),e.jsxs("div",{className:"mt-1.5 flex items-center justify-between gap-2",children:[e.jsxs("p",{className:`min-w-0 truncate text-micro ${(()=>{const o=Q(r.waitingMinutes);return o.tone==="urgent"?"text-red-400":o.tone==="attention"?"text-amber-400":"text-muted"})()}`,title:`${r.agentName??"OrgX Autopilot"} · ${Q(r.waitingMinutes).text}`,children:[r.agentName??"OrgX Autopilot"," · ",Q(r.waitingMinutes).text]}),e.jsx("button",{onClick:o=>{o.stopPropagation(),re(r.id)},disabled:a||j,className:"flex-shrink-0 rounded-md border border-lime/25 bg-lime/10 px-2.5 py-1 text-micro font-semibold text-lime transition-colors hover:bg-lime/20 disabled:cursor-not-allowed disabled:border-white/10 disabled:bg-white/[0.08] disabled:text-secondary",children:a?"Approving…":"Approve"}),b&&e.jsx("button",{onClick:o=>{o.stopPropagation(),T(r.id)},disabled:a||j,className:"flex-shrink-0 rounded-md border border-white/[0.08] bg-white/[0.03] px-2.5 py-1 text-micro font-semibold text-secondary transition-colors hover:border-red-400/30 hover:bg-red-400/[0.08] hover:text-red-300 disabled:cursor-not-allowed disabled:opacity-40",children:"Reject"})]})]})})]})},r.id)})}),k.length<p.length&&e.jsxs("button",{onClick:()=>q(r=>Math.min(p.length,r+Ae)),className:"w-full rounded-xl border border-white/[0.08] bg-white/[0.02] px-3 py-2 text-caption text-secondary transition-colors hover:bg-white/[0.05]",children:["Load more (",p.length-k.length," remaining)"]})]}),e.jsx(ne,{})]})});export{it as DecisionQueue};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -3,18 +3,20 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
|
6
|
+
<meta name="mobile-web-app-capable" content="yes" />
|
|
6
7
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
7
8
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
8
9
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex" />
|
|
9
10
|
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex" />
|
|
10
11
|
<meta name="copyright" content="OrgX. All rights reserved." />
|
|
11
12
|
<title>OrgX Live Dashboard</title>
|
|
12
|
-
<script type="module" crossorigin src="/orgx/live/assets/
|
|
13
|
+
<script type="module" crossorigin src="/orgx/live/assets/C9jy61eu.js"></script>
|
|
13
14
|
<link rel="modulepreload" crossorigin href="/orgx/live/assets/C-KIc3Wc.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/orgx/live/assets/
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/orgx/live/assets/
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/orgx/live/assets/
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/orgx/live/assets/
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/orgx/live/assets/BJgZIVUQ.js">
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/orgx/live/assets/cNrhgGc1.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/orgx/live/assets/CxQ08qFN.js">
|
|
18
|
+
<link rel="stylesheet" crossorigin href="/orgx/live/assets/qm8xLgv-.css">
|
|
19
|
+
<link rel="stylesheet" crossorigin href="/orgx/live/assets/BzRbDCAD.css">
|
|
18
20
|
</head>
|
|
19
21
|
<body class="bg-[#080808] text-white antialiased">
|
|
20
22
|
<div id="root"></div>
|
|
Binary file
|
|
Binary file
|
|
@@ -9,6 +9,26 @@ function nonEmptyString(value) {
|
|
|
9
9
|
const trimmed = value.trim();
|
|
10
10
|
return trimmed.length > 0 ? trimmed : null;
|
|
11
11
|
}
|
|
12
|
+
const UUID_LIKE_ACTOR_VALUE_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
13
|
+
const HEX_LIKE_ACTOR_VALUE_REGEX = /^[0-9a-f]{20,}$/i;
|
|
14
|
+
const NUMERIC_ONLY_ACTOR_VALUE_REGEX = /^\d+$/;
|
|
15
|
+
const EXTERNAL_USER_ACTOR_VALUE_REGEX = /^(user|usr|clerk)_[a-z0-9]+$/i;
|
|
16
|
+
function sanitizeActorValue(value) {
|
|
17
|
+
if (!value)
|
|
18
|
+
return null;
|
|
19
|
+
const trimmed = value.trim();
|
|
20
|
+
if (!trimmed)
|
|
21
|
+
return null;
|
|
22
|
+
if (UUID_LIKE_ACTOR_VALUE_REGEX.test(trimmed))
|
|
23
|
+
return null;
|
|
24
|
+
if (HEX_LIKE_ACTOR_VALUE_REGEX.test(trimmed))
|
|
25
|
+
return null;
|
|
26
|
+
if (NUMERIC_ONLY_ACTOR_VALUE_REGEX.test(trimmed))
|
|
27
|
+
return null;
|
|
28
|
+
if (EXTERNAL_USER_ACTOR_VALUE_REGEX.test(trimmed))
|
|
29
|
+
return null;
|
|
30
|
+
return trimmed;
|
|
31
|
+
}
|
|
12
32
|
function firstString(record, keys) {
|
|
13
33
|
if (!record)
|
|
14
34
|
return null;
|
|
@@ -39,8 +59,6 @@ export function enrichActivityActorFields(item) {
|
|
|
39
59
|
"requestedByAgentId",
|
|
40
60
|
"requester_agent_id",
|
|
41
61
|
"requesterAgentId",
|
|
42
|
-
"requester_id",
|
|
43
|
-
"requesterId",
|
|
44
62
|
"runner_agent_id",
|
|
45
63
|
"runnerAgentId",
|
|
46
64
|
"handoff_from_agent_id",
|
|
@@ -67,7 +85,7 @@ export function enrichActivityActorFields(item) {
|
|
|
67
85
|
"source_agent_name",
|
|
68
86
|
"sourceAgentName",
|
|
69
87
|
]);
|
|
70
|
-
|
|
88
|
+
let executorAgentId = nonEmptyString(item.executorAgentId) ??
|
|
71
89
|
firstString(metadata, [
|
|
72
90
|
"executed_by_agent_id",
|
|
73
91
|
"executedByAgentId",
|
|
@@ -85,7 +103,7 @@ export function enrichActivityActorFields(item) {
|
|
|
85
103
|
"agentId",
|
|
86
104
|
]) ??
|
|
87
105
|
nonEmptyString(item.agentId);
|
|
88
|
-
|
|
106
|
+
let executorAgentName = nonEmptyString(item.executorAgentName) ??
|
|
89
107
|
firstString(metadata, [
|
|
90
108
|
"executed_by_agent_name",
|
|
91
109
|
"executedByAgentName",
|
|
@@ -103,6 +121,10 @@ export function enrichActivityActorFields(item) {
|
|
|
103
121
|
"agentName",
|
|
104
122
|
]) ??
|
|
105
123
|
nonEmptyString(item.agentName);
|
|
124
|
+
requesterAgentId = sanitizeActorValue(requesterAgentId);
|
|
125
|
+
requesterAgentName = sanitizeActorValue(requesterAgentName);
|
|
126
|
+
executorAgentId = sanitizeActorValue(executorAgentId);
|
|
127
|
+
executorAgentName = sanitizeActorValue(executorAgentName);
|
|
106
128
|
if (!hasActorValue(requesterAgentId, requesterAgentName) && hasActorValue(executorAgentId, executorAgentName)) {
|
|
107
129
|
requesterAgentId = executorAgentId;
|
|
108
130
|
requesterAgentName = executorAgentName;
|
package/dist/activity-store.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { existsSync, readFileSync, } from "node:fs";
|
|
2
2
|
import { Buffer } from "node:buffer";
|
|
3
3
|
import { enrichActivityActorFieldsList } from "./activity-actor-fields.js";
|
|
4
|
+
import { shouldHideActivityItem } from "./event-sanitization.js";
|
|
4
5
|
import { getOrgxPluginConfigDir, getOrgxPluginConfigPath } from "./paths.js";
|
|
5
|
-
import { backupCorruptFileSync,
|
|
6
|
+
import { backupCorruptFileSync, writeFileAtomicSync } from "./fs-utils.js";
|
|
6
7
|
import { ensureStoreDirSync, parseJsonSafe } from "./stores/json-store.js";
|
|
7
8
|
const STORE_VERSION = 1;
|
|
8
9
|
const STORE_FILENAME = "activity-store.json";
|
|
9
|
-
const MAX_ITEMS =
|
|
10
|
-
const RETENTION_DAYS =
|
|
11
|
-
const FLUSH_DEBOUNCE_MS =
|
|
10
|
+
const MAX_ITEMS = 10_000;
|
|
11
|
+
const RETENTION_DAYS = 14;
|
|
12
|
+
const FLUSH_DEBOUNCE_MS = 3_000;
|
|
12
13
|
let cached = null;
|
|
13
14
|
function ensureDir() {
|
|
14
15
|
ensureStoreDirSync(getOrgxPluginConfigDir());
|
|
@@ -22,6 +23,21 @@ function toEpoch(value) {
|
|
|
22
23
|
const parsed = Date.parse(value);
|
|
23
24
|
return Number.isFinite(parsed) ? parsed : 0;
|
|
24
25
|
}
|
|
26
|
+
function shallowMetadataEqual(a, b) {
|
|
27
|
+
if (a == null && b == null)
|
|
28
|
+
return true;
|
|
29
|
+
if (a == null || b == null)
|
|
30
|
+
return false;
|
|
31
|
+
const keysA = Object.keys(a);
|
|
32
|
+
const keysB = Object.keys(b);
|
|
33
|
+
if (keysA.length !== keysB.length)
|
|
34
|
+
return false;
|
|
35
|
+
for (const key of keysA) {
|
|
36
|
+
if (a[key] !== b[key])
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
25
41
|
function compareActivity(a, b) {
|
|
26
42
|
const delta = toEpoch(b.timestamp) - toEpoch(a.timestamp);
|
|
27
43
|
if (delta !== 0)
|
|
@@ -47,6 +63,8 @@ function normalizeItems(source) {
|
|
|
47
63
|
continue;
|
|
48
64
|
if (epoch < cutoffEpoch)
|
|
49
65
|
continue;
|
|
66
|
+
if (shouldHideActivityItem(item))
|
|
67
|
+
continue;
|
|
50
68
|
byId.set(id, item);
|
|
51
69
|
}
|
|
52
70
|
return enrichActivityActorFieldsList(Array.from(byId.values()))
|
|
@@ -137,7 +155,7 @@ function scheduleFlush(state) {
|
|
|
137
155
|
updatedAt: state.storeUpdatedAt,
|
|
138
156
|
items: state.items,
|
|
139
157
|
};
|
|
140
|
-
|
|
158
|
+
writeFileAtomicSync(storePath(), JSON.stringify(payload), { mode: 0o600 });
|
|
141
159
|
}, FLUSH_DEBOUNCE_MS);
|
|
142
160
|
state.flushTimer.unref?.();
|
|
143
161
|
}
|
|
@@ -158,6 +176,8 @@ export function appendActivityItems(items) {
|
|
|
158
176
|
continue;
|
|
159
177
|
if (!Number.isFinite(Date.parse(item.timestamp)))
|
|
160
178
|
continue;
|
|
179
|
+
if (shouldHideActivityItem(item))
|
|
180
|
+
continue;
|
|
161
181
|
const id = item.id.trim();
|
|
162
182
|
const existing = state.byId.get(id);
|
|
163
183
|
if (!existing) {
|
|
@@ -175,7 +195,7 @@ export function appendActivityItems(items) {
|
|
|
175
195
|
(existing.executorAgentId ?? null) !== (item.executorAgentId ?? null) ||
|
|
176
196
|
(existing.executorAgentName ?? null) !== (item.executorAgentName ?? null) ||
|
|
177
197
|
existing.summary !== item.summary ||
|
|
178
|
-
|
|
198
|
+
!shallowMetadataEqual(existing.metadata, item.metadata)) {
|
|
179
199
|
state.byId.set(id, item);
|
|
180
200
|
updated += 1;
|
|
181
201
|
}
|
|
@@ -183,8 +203,14 @@ export function appendActivityItems(items) {
|
|
|
183
203
|
if (appended === 0 && updated === 0) {
|
|
184
204
|
return { appended: 0, updated: 0, total: state.items.length };
|
|
185
205
|
}
|
|
186
|
-
// Rebuild sorted list from map
|
|
187
|
-
|
|
206
|
+
// Rebuild sorted list from map, bounded by MAX_ITEMS.
|
|
207
|
+
// Skip full normalizeItems (enrichment + dedup) for small batches — items are already validated above.
|
|
208
|
+
if (appended + updated > 50) {
|
|
209
|
+
state.items = normalizeItems(Array.from(state.byId.values()));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
state.items = Array.from(state.byId.values()).sort(compareActivity).slice(0, MAX_ITEMS);
|
|
213
|
+
}
|
|
188
214
|
state.byId = new Map(state.items.map((item) => [item.id, item]));
|
|
189
215
|
state.dirty = true;
|
|
190
216
|
scheduleFlush(state);
|
|
@@ -4,6 +4,70 @@ import { backupCorruptFileSync, writeJsonFileAtomicSync } from "./fs-utils.js";
|
|
|
4
4
|
import { clearStoreFileSync, ensureStoreDirSync, parseJsonSafe, } from "./stores/json-store.js";
|
|
5
5
|
const MAX_AGENTS = 120;
|
|
6
6
|
const MAX_RUNS = 480;
|
|
7
|
+
function timestampSortValue(value) {
|
|
8
|
+
const parsed = Date.parse(value);
|
|
9
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
10
|
+
}
|
|
11
|
+
function isRecord(value) {
|
|
12
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
function asOptionalString(value) {
|
|
15
|
+
if (typeof value !== "string")
|
|
16
|
+
return null;
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
19
|
+
}
|
|
20
|
+
function asTimestamp(value) {
|
|
21
|
+
if (typeof value === "string" && value.trim().length > 0)
|
|
22
|
+
return value;
|
|
23
|
+
return new Date().toISOString();
|
|
24
|
+
}
|
|
25
|
+
function normalizeAgentContextsMap(input) {
|
|
26
|
+
if (!isRecord(input))
|
|
27
|
+
return {};
|
|
28
|
+
const normalized = {};
|
|
29
|
+
for (const [key, value] of Object.entries(input)) {
|
|
30
|
+
if (!isRecord(value))
|
|
31
|
+
continue;
|
|
32
|
+
const hasExplicitAgentId = Object.prototype.hasOwnProperty.call(value, "agentId");
|
|
33
|
+
const id = hasExplicitAgentId ? asOptionalString(value.agentId) : asOptionalString(key);
|
|
34
|
+
if (!id)
|
|
35
|
+
continue;
|
|
36
|
+
normalized[id] = {
|
|
37
|
+
agentId: id,
|
|
38
|
+
initiativeId: asOptionalString(value.initiativeId),
|
|
39
|
+
initiativeTitle: asOptionalString(value.initiativeTitle),
|
|
40
|
+
workstreamId: asOptionalString(value.workstreamId),
|
|
41
|
+
taskId: asOptionalString(value.taskId),
|
|
42
|
+
updatedAt: asTimestamp(value.updatedAt),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return normalized;
|
|
46
|
+
}
|
|
47
|
+
function normalizeRunContextsMap(input) {
|
|
48
|
+
if (!isRecord(input))
|
|
49
|
+
return {};
|
|
50
|
+
const normalized = {};
|
|
51
|
+
for (const [key, value] of Object.entries(input)) {
|
|
52
|
+
if (!isRecord(value))
|
|
53
|
+
continue;
|
|
54
|
+
const hasExplicitRunId = Object.prototype.hasOwnProperty.call(value, "runId");
|
|
55
|
+
const runId = hasExplicitRunId ? asOptionalString(value.runId) : asOptionalString(key);
|
|
56
|
+
const agentId = asOptionalString(value.agentId);
|
|
57
|
+
if (!runId || !agentId)
|
|
58
|
+
continue;
|
|
59
|
+
normalized[runId] = {
|
|
60
|
+
runId,
|
|
61
|
+
agentId,
|
|
62
|
+
initiativeId: asOptionalString(value.initiativeId),
|
|
63
|
+
initiativeTitle: asOptionalString(value.initiativeTitle),
|
|
64
|
+
workstreamId: asOptionalString(value.workstreamId),
|
|
65
|
+
taskId: asOptionalString(value.taskId),
|
|
66
|
+
updatedAt: asTimestamp(value.updatedAt),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return normalized;
|
|
70
|
+
}
|
|
7
71
|
function contextDir() {
|
|
8
72
|
return getOrgxPluginConfigDir();
|
|
9
73
|
}
|
|
@@ -16,22 +80,22 @@ function ensureContextDir() {
|
|
|
16
80
|
function normalizeContext(input) {
|
|
17
81
|
return {
|
|
18
82
|
agentId: input.agentId.trim(),
|
|
19
|
-
initiativeId: input.initiativeId
|
|
20
|
-
initiativeTitle: input.initiativeTitle
|
|
21
|
-
workstreamId: input.workstreamId
|
|
22
|
-
taskId: input.taskId
|
|
23
|
-
updatedAt: input.updatedAt,
|
|
83
|
+
initiativeId: asOptionalString(input.initiativeId),
|
|
84
|
+
initiativeTitle: asOptionalString(input.initiativeTitle),
|
|
85
|
+
workstreamId: asOptionalString(input.workstreamId),
|
|
86
|
+
taskId: asOptionalString(input.taskId),
|
|
87
|
+
updatedAt: asTimestamp(input.updatedAt),
|
|
24
88
|
};
|
|
25
89
|
}
|
|
26
90
|
function normalizeRunContext(input) {
|
|
27
91
|
return {
|
|
28
92
|
runId: input.runId.trim(),
|
|
29
93
|
agentId: input.agentId.trim(),
|
|
30
|
-
initiativeId: input.initiativeId
|
|
31
|
-
initiativeTitle: input.initiativeTitle
|
|
32
|
-
workstreamId: input.workstreamId
|
|
33
|
-
taskId: input.taskId
|
|
34
|
-
updatedAt: input.updatedAt,
|
|
94
|
+
initiativeId: asOptionalString(input.initiativeId),
|
|
95
|
+
initiativeTitle: asOptionalString(input.initiativeTitle),
|
|
96
|
+
workstreamId: asOptionalString(input.workstreamId),
|
|
97
|
+
taskId: asOptionalString(input.taskId),
|
|
98
|
+
updatedAt: asTimestamp(input.updatedAt),
|
|
35
99
|
};
|
|
36
100
|
}
|
|
37
101
|
export function readAgentContexts() {
|
|
@@ -46,12 +110,10 @@ export function readAgentContexts() {
|
|
|
46
110
|
backupCorruptFileSync(file);
|
|
47
111
|
return { updatedAt: new Date().toISOString(), agents: {}, runs: {} };
|
|
48
112
|
}
|
|
49
|
-
const agents = parsed.agents
|
|
50
|
-
const runs = parsed.runs
|
|
113
|
+
const agents = normalizeAgentContextsMap(parsed.agents);
|
|
114
|
+
const runs = normalizeRunContextsMap(parsed.runs);
|
|
51
115
|
return {
|
|
52
|
-
updatedAt:
|
|
53
|
-
? parsed.updatedAt
|
|
54
|
-
: new Date().toISOString(),
|
|
116
|
+
updatedAt: asTimestamp(parsed.updatedAt),
|
|
55
117
|
agents: agents,
|
|
56
118
|
runs: runs,
|
|
57
119
|
};
|
|
@@ -95,7 +157,7 @@ export function upsertAgentContext(input) {
|
|
|
95
157
|
// Prune if the file grows unbounded (rare).
|
|
96
158
|
const values = Object.values(next.agents);
|
|
97
159
|
if (values.length > MAX_AGENTS) {
|
|
98
|
-
values.sort((a, b) =>
|
|
160
|
+
values.sort((a, b) => timestampSortValue(b.updatedAt) - timestampSortValue(a.updatedAt));
|
|
99
161
|
const keep = new Set(values.slice(0, MAX_AGENTS).map((c) => c.agentId));
|
|
100
162
|
for (const key of Object.keys(next.agents)) {
|
|
101
163
|
if (!keep.has(key)) {
|
|
@@ -130,7 +192,7 @@ export function upsertRunContext(input) {
|
|
|
130
192
|
next.updatedAt = new Date().toISOString();
|
|
131
193
|
const values = Object.values(next.runs);
|
|
132
194
|
if (values.length > MAX_RUNS) {
|
|
133
|
-
values.sort((a, b) =>
|
|
195
|
+
values.sort((a, b) => timestampSortValue(b.updatedAt) - timestampSortValue(a.updatedAt));
|
|
134
196
|
const keep = new Set(values.slice(0, MAX_RUNS).map((c) => c.runId));
|
|
135
197
|
for (const key of Object.keys(next.runs)) {
|
|
136
198
|
if (!keep.has(key)) {
|
package/dist/agent-run-store.js
CHANGED
|
@@ -18,7 +18,24 @@ function normalizeNullableString(value) {
|
|
|
18
18
|
const trimmed = value.trim();
|
|
19
19
|
return trimmed.length > 0 ? trimmed : null;
|
|
20
20
|
}
|
|
21
|
+
function normalizeTimestamp(value, fallback) {
|
|
22
|
+
if (typeof value !== "string")
|
|
23
|
+
return fallback;
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
if (!trimmed)
|
|
26
|
+
return fallback;
|
|
27
|
+
return Number.isFinite(Date.parse(trimmed)) ? trimmed : fallback;
|
|
28
|
+
}
|
|
29
|
+
function normalizeNullableTimestamp(value) {
|
|
30
|
+
if (typeof value !== "string")
|
|
31
|
+
return null;
|
|
32
|
+
const trimmed = value.trim();
|
|
33
|
+
if (!trimmed)
|
|
34
|
+
return null;
|
|
35
|
+
return Number.isFinite(Date.parse(trimmed)) ? trimmed : null;
|
|
36
|
+
}
|
|
21
37
|
function normalizeRecord(input) {
|
|
38
|
+
const now = new Date().toISOString();
|
|
22
39
|
return {
|
|
23
40
|
runId: input.runId.trim(),
|
|
24
41
|
agentId: input.agentId.trim(),
|
|
@@ -30,8 +47,8 @@ function normalizeRecord(input) {
|
|
|
30
47
|
initiativeTitle: normalizeNullableString(input.initiativeTitle),
|
|
31
48
|
workstreamId: normalizeNullableString(input.workstreamId),
|
|
32
49
|
taskId: normalizeNullableString(input.taskId),
|
|
33
|
-
startedAt: input.startedAt,
|
|
34
|
-
stoppedAt: input.stoppedAt
|
|
50
|
+
startedAt: normalizeTimestamp(input.startedAt, now),
|
|
51
|
+
stoppedAt: normalizeNullableTimestamp(input.stoppedAt),
|
|
35
52
|
status: input.status === "stopped" ? "stopped" : "running",
|
|
36
53
|
};
|
|
37
54
|
}
|
|
@@ -48,9 +65,33 @@ export function readAgentRuns() {
|
|
|
48
65
|
return { updatedAt: new Date().toISOString(), runs: {} };
|
|
49
66
|
}
|
|
50
67
|
const runs = parsed.runs && typeof parsed.runs === "object" ? parsed.runs : {};
|
|
68
|
+
const normalizedRuns = {};
|
|
69
|
+
for (const [runKey, runValue] of Object.entries(runs)) {
|
|
70
|
+
if (!runValue || typeof runValue !== "object")
|
|
71
|
+
continue;
|
|
72
|
+
const input = runValue;
|
|
73
|
+
const normalized = normalizeRecord({
|
|
74
|
+
runId: typeof input.runId === "string" ? input.runId : runKey,
|
|
75
|
+
agentId: typeof input.agentId === "string" ? input.agentId : "",
|
|
76
|
+
pid: typeof input.pid === "number" ? input.pid : null,
|
|
77
|
+
message: typeof input.message === "string" ? input.message : null,
|
|
78
|
+
provider: typeof input.provider === "string" ? input.provider : null,
|
|
79
|
+
model: typeof input.model === "string" ? input.model : null,
|
|
80
|
+
initiativeId: typeof input.initiativeId === "string" ? input.initiativeId : null,
|
|
81
|
+
initiativeTitle: typeof input.initiativeTitle === "string" ? input.initiativeTitle : null,
|
|
82
|
+
workstreamId: typeof input.workstreamId === "string" ? input.workstreamId : null,
|
|
83
|
+
taskId: typeof input.taskId === "string" ? input.taskId : null,
|
|
84
|
+
startedAt: typeof input.startedAt === "string" ? input.startedAt : "",
|
|
85
|
+
stoppedAt: typeof input.stoppedAt === "string" ? input.stoppedAt : null,
|
|
86
|
+
status: input.status === "stopped" ? "stopped" : "running",
|
|
87
|
+
});
|
|
88
|
+
if (!normalized.runId || !normalized.agentId)
|
|
89
|
+
continue;
|
|
90
|
+
normalizedRuns[normalized.runId] = normalized;
|
|
91
|
+
}
|
|
51
92
|
return {
|
|
52
93
|
updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : new Date().toISOString(),
|
|
53
|
-
runs:
|
|
94
|
+
runs: normalizedRuns,
|
|
54
95
|
};
|
|
55
96
|
}
|
|
56
97
|
catch {
|