@hotmeshio/long-tail 0.4.1 → 0.4.3
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/build/services/export/index.js +36 -2
- package/build/services/iam/activity.d.ts +4 -3
- package/build/services/iam/activity.js +5 -5
- package/dashboard/dist/assets/{AdminDashboard-C0_qN2h3.js → AdminDashboard-Dr5wTIZT.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-C0_qN2h3.js.map → AdminDashboard-Dr5wTIZT.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-DG1zOIiz.js → AgentConfigPage-D52KyJY-.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-DG1zOIiz.js.map → AgentConfigPage-D52KyJY-.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-B5kaAJDM.js → AgentDetailPage-Cbo_qrYF.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-B5kaAJDM.js.map → AgentDetailPage-Cbo_qrYF.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DJWSuoJA.js → AgentsPage-CvuF8--H.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DJWSuoJA.js.map → AgentsPage-CvuF8--H.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DrarbHov.js → AvailableEscalationsPage-UzjXcO3W.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DrarbHov.js.map → AvailableEscalationsPage-UzjXcO3W.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-CvXQwE5Z.js → BotPicker-CM-_u73k.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CvXQwE5Z.js.map → BotPicker-CM-_u73k.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-BiL9QUxI.js → CapabilitiesPage-D1QEHMKw.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-BiL9QUxI.js.map → CapabilitiesPage-D1QEHMKw.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D9F01Tny.js → CollapsibleSection-CnPKa7df.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D9F01Tny.js.map → CollapsibleSection-CnPKa7df.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-C-rjAIK3.js → CredentialsPage-CImIzra4.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-C-rjAIK3.js.map → CredentialsPage-CImIzra4.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DnZF8_vw.js → CronLabel-5HPAmciI.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DnZF8_vw.js.map → CronLabel-5HPAmciI.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-BYDrcsYT.js → CustomDurationPicker-5JzEgS7I.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-BYDrcsYT.js.map → CustomDurationPicker-5JzEgS7I.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-BkiVdGaJ.js → ElapsedCell-B79BF5Mj.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BkiVdGaJ.js.map → ElapsedCell-B79BF5Mj.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-Cg2SN0WK.js → EscalationsOverview-QvWvbpx3.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Cg2SN0WK.js.map → EscalationsOverview-QvWvbpx3.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-DAclQwfr.js +2 -0
- package/dashboard/dist/assets/EventTable-DAclQwfr.js.map +1 -0
- package/dashboard/dist/assets/{HomePage-74mCQ5nB.js → HomePage-DVOi7rR1.js} +2 -2
- package/dashboard/dist/assets/{HomePage-74mCQ5nB.js.map → HomePage-DVOi7rR1.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-DL1wEuvL.js → ListToolbar-Bntl2hex.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-DL1wEuvL.js.map → ListToolbar-Bntl2hex.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-D34bLMuP.js → McpOverview-B-xSYPJj.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-D34bLMuP.js.map → McpOverview-B-xSYPJj.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-gLGTGX6g.js → McpQueryDetailPage-Cq71BzjB.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-gLGTGX6g.js.map → McpQueryDetailPage-Cq71BzjB.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-wPHJkhEp.js → McpQueryPage-Dfz87aZF.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-wPHJkhEp.js.map → McpQueryPage-Dfz87aZF.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-SoXudCbq.js.map → McpRunDetailPage-CXXRgMmJ.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BUSxdydO.js → McpRunsPage-MUYvUYqz.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BUSxdydO.js.map → McpRunsPage-MUYvUYqz.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-CYCl2our.js → OperatorDashboard-Rih1SZrn.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-CYCl2our.js.map → OperatorDashboard-Rih1SZrn.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DzGacZpO.js → ProcessDetailPage-BMkWCjqD.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DzGacZpO.js.map → ProcessDetailPage-BMkWCjqD.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-Bmn33g_l.js → ProcessesListPage-vZjUSc7S.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-Bmn33g_l.js.map → ProcessesListPage-vZjUSc7S.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BTtaabkS.js → RolesPage-kjeAsj3_.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BTtaabkS.js.map → RolesPage-kjeAsj3_.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-B1R8nJvE.js → RunAsSelector-DC4SLtTq.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-B1R8nJvE.js.map → RunAsSelector-DC4SLtTq.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CU2ZD9cC.js → SwimlaneTimeline-MUUXgT3o.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CU2ZD9cC.js.map → SwimlaneTimeline-MUUXgT3o.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CZw_F8y4.js → TaskDetailPage-C0AlG_2t.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CZw_F8y4.js.map → TaskDetailPage-C0AlG_2t.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-D-vHndyV.js → TasksListPage-69ZWCaCP.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-D-vHndyV.js.map → TasksListPage-69ZWCaCP.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-B6Gz4RAU.js → TimeAgo-CttiZG0k.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-B6Gz4RAU.js.map → TimeAgo-CttiZG0k.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DZu9PtN2.js → TimestampCell-CYFbEhqc.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DZu9PtN2.js.map → TimestampCell-CYFbEhqc.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-D4cgYW2p.js → ToolTestPanel-CY_PLZSe.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-D4cgYW2p.js.map → ToolTestPanel-CY_PLZSe.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-C5ZUZpU5.js → TopicDetailPage-Aq4-6GLl.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-C5ZUZpU5.js.map → TopicDetailPage-Aq4-6GLl.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-Cbc0nVj9.js → TopicsPage-BYFKjRY_.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-Cbc0nVj9.js.map → TopicsPage-BYFKjRY_.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-YUoNrFAq.js → UserName-C4_T5-rI.js} +2 -2
- package/dashboard/dist/assets/{UserName-YUoNrFAq.js.map → UserName-C4_T5-rI.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BFzCyvgv.js → WorkflowsDashboard-_LMWc-OC.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BFzCyvgv.js.map → WorkflowsDashboard-_LMWc-OC.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-C_y7JCg2.js → WorkflowsOverview-DFrfw554.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-C_y7JCg2.js.map → WorkflowsOverview-DFrfw554.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CYQjp3JI.js → YamlWorkflowsPage-CZzGwfol.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CYQjp3JI.js.map → YamlWorkflowsPage-CZzGwfol.js.map} +1 -1
- package/dashboard/dist/assets/{agents-2pDPv2Ww.js → agents-CsKILVSU.js} +2 -2
- package/dashboard/dist/assets/{agents-2pDPv2Ww.js.map → agents-CsKILVSU.js.map} +1 -1
- package/dashboard/dist/assets/{bots-2uGZ2l7A.js → bots-BzEs6Q9L.js} +2 -2
- package/dashboard/dist/assets/{bots-2uGZ2l7A.js.map → bots-BzEs6Q9L.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-CQ29M7lK.js → controlplane-COYEIIAz.js} +2 -2
- package/dashboard/dist/assets/{controlplane-CQ29M7lK.js.map → controlplane-COYEIIAz.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-DWOUjrgL.js → escalation-BZjS2202.js} +2 -2
- package/dashboard/dist/assets/{escalation-DWOUjrgL.js.map → escalation-BZjS2202.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-WrgLIl-W.js → escalation-columns-DtRVmPSB.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-WrgLIl-W.js.map → escalation-columns-DtRVmPSB.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-LN5b1KBx.js → helpers-BngVEys5.js} +2 -2
- package/dashboard/dist/assets/{helpers-LN5b1KBx.js.map → helpers-BngVEys5.js.map} +1 -1
- package/dashboard/dist/assets/{index-C_A76Dl1.js → index-ABsZZf_U.js} +2 -2
- package/dashboard/dist/assets/{index-C_A76Dl1.js.map → index-ABsZZf_U.js.map} +1 -1
- package/dashboard/dist/assets/{index-DqFfgd-7.js → index-BCsShN2l.js} +2 -2
- package/dashboard/dist/assets/{index-DqFfgd-7.js.map → index-BCsShN2l.js.map} +1 -1
- package/dashboard/dist/assets/{index-CdNXBj7w.js → index-Bq5MSkCL.js} +2 -2
- package/dashboard/dist/assets/{index-CdNXBj7w.js.map → index-Bq5MSkCL.js.map} +1 -1
- package/dashboard/dist/assets/{index-BMo7wCw8.js → index-BwivT39P.js} +2 -2
- package/dashboard/dist/assets/{index-BMo7wCw8.js.map → index-BwivT39P.js.map} +1 -1
- package/dashboard/dist/assets/{index-J0dMfAmE.js → index-Byp8BDPs.js} +2 -2
- package/dashboard/dist/assets/{index-J0dMfAmE.js.map → index-Byp8BDPs.js.map} +1 -1
- package/dashboard/dist/assets/{index-dzxsXeMO.js → index-ByxH4qQ-.js} +2 -2
- package/dashboard/dist/assets/{index-dzxsXeMO.js.map → index-ByxH4qQ-.js.map} +1 -1
- package/dashboard/dist/assets/index-COgyD_H2.js +2 -0
- package/dashboard/dist/assets/{index-CryoNbg0.js.map → index-COgyD_H2.js.map} +1 -1
- package/dashboard/dist/assets/index-DXEYynKO.css +1 -0
- package/dashboard/dist/assets/{index-CBS8FBcp.js → index-DcpCR9c_.js} +3 -3
- package/dashboard/dist/assets/{index-CBS8FBcp.js.map → index-DcpCR9c_.js.map} +1 -1
- package/dashboard/dist/assets/index-DuPY59Yu.js +5 -0
- package/dashboard/dist/assets/index-DuPY59Yu.js.map +1 -0
- package/dashboard/dist/assets/{index-ugekH3E2.js → index-DxMNiFPS.js} +2 -2
- package/dashboard/dist/assets/{index-ugekH3E2.js.map → index-DxMNiFPS.js.map} +1 -1
- package/dashboard/dist/assets/{index-CovZsMow.js → index-DykjJxzr.js} +2 -2
- package/dashboard/dist/assets/{index-CovZsMow.js.map → index-DykjJxzr.js.map} +1 -1
- package/dashboard/dist/assets/{index-CFJc47B8.js → index-R61-yG56.js} +2 -2
- package/dashboard/dist/assets/{index-CFJc47B8.js.map → index-R61-yG56.js.map} +1 -1
- package/dashboard/dist/assets/{index-CvzfRxnj.js → index-xgl431mG.js} +2 -2
- package/dashboard/dist/assets/{index-CvzfRxnj.js.map → index-xgl431mG.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-BhZk3Wy9.js → knowledge-DhCbDgy4.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BhZk3Wy9.js.map → knowledge-DhCbDgy4.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BoNH5uCn.js → mcp-query-il3CfU3U.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BoNH5uCn.js.map → mcp-query-il3CfU3U.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-BhkGaw2y.js → mcp-runs-4fyRpegc.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-BhkGaw2y.js.map → mcp-runs-4fyRpegc.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-FOHNY7Zj.js → mcp-xh7T0I-f.js} +2 -2
- package/dashboard/dist/assets/{mcp-FOHNY7Zj.js.map → mcp-xh7T0I-f.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-duQCQRHq.js → namespaces-BBTvHnRF.js} +2 -2
- package/dashboard/dist/assets/{namespaces-duQCQRHq.js.map → namespaces-BBTvHnRF.js.map} +1 -1
- package/dashboard/dist/assets/{roles-DW6lI_g5.js → roles-D7bx5FAM.js} +2 -2
- package/dashboard/dist/assets/{roles-DW6lI_g5.js.map → roles-D7bx5FAM.js.map} +1 -1
- package/dashboard/dist/assets/{settings-wTRbazzw.js → settings-nt6qyR1S.js} +2 -2
- package/dashboard/dist/assets/{settings-wTRbazzw.js.map → settings-nt6qyR1S.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-C-QX245z.js → tasks-BgxRbhVM.js} +2 -2
- package/dashboard/dist/assets/{tasks-C-QX245z.js.map → tasks-BgxRbhVM.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CAnsyo3w.js → topics-CTtCboHe.js} +2 -2
- package/dashboard/dist/assets/{topics-CAnsyo3w.js.map → topics-CTtCboHe.js.map} +1 -1
- package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js +2 -0
- package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-C689a4F7.js → useEventHooks-CkJOmbF-.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-C689a4F7.js.map → useEventHooks-CkJOmbF-.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BTHFGIsD.js → useYamlActivityEvents-CSMX9He5.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BTHFGIsD.js.map → useYamlActivityEvents-CSMX9He5.js.map} +1 -1
- package/dashboard/dist/assets/{users--D3LoFOD.js → users-CyF-5WLI.js} +2 -2
- package/dashboard/dist/assets/{users--D3LoFOD.js.map → users-CyF-5WLI.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-MpNdzreD.js → workflows-Bf4_w24H.js} +2 -2
- package/dashboard/dist/assets/{workflows-MpNdzreD.js.map → workflows-Bf4_w24H.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-CFhnJzQy.js → yaml-workflows-Cp1N0NMK.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CFhnJzQy.js.map → yaml-workflows-Cp1N0NMK.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/agents.md +29 -1
- package/docs/events.md +7 -0
- package/docs/hitl-guide.md +560 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/EventTable-B9wYf13g.js +0 -2
- package/dashboard/dist/assets/EventTable-B9wYf13g.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-SoXudCbq.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CVGztAdK.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CVGztAdK.js.map +0 -1
- package/dashboard/dist/assets/index-ChGBlYKj.css +0 -1
- package/dashboard/dist/assets/index-CryoNbg0.js +0 -2
- package/dashboard/dist/assets/index-DDxZOINn.js +0 -5
- package/dashboard/dist/assets/index-DDxZOINn.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{z as y,A as N,O as p,B as f}from"./index-
|
|
2
|
-
//# sourceMappingURL=CredentialsPage-
|
|
1
|
+
import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{z as y,A as N,O as p,B as f}from"./index-DcpCR9c_.js";import{P as C}from"./PageHeader-Bo0SpcCK.js";import{T as k}from"./TimeAgo-CttiZG0k.js";import{C as A}from"./ConfirmDeleteModal-dOxidrSR.js";import{Y as w,i as P,ag as O,n as T}from"./vendor-icons-BNtvBbnj.js";import"./vendor-react-CX88sFS5.js";import"./Modal-DEODGeqx.js";const o={anthropic:{name:"Anthropic",helpText:'Run "claude setup-token" for an OAuth token, or use an API key from console.anthropic.com.',placeholder:"sk-ant-oat01-... or sk-ant-api03-..."},openai:{name:"OpenAI",helpText:"Create an API key at platform.openai.com/api-keys.",placeholder:"sk-..."},google:{name:"Google",helpText:"Connect your Google account for Gmail, Calendar, and Drive access.",placeholder:"",oauth:!0}};function G(){var d,x;const{data:r,isLoading:m}=y(),n=N(),[a,l]=i.useState(null),[h,u]=i.useState(!1),[s,j]=i.useState("anthropic"),c=(r==null?void 0:r.connections)??[],b=()=>{a&&n.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},g=t=>`/api/auth/oauth/connect/${t}?token=${encodeURIComponent(f()||"")}&returnTo=/credentials`;return e.jsxs("div",{children:[e.jsx(C,{title:"Credentials",docsHash:"#docs:dashboard.md:credentials",actions:e.jsxs("button",{onClick:()=>u(t=>!t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(w,{className:"w-3.5 h-3.5"}),"Add Credential"]})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6",children:"Manage credentials used by tools when invoked on your behalf. Each credential is encrypted at rest and resolved automatically during tool execution."}),h&&e.jsxs("div",{className:"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"}),e.jsxs("div",{className:"relative",children:[e.jsx("select",{value:s,onChange:t=>j(t.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(o).map(([t,v])=>e.jsx("option",{value:t,children:v.name},t))}),e.jsx(P,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"})]})]}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(d=o[s])==null?void 0:d.helpText}),e.jsxs("a",{href:g(s),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(p,{provider:s,className:"w-3.5 h-3.5"}),"Connect ",(x=o[s])==null?void 0:x.name]})]}),m?e.jsx("div",{className:"animate-pulse space-y-3",children:[1,2].map(t=>e.jsx("div",{className:"h-16 bg-surface-sunken rounded"},t))}):c.length===0?e.jsxs("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsx(O,{className:"w-10 h-10 mx-auto mb-3 opacity-40"}),e.jsx("p",{className:"text-sm",children:"No credentials registered."}),e.jsx("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."})]}):e.jsx("div",{className:"space-y-2",children:c.map(t=>e.jsxs("div",{className:"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md",children:[e.jsx(p,{provider:t.provider,className:"w-6 h-6 shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-text-primary font-medium capitalize",children:t.provider}),t.label!=="default"&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:t.label}),t.credential_type&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:t.credential_type})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-0.5",children:[t.email&&e.jsx("span",{className:"text-xs text-text-tertiary",children:t.email}),t.expires_at&&e.jsxs("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsx(k,{date:t.expires_at})]})]})]}),e.jsx("button",{onClick:()=>l({provider:t.provider,label:t.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsx(T,{className:"w-4 h-4"})})]},`${t.provider}-${t.label}`))}),e.jsx(A,{open:!!a,onClose:()=>l(null),onConfirm:b,title:"Revoke Credential",description:e.jsxs(e.Fragment,{children:["Revoke the"," ",e.jsx("span",{className:"font-medium text-text-primary capitalize",children:a==null?void 0:a.provider}),(a==null?void 0:a.label)!=="default"&&e.jsxs(e.Fragment,{children:[" (",a==null?void 0:a.label,")"]})," ","credential? Tools will no longer be able to use this credential."]}),isPending:n.isPending,error:n.error})]})}export{G as CredentialsPage};
|
|
2
|
+
//# sourceMappingURL=CredentialsPage-CImIzra4.js.map
|
package/dashboard/dist/assets/{CredentialsPage-C-rjAIK3.js.map → CredentialsPage-CImIzra4.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialsPage-C-rjAIK3.js","sources":["../../src/pages/settings/CredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Unplug, Trash2, Plus, ChevronDown } from 'lucide-react';\nimport { useOAuthConnections, useDisconnectOAuth } from '../../api/oauth';\nimport { getToken } from '../../api/client';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { OAuthIcon } from '../../components/common/OAuthIcon';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../components/common/modal/ConfirmDeleteModal';\n\ninterface ConnectionToRevoke {\n provider: string;\n label: string;\n}\n\nconst PROVIDERS: Record<string, { name: string; helpText: string; placeholder: string; oauth?: boolean }> = {\n anthropic: {\n name: 'Anthropic',\n helpText: 'Run \"claude setup-token\" for an OAuth token, or use an API key from console.anthropic.com.',\n placeholder: 'sk-ant-oat01-... or sk-ant-api03-...',\n },\n openai: {\n name: 'OpenAI',\n helpText: 'Create an API key at platform.openai.com/api-keys.',\n placeholder: 'sk-...',\n },\n google: {\n name: 'Google',\n helpText: 'Connect your Google account for Gmail, Calendar, and Drive access.',\n placeholder: '',\n oauth: true,\n },\n};\n\nexport function CredentialsPage() {\n const { data, isLoading } = useOAuthConnections();\n const disconnect = useDisconnectOAuth();\n const [confirmRevoke, setConfirmRevoke] = useState<ConnectionToRevoke | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState('anthropic');\n\n const connections = data?.connections ?? [];\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n disconnect.mutate(\n { provider: confirmRevoke.provider, label: confirmRevoke.label },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n const connectUrl = (provider: string) =>\n `/api/auth/oauth/connect/${provider}?token=${encodeURIComponent(getToken() || '')}&returnTo=/credentials`;\n\n return (\n <div>\n <PageHeader\n title=\"Credentials\"\n docsHash=\"#docs:dashboard.md:credentials\"\n actions={\n <button\n onClick={() => setAddOpen((o) => !o)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Credential\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6\">\n Manage credentials used by tools when invoked on your behalf.\n Each credential is encrypted at rest and resolved automatically during tool execution.\n </p>\n\n {/* Add credential dropdown */}\n {addOpen && (\n <div className=\"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3\">\n <div className=\"flex items-center gap-3\">\n <label className=\"text-xs text-text-secondary font-medium\">Provider</label>\n <div className=\"relative\">\n <select\n value={selectedProvider}\n onChange={(e) => setSelectedProvider(e.target.value)}\n className=\"input text-xs pr-7 appearance-none\"\n >\n {Object.entries(PROVIDERS).map(([key, p]) => (\n <option key={key} value={key}>{p.name}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none\" />\n </div>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {PROVIDERS[selectedProvider]?.helpText}\n </p>\n <a\n href={connectUrl(selectedProvider)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <OAuthIcon provider={selectedProvider} className=\"w-3.5 h-3.5\" />\n Connect {PROVIDERS[selectedProvider]?.name}\n </a>\n </div>\n )}\n\n {/* Credentials table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-16 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : connections.length === 0 ? (\n <div className=\"text-center py-16 text-text-tertiary\">\n <Unplug className=\"w-10 h-10 mx-auto mb-3 opacity-40\" />\n <p className=\"text-sm\">No credentials registered.</p>\n <p className=\"text-xs mt-1\">Add a credential to enable tool authentication.</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","getToken","jsx","PageHeader","jsxs","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CredentialsPage-CImIzra4.js","sources":["../../src/pages/settings/CredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Unplug, Trash2, Plus, ChevronDown } from 'lucide-react';\nimport { useOAuthConnections, useDisconnectOAuth } from '../../api/oauth';\nimport { getToken } from '../../api/client';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { OAuthIcon } from '../../components/common/OAuthIcon';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../components/common/modal/ConfirmDeleteModal';\n\ninterface ConnectionToRevoke {\n provider: string;\n label: string;\n}\n\nconst PROVIDERS: Record<string, { name: string; helpText: string; placeholder: string; oauth?: boolean }> = {\n anthropic: {\n name: 'Anthropic',\n helpText: 'Run \"claude setup-token\" for an OAuth token, or use an API key from console.anthropic.com.',\n placeholder: 'sk-ant-oat01-... or sk-ant-api03-...',\n },\n openai: {\n name: 'OpenAI',\n helpText: 'Create an API key at platform.openai.com/api-keys.',\n placeholder: 'sk-...',\n },\n google: {\n name: 'Google',\n helpText: 'Connect your Google account for Gmail, Calendar, and Drive access.',\n placeholder: '',\n oauth: true,\n },\n};\n\nexport function CredentialsPage() {\n const { data, isLoading } = useOAuthConnections();\n const disconnect = useDisconnectOAuth();\n const [confirmRevoke, setConfirmRevoke] = useState<ConnectionToRevoke | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState('anthropic');\n\n const connections = data?.connections ?? [];\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n disconnect.mutate(\n { provider: confirmRevoke.provider, label: confirmRevoke.label },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n const connectUrl = (provider: string) =>\n `/api/auth/oauth/connect/${provider}?token=${encodeURIComponent(getToken() || '')}&returnTo=/credentials`;\n\n return (\n <div>\n <PageHeader\n title=\"Credentials\"\n docsHash=\"#docs:dashboard.md:credentials\"\n actions={\n <button\n onClick={() => setAddOpen((o) => !o)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Credential\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6\">\n Manage credentials used by tools when invoked on your behalf.\n Each credential is encrypted at rest and resolved automatically during tool execution.\n </p>\n\n {/* Add credential dropdown */}\n {addOpen && (\n <div className=\"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3\">\n <div className=\"flex items-center gap-3\">\n <label className=\"text-xs text-text-secondary font-medium\">Provider</label>\n <div className=\"relative\">\n <select\n value={selectedProvider}\n onChange={(e) => setSelectedProvider(e.target.value)}\n className=\"input text-xs pr-7 appearance-none\"\n >\n {Object.entries(PROVIDERS).map(([key, p]) => (\n <option key={key} value={key}>{p.name}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none\" />\n </div>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {PROVIDERS[selectedProvider]?.helpText}\n </p>\n <a\n href={connectUrl(selectedProvider)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <OAuthIcon provider={selectedProvider} className=\"w-3.5 h-3.5\" />\n Connect {PROVIDERS[selectedProvider]?.name}\n </a>\n </div>\n )}\n\n {/* Credentials table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-16 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : connections.length === 0 ? (\n <div className=\"text-center py-16 text-text-tertiary\">\n <Unplug className=\"w-10 h-10 mx-auto mb-3 opacity-40\" />\n <p className=\"text-sm\">No credentials registered.</p>\n <p className=\"text-xs mt-1\">Add a credential to enable tool authentication.</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","getToken","jsx","PageHeader","jsxs","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as o,b as i,c as r,j as u}from"./vendor-query-B2UbickB.js";import{b as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=CronLabel-
|
|
1
|
+
import{u as o,b as i,c as r,j as u}from"./vendor-query-B2UbickB.js";import{b as n}from"./index-DcpCR9c_.js";import{a4 as c}from"./vendor-icons-BNtvBbnj.js";function l(e){return o({queryKey:["agent-subscriptions",e],queryFn:()=>n(`/agents/${e}/subscriptions`),enabled:!!e})}function m(){const e=i();return r({mutationFn:({agentId:s,...t})=>n(`/agents/${s}/subscriptions`,{method:"POST",body:JSON.stringify(t)}),onSuccess:(s,t)=>{e.invalidateQueries({queryKey:["agent-subscriptions",t.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function d(){const e=i();return r({mutationFn:({agentId:s,subId:t,...a})=>n(`/agents/${s}/subscriptions/${t}`,{method:"PUT",body:JSON.stringify(a)}),onSuccess:(s,t)=>{e.invalidateQueries({queryKey:["agent-subscriptions",t.agentId]})}})}function g(){const e=i();return r({mutationFn:({agentId:s,subId:t})=>n(`/agents/${s}/subscriptions/${t}`,{method:"DELETE"}),onSuccess:(s,t)=>{e.invalidateQueries({queryKey:["agent-subscriptions",t.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function f({cron:e}){return u.jsxs("span",{className:"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary",children:[u.jsx(c,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary",strokeWidth:1.5}),e]})}export{f as C,m as a,d as b,g as c,l as u};
|
|
2
|
+
//# sourceMappingURL=CronLabel-5HPAmciI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CronLabel-
|
|
1
|
+
{"version":3,"file":"CronLabel-5HPAmciI.js","sources":["../../src/api/agent-subscriptions.ts","../../src/components/common/display/CronLabel.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface AgentSubscription {\n id: string;\n agent_id: string;\n topic: string;\n filter?: Record<string, any>;\n reaction_type: 'durable' | 'pipeline' | 'mcp_query';\n workflow_type?: string;\n pipeline_id?: string;\n mcp_prompt?: string;\n input_mapping: Record<string, any>;\n execute_as?: string;\n enabled: boolean;\n created_at: string;\n updated_at: string;\n}\n\ninterface SubscriptionListResponse {\n subscriptions: AgentSubscription[];\n}\n\nexport function useAgentSubscriptions(agentId: string | null) {\n return useQuery<SubscriptionListResponse>({\n queryKey: ['agent-subscriptions', agentId],\n queryFn: () => apiFetch(`/agents/${agentId}/subscriptions`),\n enabled: !!agentId,\n });\n}\n\nexport function useCreateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n\nexport function useUpdateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string; subId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, subId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n },\n });\n}\n\nexport function useDeleteSubscription() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean }, Error, { agentId: string; subId: string }>({\n mutationFn: ({ agentId, subId }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, { method: 'DELETE' }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n","import { Clock } from 'lucide-react';\n\ninterface CronLabelProps {\n cron: string;\n}\n\n/**\n * Universal cron expression display — Clock icon + monotype text.\n * Used everywhere a cron schedule is rendered.\n */\nexport function CronLabel({ cron }: CronLabelProps) {\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Clock className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {cron}\n </span>\n );\n}\n"],"names":["useAgentSubscriptions","agentId","useQuery","apiFetch","useCreateSubscription","queryClient","useQueryClient","useMutation","body","_","vars","useUpdateSubscription","subId","useDeleteSubscription","CronLabel","cron","jsxs","jsx","Clock"],"mappings":"4JAuBO,SAASA,EAAsBC,EAAwB,CAC5D,OAAOC,EAAmC,CACxC,SAAU,CAAC,sBAAuBD,CAAO,EACzC,QAAS,IAAME,EAAS,WAAWF,CAAO,gBAAgB,EAC1D,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAwF,CAC7F,WAAY,CAAC,CAAE,QAAAN,EAAS,GAAGO,KACzBL,EAAS,WAAWF,CAAO,iBAAkB,CAC3C,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAuG,CAC5G,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,EAAO,GAAGJ,CAAA,IAChCL,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CACpD,OAAQ,MACR,KAAM,KAAK,UAAUJ,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,CACnF,CAAA,CACD,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMR,EAAcC,EAAA,EACpB,OAAOC,EAA6E,CAClF,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,KACtBT,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CAAE,OAAQ,SAAU,EAC5E,UAAW,CAACH,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CC5DO,SAASS,EAAU,CAAE,KAAAC,GAAwB,CAClD,OACEC,EAAAA,KAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAM,UAAU,4CAA4C,YAAa,IAAK,EAC9EH,CAAA,EACH,CAEJ"}
|
package/dashboard/dist/assets/{CustomDurationPicker-BYDrcsYT.js → CustomDurationPicker-5JzEgS7I.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u,j as i}from"./vendor-query-B2UbickB.js";import{u as x}from"./settings-
|
|
2
|
-
//# sourceMappingURL=CustomDurationPicker-
|
|
1
|
+
import{a as u,j as i}from"./vendor-query-B2UbickB.js";import{u as x}from"./settings-nt6qyR1S.js";import{D as d,f as v}from"./constants-BHkpVaqx.js";function j(){const{data:e}=x();return u.useMemo(()=>{var n;return(((n=e==null?void 0:e.escalation)==null?void 0:n.claimDurations)??d).map(a=>({value:String(a),label:v(a)}))},[e])}const f=[{value:1,label:"minutes"},{value:60,label:"hours"}];function C({onChange:e,compact:r,autoFocus:n,"data-testid":a="custom-duration-input"}){const[l,m]=u.useState(""),[s,c]=u.useState(1);u.useEffect(()=>{const t=parseInt(l);e(t>0?t*s:0)},[l,s,e]);const o=r?"text-xs":"text-sm",p=r?"w-16":"w-20";return i.jsxs("div",{className:"flex items-center gap-2","data-testid":a,children:[i.jsx("input",{type:"number",min:1,max:s===60?24:1440,value:l,onChange:t=>m(t.target.value),placeholder:s===60?"hrs":"min",className:`input ${o} ${p} text-center`,autoFocus:n,"data-testid":`${a}-quantity`}),i.jsx("select",{value:s,onChange:t=>c(parseInt(t.target.value)),className:`select ${o} py-1`,"data-testid":`${a}-unit`,children:f.map(t=>i.jsx("option",{value:t.value,children:t.label},t.value))})]})}export{C,j as u};
|
|
2
|
+
//# sourceMappingURL=CustomDurationPicker-5JzEgS7I.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomDurationPicker-
|
|
1
|
+
{"version":3,"file":"CustomDurationPicker-5JzEgS7I.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxs","jsx","e","u"],"mappings":"oJAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,KAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAW,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKP,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWW,GAAMV,EAAYU,EAAE,OAAO,KAAK,EAC3C,YAAaR,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,CAAA,EAExBW,EAAAA,IAAC,SAAA,CACC,MAAOP,EACP,SAAWQ,GAAMP,EAAc,SAASO,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUJ,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKkB,GACVF,EAAAA,IAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,KAAgC,CAChD,CAAA,CAAA,CACH,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as s,j as n}from"./vendor-query-B2UbickB.js";import{y as p,w as f}from"./index-
|
|
2
|
-
//# sourceMappingURL=ElapsedCell-
|
|
1
|
+
import{a as s,j as n}from"./vendor-query-B2UbickB.js";import{y as p,w as f}from"./index-DcpCR9c_.js";function D({startDate:r,endDate:o,isLive:e}){const[l,c]=s.useState(Date.now);s.useEffect(()=>{if(!e)return;const u=setInterval(()=>c(Date.now()),1e3);return()=>clearInterval(u)},[e]);const i=new Date(r).getTime(),m=o?new Date(o).getTime():l,t=Math.max(0,m-i),a=p(t),x=s.useMemo(()=>[{label:"ms",value:String(t)},{label:"sec",value:`${(t/1e3).toFixed(3)}s`},{label:"text",value:a}],[t,a]);return n.jsx(f,{options:x,children:n.jsx("span",{className:`text-xs ${e?"text-status-active":"text-text-tertiary"}`,children:a})})}export{D as E};
|
|
2
|
+
//# sourceMappingURL=ElapsedCell-B79BF5Mj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElapsedCell-
|
|
1
|
+
{"version":3,"file":"ElapsedCell-B79BF5Mj.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsx","DateTooltip"],"mappings":"qGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,IAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,EAAAA,IAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,CACH,EACF,CAEJ"}
|
package/dashboard/dist/assets/{EscalationsOverview-Cg2SN0WK.js → EscalationsOverview-QvWvbpx3.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as u}from"./index-
|
|
2
|
-
//# sourceMappingURL=EscalationsOverview-
|
|
1
|
+
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as u}from"./index-DcpCR9c_.js";import{e as p}from"./useEventHooks-CkJOmbF-.js";import{P as b}from"./PageHeader-Bo0SpcCK.js";import{S as n}from"./StatCard-DlgF0CJC.js";import{c as j}from"./vendor-react-CX88sFS5.js";import"./vendor-icons-BNtvBbnj.js";const v=[{label:"1h",value:"1h"},{label:"24h",value:"24h"},{label:"7d",value:"7d"},{label:"30d",value:"30d"}];function c({value:i,colorClass:r,onClick:o}){return i===0?e.jsx("span",{className:"text-text-tertiary",children:"0"}):e.jsx("button",{onClick:o,className:`${r} hover:underline tabular-nums font-medium`,children:i})}function $(){var d,x;p();const i=j(),[r,o]=m.useState("24h"),{data:s}=u(r),l=t=>{const h=new URLSearchParams(t).toString();i(`/escalations/available${h?`?${h}`:""}`)},a="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxs("div",{children:[e.jsx(b,{title:"Escalations",docsHash:"#docs:dashboard.md:escalations-overview"}),e.jsx("div",{className:"flex items-center gap-1 mb-6",children:v.map(t=>e.jsx("button",{onClick:()=>o(t.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${r===t.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:t.label},t.value))}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsx(n,{label:"Open",value:(s==null?void 0:s.pending)??"—",colorClass:"text-status-pending",onClick:()=>l()}),e.jsx(n,{label:"Claimed",value:(s==null?void 0:s.claimed)??"—",colorClass:"text-status-active",onClick:()=>l()}),e.jsx(n,{label:"Created",value:(s==null?void 0:s.created)??"—",onClick:()=>l()}),e.jsx(n,{label:"Resolved",value:(s==null?void 0:s.resolved)??"—",colorClass:"text-status-success",onClick:()=>l()})]}),(((d=s==null?void 0:s.by_role)==null?void 0:d.length)??0)>0&&e.jsx("div",{className:"mb-8",children:e.jsxs("table",{className:"w-full text-left",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-surface-border",children:[e.jsx("th",{className:a,children:"Role"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Pending"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Claimed"})]})}),e.jsx("tbody",{children:s.by_role.map(t=>e.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsx("button",{onClick:()=>l({role:t.role}),className:"hover:text-accent hover:underline",children:t.role})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.pending,colorClass:"text-status-pending",onClick:()=>l({role:t.role})})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.claimed,colorClass:"text-status-active",onClick:()=>l({role:t.role})})})]},t.role))})]})}),(((x=s==null?void 0:s.by_type)==null?void 0:x.length)??0)>0&&e.jsx("div",{children:e.jsxs("table",{className:"w-full text-left",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-surface-border",children:[e.jsx("th",{className:a,children:"Type"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Pending"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Claimed"}),e.jsx("th",{className:`${a} text-right w-24`,children:"Resolved"})]})}),e.jsx("tbody",{children:s.by_type.map(t=>e.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsx("button",{onClick:()=>l({type:t.type}),className:"hover:text-accent hover:underline",children:t.type})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.pending,colorClass:"text-status-pending",onClick:()=>l({type:t.type})})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.claimed,colorClass:"text-status-active",onClick:()=>l({type:t.type})})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(c,{value:t.resolved,colorClass:"text-status-success",onClick:()=>l({type:t.type})})})]},t.type))})]})}),s&&s.by_role.length===0&&s.by_type.length===0&&e.jsx("div",{className:"py-16 text-center",children:e.jsxs("p",{className:"text-sm text-text-tertiary",children:["No escalation activity in the last ",r]})})]})}export{$ as EscalationsOverview};
|
|
2
|
+
//# sourceMappingURL=EscalationsOverview-QvWvbpx3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EscalationsOverview-Cg2SN0WK.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" docsHash=\"#docs:dashboard.md:escalations-overview\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsx","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","jsxs","StatCard","_a","row","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EscalationsOverview-QvWvbpx3.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" docsHash=\"#docs:dashboard.md:escalations-overview\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsx","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","jsxs","StatCard","_a","row","_b"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o,j as t}from"./vendor-query-B2UbickB.js";import{F as C,b as f}from"./FilterBar-Ck4K4rzu.js";import{f as $,C as T}from"./index-DcpCR9c_.js";import{E as F}from"./SwimlaneTimeline-MUUXgT3o.js";const D=new Set(["activity_task_scheduled","timer_started","child_workflow_execution_started","signal_wait_started"]),P=new Set(["activity_task_completed","activity_task_failed","timer_fired","child_workflow_execution_completed","child_workflow_execution_failed","workflow_execution_signaled"]);function O(l){const a=new Set;for(const i of l)P.has(i.event_type)&&i.attributes.timeline_key&&a.add(i.attributes.timeline_key);return a}function Y({events:l,childTasks:a}){const[i,_]=o.useState(""),[c,h]=o.useState(""),[x,y]=o.useState("asc"),[u,d]=o.useState(new Set),g=[...new Set(l.map(e=>e.category))].sort(),b=[...new Set(l.map(e=>e.event_type))].sort(),w=O(l),v=e=>{if(e.duration_ms!==null||!D.has(e.event_type))return!1;const s=e.attributes.timeline_key;return!(s&&w.has(s))};let n=l;i&&(n=n.filter(e=>e.category===i)),c&&(n=n.filter(e=>e.event_type===c)),n=[...n].sort((e,s)=>x==="asc"?e.event_id-s.event_id:s.event_id-e.event_id);const j=e=>{switch(e){case"activity":return"bg-blue-500";case"signal":return"bg-emerald-500";case"timer":return"bg-status-warning";case"child_workflow":return"bg-violet-500";default:return"bg-text-tertiary"}},k=e=>{const s=e.event_type;if(e.attributes.activity_type)return`${s} — ${e.attributes.activity_type}`;if(e.attributes.signal_name)return`${s} — ${e.attributes.signal_name}`;if(e.attributes.child_workflow_id){const r=e.attributes.child_workflow_id,S=r.length>24?`${r.slice(0,24)}...`:r;return`${s} — ${S}`}return s},N=e=>{if(!(a!=null&&a.length))return;const s=e.attributes.activity_type;if(s)return a.find(r=>r.workflow_type===s)},p=e=>{d(s=>{const r=new Set(s);return r.has(e)?r.delete(e):r.add(e),r})},m=n.length>0&&n.every(e=>u.has(e.event_id)),E=()=>{d(m?new Set:new Set(n.map(e=>e.event_id)))};return t.jsxs("div",{children:[t.jsxs("div",{className:"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3",children:[t.jsxs("div",{className:"flex items-center gap-4",children:[t.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:["Events (",n.length,")"]}),n.length>0&&t.jsx("button",{onClick:E,className:"text-[10px] text-accent hover:underline",children:m?"Collapse all":"Expand all"})]}),t.jsxs(C,{children:[t.jsx(f,{label:"Category",value:i,onChange:_,options:g.map(e=>({value:e,label:e}))}),t.jsx(f,{label:"Type",value:c,onChange:h,options:b.map(e=>({value:e,label:e}))}),t.jsx("button",{onClick:()=>y(e=>e==="asc"?"desc":"asc"),className:"btn-ghost text-xs",children:x==="asc"?"Oldest first":"Newest first"})]})]}),t.jsx("div",{children:n.length===0?t.jsx("div",{className:"px-6 py-8 text-center",children:t.jsx("p",{className:"text-sm text-text-tertiary",children:"No events match the current filters"})}):n.map(e=>{const s=u.has(e.event_id),r=v(e);return t.jsxs("div",{className:"border-b border-surface-border last:border-b-0",children:[t.jsxs("div",{className:"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200",onClick:()=>p(e.event_id),children:[t.jsx("span",{className:`text-[10px] text-text-tertiary transition-transform duration-300 ${s?"rotate-90":""}`,children:"▶"}),t.jsx("span",{className:"text-xs font-mono text-text-tertiary w-8 shrink-0",children:e.event_id}),t.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${j(e.category)}`}),t.jsx("span",{className:"text-sm text-text-primary flex-1 truncate",children:k(e)}),t.jsx("span",{className:"text-xs font-mono text-text-tertiary shrink-0",children:r?t.jsxs("span",{className:"inline-flex items-center gap-1 text-status-warning",children:[t.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"}),"Pending"]}):e.duration_ms!==null?$(e.duration_ms):"--"}),t.jsx("time",{className:"text-[10px] font-mono text-text-tertiary shrink-0",children:new Date(e.event_time).toLocaleTimeString()})]}),t.jsx(T,{open:s&&!!e.attributes,children:t.jsx("div",{className:"px-6 pb-4 pl-16",children:t.jsx(F,{event:e,childTask:N(e),pending:r,onClose:()=>p(e.event_id)})})})]},e.event_id)})})]})}export{Y as E};
|
|
2
|
+
//# sourceMappingURL=EventTable-DAclQwfr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventTable-DAclQwfr.js","sources":["../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-blue-500';\n case 'signal':\n return 'bg-emerald-500';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-violet-500';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-[10px] text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n ▶\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-[10px] font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","categoryFilter","setCategoryFilter","useState","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","prev","next","allExpanded","toggleAll","jsxs","jsx","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"2MAaA,MAAMA,MAAoB,IAAI,CAC5B,0BACA,gBACA,mCACA,qBACF,CAAC,EAGKC,MAAsB,IAAI,CAC9B,0BACA,uBACA,cACA,qCACA,kCACA,6BACF,CAAC,EAMD,SAASC,EAAmBC,EAA+C,CACzE,MAAMC,MAAW,IACjB,UAAWC,KAAKF,EACVF,EAAgB,IAAII,EAAE,UAAU,GAAKA,EAAE,WAAW,cACpDD,EAAK,IAAIC,EAAE,WAAW,YAAY,EAGtC,OAAOD,CACT,CAEO,SAASE,EAAW,CAAE,OAAAH,EAAQ,WAAAI,GAA+B,CAClE,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAAA,SAAS,EAAE,EACjD,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,EAAE,EACzC,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAyB,KAAK,EAC1D,CAACK,EAAgBC,CAAiB,EAAIN,EAAAA,SAAsB,IAAI,GAAK,EAErEO,EAAa,CAAC,GAAG,IAAI,IAAId,EAAO,IAAK,GAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAA,EACzDe,EAAa,CAAC,GAAG,IAAI,IAAIf,EAAO,IAAK,GAAM,EAAE,UAAU,CAAC,CAAC,EAAE,KAAA,EAC3DgB,EAAgBjB,EAAmBC,CAAM,EAGzCiB,EAAaC,GAAyC,CAE1D,GADIA,EAAI,cAAgB,MACpB,CAACrB,EAAc,IAAIqB,EAAI,UAAU,EAAG,MAAO,GAC/C,MAAMC,EAAMD,EAAI,WAAW,aAC3B,MAAI,EAAAC,GAAOH,EAAc,IAAIG,CAAG,EAElC,EAEA,IAAIC,EAAWpB,EACXK,MAA2Be,EAAS,OAAQ,GAAM,EAAE,WAAaf,CAAc,GAC/EG,MAAuBY,EAAS,OAAQ,GAAM,EAAE,aAAeZ,CAAU,GAE7EY,EAAW,CAAC,GAAGA,CAAQ,EAAE,KAAK,CAACC,EAAGC,IAChCZ,IAAc,MAAQW,EAAE,SAAWC,EAAE,SAAWA,EAAE,SAAWD,EAAE,QAAA,EAGjE,MAAME,EAAeC,GAAqB,CACxC,OAAQA,EAAA,CACN,IAAK,WACH,MAAO,cACT,IAAK,SACH,MAAO,iBACT,IAAK,QACH,MAAO,oBACT,IAAK,iBACH,MAAO,gBACT,QACE,MAAO,kBAAA,CAEb,EAGMC,EAAcP,GAAwC,CAC1D,MAAMQ,EAAOR,EAAI,WACjB,GAAIA,EAAI,WAAW,cACjB,MAAO,GAAGQ,CAAI,MAAMR,EAAI,WAAW,aAAa,GAElD,GAAIA,EAAI,WAAW,YACjB,MAAO,GAAGQ,CAAI,MAAMR,EAAI,WAAW,WAAW,GAEhD,GAAIA,EAAI,WAAW,kBAAmB,CACpC,MAAMS,EAAKT,EAAI,WAAW,kBACpBU,EAAYD,EAAG,OAAS,GAAK,GAAGA,EAAG,MAAM,EAAG,EAAE,CAAC,MAAQA,EAC7D,MAAO,GAAGD,CAAI,MAAME,CAAS,EAC/B,CACA,OAAOF,CACT,EAGMG,EAAiBX,GAA0D,CAC/E,GAAI,EAACd,GAAA,MAAAA,EAAY,QAAQ,OACzB,MAAM0B,EAAeZ,EAAI,WAAW,cACpC,GAAKY,EACL,OAAO1B,EAAW,KAAM2B,GAAMA,EAAE,gBAAkBD,CAAY,CAChE,EAEME,EAAeL,GAAe,CAClCd,EAAmBoB,GAAS,CAC1B,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIP,CAAE,EAAGO,EAAK,OAAOP,CAAE,EAC3BO,EAAK,IAAIP,CAAE,EACTO,CACT,CAAC,CACH,EAEMC,EAAcf,EAAS,OAAS,GAAKA,EAAS,MAAO,GAAMR,EAAe,IAAI,EAAE,QAAQ,CAAC,EAEzFwB,EAAY,IAAM,CAEpBvB,EADEsB,EACgB,IAAI,IAEJ,IAAI,IAAIf,EAAS,IAAK,GAAM,EAAE,QAAQ,CAAC,CAF9B,CAI/B,EAEA,cACG,MAAA,CACC,SAAA,CAAAiB,EAAAA,KAAC,MAAA,CAAI,UAAU,6FACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,IAAA,CAAE,UAAU,yEAAyE,SAAA,CAAA,WAC3EjB,EAAS,OAAO,GAAA,EAC3B,EACCA,EAAS,OAAS,GACjBkB,EAAAA,IAAC,SAAA,CAAO,QAASF,EAAW,UAAU,0CACnC,SAAAD,EAAc,eAAiB,YAAA,CAClC,CAAA,EAEJ,SACCI,EAAA,CACC,SAAA,CAAAD,EAAAA,IAACE,EAAA,CACC,MAAM,WACN,MAAOnC,EACP,SAAUC,EACV,QAASQ,EAAW,IAAK2B,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,EAEzDH,EAAAA,IAACE,EAAA,CACC,MAAM,OACN,MAAOhC,EACP,SAAUC,EACV,QAASM,EAAW,IAAKgB,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,EAEzDO,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM3B,EAAc+B,GAAOA,IAAM,MAAQ,OAAS,KAAM,EACjE,UAAU,oBAET,SAAAhC,IAAc,MAAQ,eAAiB,cAAA,CAAA,CAC1C,CAAA,CACF,CAAA,EACF,QAEC,MAAA,CACE,SAAAU,EAAS,SAAW,EACnBkB,MAAC,OAAI,UAAU,wBACb,eAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,sCAAmC,CAAA,CAC/E,EAEAlB,EAAS,IAAKF,GAAQ,CACpB,MAAMyB,EAAa/B,EAAe,IAAIM,EAAI,QAAQ,EAC5C0B,EAAU3B,EAAUC,CAAG,EAE7B,OACEmB,EAAAA,KAAC,MAAA,CAEC,UAAU,iDAGV,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACC,UAAU,yGACV,QAAS,IAAML,EAAYd,EAAI,QAAQ,EAGvC,SAAA,CAAAoB,EAAAA,IAAC,OAAA,CACC,UAAW,oEAAoEK,EAAa,YAAc,EAAE,GAC7G,SAAA,GAAA,CAAA,EAIDL,EAAAA,IAAC,OAAA,CAAK,UAAU,oDACb,WAAI,SACP,EACAA,EAAAA,IAAC,OAAA,CACC,UAAW,iCAAiCf,EAAYL,EAAI,QAAQ,CAAC,EAAA,CAAA,QAEtE,OAAA,CAAK,UAAU,4CACb,SAAAO,EAAWP,CAAG,EACjB,EACAoB,EAAAA,IAAC,QAAK,UAAU,gDACb,WACCD,EAAAA,KAAC,OAAA,CAAK,UAAU,qDACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,0DAAA,CAA2D,EAAE,SAAA,EAE/E,EACEpB,EAAI,cAAgB,KACtB2B,EAAe3B,EAAI,WAAW,EAE9B,KAEJ,EACAoB,EAAAA,IAAC,OAAA,CAAK,UAAU,oDACb,SAAA,IAAI,KAAKpB,EAAI,UAAU,EAAE,mBAAA,CAAmB,CAC/C,CAAA,CAAA,CAAA,EAIFoB,EAAAA,IAACQ,EAAA,CAAY,KAAMH,GAAc,CAAC,CAACzB,EAAI,WACrC,SAAAoB,EAAAA,IAAC,MAAA,CAAI,UAAU,kBACb,SAAAA,EAAAA,IAACS,EAAA,CACC,MAAO7B,EACP,UAAWW,EAAcX,CAAG,EAC5B,QAAA0B,EACA,QAAS,IAAMZ,EAAYd,EAAI,QAAQ,CAAA,CAAA,EAE3C,CAAA,CACF,CAAA,CAAA,EAnDKA,EAAI,QAAA,CAsDf,CAAC,CAAA,CAEL,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as d,j as e}from"./vendor-query-B2UbickB.js";import{i as Z,q as H,c as N,u as ee,N as se,J as te}from"./index-CBS8FBcp.js";import{b as ae}from"./workflows-MpNdzreD.js";import{u as ie}from"./mcp-runs-BhkGaw2y.js";import{a as ne}from"./controlplane-CQ29M7lK.js";import{u as re}from"./tasks-C-QX245z.js";import{e as oe,b as ce,u as le}from"./useEventHooks-C689a4F7.js";import{R as B}from"./RolePill-BDzPFQUv.js";import{W as j}from"./WorkflowPill-pPuGH8v9.js";import{L as g}from"./ListToolbar-DL1wEuvL.js";import{E as de}from"./EventTopicPill-By-6sXDp.js";import{t as D,a3 as p,L as M,W as Q,C as J,I as O,R as U,B as xe,i as pe}from"./vendor-icons-BNtvBbnj.js";import{c as G,f as me}from"./vendor-react-CX88sFS5.js";const ue={completed:"bg-status-success",active:"bg-status-active",running:"bg-status-active",pending:"bg-status-pending",error:"bg-status-error",failed:"bg-status-error"};function V(t){return ue[t]??"bg-text-tertiary"}let he=0;function fe(t=5){const[a,i]=d.useState([]),[n,r]=d.useState(!1),l=d.useRef(null),o=d.useCallback(c=>{var x,f,b;if((x=c.type)!=null&&x.startsWith("mesh."))return;const h=c.activityName||c.workflowName||((f=c.data)==null?void 0:f.domain)||((b=c.workflowId)==null?void 0:b.slice(0,16))||"";i(w=>[{id:++he,type:c.type,timestamp:c.timestamp,label:h,data:c},...w].slice(0,t)),r(!0),l.current&&clearTimeout(l.current),l.current=setTimeout(()=>r(!1),2e3)},[t]);return ee(`${se}.>`,o),{events:a,pulse:n}}function m({icon:t,color:a,docsHash:i,children:n,actions:r}){return e.jsxs("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(t,{className:`w-4.5 h-4.5 ${a||"text-accent/60"}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:n})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[i&&e.jsx("button",{onClick:()=>{window.location.hash=i},className:"text-text-quaternary hover:text-accent transition-colors",title:"Docs",children:e.jsx(xe,{className:"w-2.5 h-2.5",strokeWidth:1.5})}),r]})]})}function u({icon:t,text:a}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx(t,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1}),e.jsx("p",{className:"text-xs text-text-quaternary",children:a})]})}function je(t,a=37){if(!t||t.length<=a)return t;const i=Math.floor((a-3)/2);return`${t.slice(0,i)}...${t.slice(-i)}`}function C({dot:t,pill:a,id:i,date:n,onClick:r}){return e.jsxs("button",{onClick:r,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${t}`}),e.jsx("span",{className:"text-[12px] text-text-primary font-mono truncate max-w-[60%]",children:je(i)}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap",children:e.jsx(N,{date:n})})]}),e.jsx("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:a})]})}function v({to:t,icon:a,title:i}){const n=G();return e.jsx("button",{onClick:()=>n(t),className:"text-text-quaternary hover:text-accent transition-colors",title:i,children:e.jsx(a,{className:"w-2.5 h-2.5",strokeWidth:1.5})})}function X({appIds:t,selected:a,onSelect:i}){const[n,r]=d.useState(!1),l=d.useRef(null);return d.useEffect(()=>{if(!n)return;const o=c=>{l.current&&!l.current.contains(c.target)&&r(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[n]),t.length<=1?null:e.jsxs("div",{className:"relative mb-3 -mt-2",ref:l,children:[e.jsxs("button",{onClick:()=>r(o=>!o),className:"flex items-center gap-1 px-2 py-0.5 text-[10px] rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors",children:[a,e.jsx("svg",{className:`w-2.5 h-2.5 transition-transform ${n?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),n&&e.jsx("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-30 py-1 min-w-[120px]",children:t.map(o=>e.jsx("button",{onClick:()=>{i(o),r(!1)},className:`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${a===o?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:o},o))})]})}function ge({event:t}){const[a,i]=d.useState(!1);return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>i(!a),className:"w-full text-left px-1 py-2 hover:bg-surface-hover/50 rounded-md transition-colors flex items-center gap-2",children:[e.jsx(pe,{className:`w-2.5 h-2.5 text-text-quaternary shrink-0 transition-transform ${a?"rotate-0":"-rotate-90"}`}),e.jsx(de,{topic:t.type}),e.jsx("span",{className:"text-[11px] text-text-secondary font-mono truncate flex-1",children:t.label||"—"}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0",children:e.jsx(N,{date:t.timestamp,format:"time"})})]}),a&&e.jsx("div",{className:"pl-5 pb-2",children:e.jsx(te,{data:t.data,defaultCollapsed:!1})})]})}function qe(){var F,L,W,I,T;const t=G(),{user:a}=Z(),[i,n]=me(),r=i.get("pipelinenamespace")||"hmsh",l=i.get("durablenamespace")||"durable",o=d.useCallback((s,y)=>{n(Y=>{const z=new URLSearchParams(Y);return z.set(s,y),z},{replace:!1})},[n]);oe(),ce(),le();const c=re({limit:5}),h=ae({limit:5,sort_by:"updated_at",order:"desc",namespace:l}),{data:x}=ne(),f=((x==null?void 0:x.apps)??[]).map(s=>s.appId),b=f,w=f,k=ie({limit:5,app_id:r,sort_by:"updated_at",order:"desc"}),_=H({status:"pending",limit:5,sort_by:"updated_at",order:"desc"}),E=H({assigned_to:a==null?void 0:a.userId,status:"pending",limit:5,sort_by:"updated_at",order:"desc"}),{events:P,pulse:K}=fe(),S=((F=c.data)==null?void 0:F.processes)??[],R=((L=h.data)==null?void 0:L.jobs)??[],$=((W=k.data)==null?void 0:W.jobs)??[],q=((I=_.data)==null?void 0:I.escalations)??[],A=((T=E.data)==null?void 0:T.escalations)??[];return e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary mb-10",children:"Recent Activity"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-14",children:[e.jsxs("div",{children:[e.jsx(m,{icon:D,color:"text-emerald-400",docsHash:"#docs:dashboard.md:processes-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>c.refetch(),isFetching:c.isFetching,apiPath:"/tasks/processes?limit=5"}),e.jsx(v,{to:"/processes/all",icon:p,title:"All processes"})]}),children:"Certified Processes"}),e.jsx("div",{className:"mb-3 -mt-2",children:e.jsx("span",{className:"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest",children:"all namespaces"})}),S.length===0?e.jsx(u,{icon:D,text:"No recent processes"}):e.jsx("div",{className:"space-y-1",children:S.map(s=>e.jsx(C,{dot:(s.task_count??0)>0&&(s.completed??0)>=(s.task_count??0)?"bg-status-success":(s.escalated??0)>0?"border border-status-error":"bg-status-active",pill:e.jsx(e.Fragment,{children:(s.workflow_types??[s.workflow_type]).filter(Boolean).map(y=>e.jsx(j,{type:y,size:"xs"},y))}),id:s.origin_id,date:s.last_activity??s.started_at,onClick:()=>t(`/processes/detail/${s.origin_id}`)},s.origin_id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:M,color:"text-blue-400",docsHash:"#docs:dashboard.md:durable-executions",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>h.refetch(),isFetching:h.isFetching,apiPath:`/workflow-states/jobs?namespace=${l}&limit=5`}),e.jsx(v,{to:"/workflows/executions",icon:p,title:"All durable executions"})]}),children:"Durable Executions"}),e.jsx(X,{appIds:b,selected:l,onSelect:s=>o("durablenamespace",s)}),R.length===0?e.jsx(u,{icon:M,text:"No recent executions"}):e.jsx("div",{className:"space-y-1",children:R.map(s=>e.jsx(C,{dot:V(s.status),pill:e.jsx(j,{type:s.entity||s.type||"workflow",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/workflows/executions/${s.workflow_id}`)},s.workflow_id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:Q,color:"text-violet-400",docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>k.refetch(),isFetching:k.isFetching,apiPath:`/mcp-runs?app_id=${r}&limit=5`}),e.jsx(v,{to:"/mcp/executions",icon:p,title:"All pipeline executions"})]}),children:"Pipeline Executions"}),e.jsx(X,{appIds:w,selected:r,onSelect:s=>o("pipelinenamespace",s)}),$.length===0?e.jsx(u,{icon:Q,text:"No recent pipeline runs"}):e.jsx("div",{className:"space-y-1",children:$.map(s=>e.jsx(C,{dot:V(s.status),pill:e.jsx(j,{type:s.entity||s.workflow_name||"pipeline",variant:"pipeline",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/mcp/executions/${s.workflow_id}?namespace=${r}`)},s.workflow_id))})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14",children:[e.jsxs("div",{children:[e.jsx(m,{icon:J,color:"text-amber-400",docsHash:"#docs:dashboard.md:all-escalations",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>_.refetch(),isFetching:_.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=priority&order=asc"}),e.jsx(v,{to:"/escalations/available",icon:p,title:"All available escalations"})]}),children:"All Escalations"}),q.length===0?e.jsx(u,{icon:J,text:"No pending escalations"}):e.jsx("div",{className:"space-y-1",children:q.map(s=>e.jsxs("button",{onClick:()=>t(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(N,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(j,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(B,{role:s.role})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:O,color:"text-orange-400",docsHash:"#docs:dashboard.md:escalations-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>E.refetch(),isFetching:E.isFetching,apiPath:`/escalations?assigned_to=${(a==null?void 0:a.userId)??""}&status=pending&limit=5`}),e.jsx(v,{to:"/escalations/queue",icon:p,title:"My escalation queue"})]}),children:"My Escalations"}),A.length===0?e.jsx(u,{icon:O,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-1",children:A.map(s=>e.jsxs("button",{onClick:()=>t(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(N,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(j,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(B,{role:s.role})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:U,color:"text-emerald-400",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${K?"bg-emerald-400":"bg-zinc-600"}`}),e.jsx("button",{onClick:()=>{const s=document.querySelector('[title="Fullscreen"]');s==null||s.click()},className:"text-text-quaternary hover:text-accent transition-colors",title:"View all events",children:e.jsx(p,{className:"w-2.5 h-2.5",strokeWidth:1.5})})]}),children:"Event Stream"}),P.length===0?e.jsx(u,{icon:U,text:"Events appear here in real time"}):e.jsx("div",{className:"divide-y divide-surface-border/20",children:P.map(s=>e.jsx(ge,{event:s},s.id))})]})]})]})}export{qe as HomePage};
|
|
2
|
-
//# sourceMappingURL=HomePage-
|
|
1
|
+
import{a as d,j as e}from"./vendor-query-B2UbickB.js";import{i as Z,q as H,c as N,u as ee,N as se,J as te}from"./index-DcpCR9c_.js";import{b as ae}from"./workflows-Bf4_w24H.js";import{u as ie}from"./mcp-runs-4fyRpegc.js";import{a as ne}from"./controlplane-COYEIIAz.js";import{u as re}from"./tasks-BgxRbhVM.js";import{e as oe,b as ce,u as le}from"./useEventHooks-CkJOmbF-.js";import{R as B}from"./RolePill-BDzPFQUv.js";import{W as j}from"./WorkflowPill-pPuGH8v9.js";import{L as g}from"./ListToolbar-Bntl2hex.js";import{E as de}from"./EventTopicPill-By-6sXDp.js";import{t as D,a3 as p,L as M,W as Q,C as J,I as O,R as U,B as xe,i as pe}from"./vendor-icons-BNtvBbnj.js";import{c as G,f as me}from"./vendor-react-CX88sFS5.js";const ue={completed:"bg-status-success",active:"bg-status-active",running:"bg-status-active",pending:"bg-status-pending",error:"bg-status-error",failed:"bg-status-error"};function V(t){return ue[t]??"bg-text-tertiary"}let he=0;function fe(t=5){const[a,i]=d.useState([]),[n,r]=d.useState(!1),l=d.useRef(null),o=d.useCallback(c=>{var x,f,b;if((x=c.type)!=null&&x.startsWith("mesh."))return;const h=c.activityName||c.workflowName||((f=c.data)==null?void 0:f.domain)||((b=c.workflowId)==null?void 0:b.slice(0,16))||"";i(w=>[{id:++he,type:c.type,timestamp:c.timestamp,label:h,data:c},...w].slice(0,t)),r(!0),l.current&&clearTimeout(l.current),l.current=setTimeout(()=>r(!1),2e3)},[t]);return ee(`${se}.>`,o),{events:a,pulse:n}}function m({icon:t,color:a,docsHash:i,children:n,actions:r}){return e.jsxs("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(t,{className:`w-4.5 h-4.5 ${a||"text-accent/60"}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:n})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[i&&e.jsx("button",{onClick:()=>{window.location.hash=i},className:"text-text-quaternary hover:text-accent transition-colors",title:"Docs",children:e.jsx(xe,{className:"w-2.5 h-2.5",strokeWidth:1.5})}),r]})]})}function u({icon:t,text:a}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx(t,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1}),e.jsx("p",{className:"text-xs text-text-quaternary",children:a})]})}function je(t,a=37){if(!t||t.length<=a)return t;const i=Math.floor((a-3)/2);return`${t.slice(0,i)}...${t.slice(-i)}`}function C({dot:t,pill:a,id:i,date:n,onClick:r}){return e.jsxs("button",{onClick:r,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${t}`}),e.jsx("span",{className:"text-[12px] text-text-primary font-mono truncate max-w-[60%]",children:je(i)}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap",children:e.jsx(N,{date:n})})]}),e.jsx("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:a})]})}function v({to:t,icon:a,title:i}){const n=G();return e.jsx("button",{onClick:()=>n(t),className:"text-text-quaternary hover:text-accent transition-colors",title:i,children:e.jsx(a,{className:"w-2.5 h-2.5",strokeWidth:1.5})})}function X({appIds:t,selected:a,onSelect:i}){const[n,r]=d.useState(!1),l=d.useRef(null);return d.useEffect(()=>{if(!n)return;const o=c=>{l.current&&!l.current.contains(c.target)&&r(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[n]),t.length<=1?null:e.jsxs("div",{className:"relative mb-3 -mt-2",ref:l,children:[e.jsxs("button",{onClick:()=>r(o=>!o),className:"flex items-center gap-1 px-2 py-0.5 text-[10px] rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors",children:[a,e.jsx("svg",{className:`w-2.5 h-2.5 transition-transform ${n?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),n&&e.jsx("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-30 py-1 min-w-[120px]",children:t.map(o=>e.jsx("button",{onClick:()=>{i(o),r(!1)},className:`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${a===o?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:o},o))})]})}function ge({event:t}){const[a,i]=d.useState(!1);return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>i(!a),className:"w-full text-left px-1 py-2 hover:bg-surface-hover/50 rounded-md transition-colors flex items-center gap-2",children:[e.jsx(pe,{className:`w-2.5 h-2.5 text-text-quaternary shrink-0 transition-transform ${a?"rotate-0":"-rotate-90"}`}),e.jsx(de,{topic:t.type}),e.jsx("span",{className:"text-[11px] text-text-secondary font-mono truncate flex-1",children:t.label||"—"}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0",children:e.jsx(N,{date:t.timestamp,format:"time"})})]}),a&&e.jsx("div",{className:"pl-5 pb-2",children:e.jsx(te,{data:t.data,defaultCollapsed:!1})})]})}function qe(){var F,L,W,I,T;const t=G(),{user:a}=Z(),[i,n]=me(),r=i.get("pipelinenamespace")||"hmsh",l=i.get("durablenamespace")||"durable",o=d.useCallback((s,y)=>{n(Y=>{const z=new URLSearchParams(Y);return z.set(s,y),z},{replace:!1})},[n]);oe(),ce(),le();const c=re({limit:5}),h=ae({limit:5,sort_by:"updated_at",order:"desc",namespace:l}),{data:x}=ne(),f=((x==null?void 0:x.apps)??[]).map(s=>s.appId),b=f,w=f,k=ie({limit:5,app_id:r,sort_by:"updated_at",order:"desc"}),_=H({status:"pending",limit:5,sort_by:"updated_at",order:"desc"}),E=H({assigned_to:a==null?void 0:a.userId,status:"pending",limit:5,sort_by:"updated_at",order:"desc"}),{events:P,pulse:K}=fe(),S=((F=c.data)==null?void 0:F.processes)??[],R=((L=h.data)==null?void 0:L.jobs)??[],$=((W=k.data)==null?void 0:W.jobs)??[],q=((I=_.data)==null?void 0:I.escalations)??[],A=((T=E.data)==null?void 0:T.escalations)??[];return e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary mb-10",children:"Recent Activity"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-14",children:[e.jsxs("div",{children:[e.jsx(m,{icon:D,color:"text-emerald-400",docsHash:"#docs:dashboard.md:processes-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>c.refetch(),isFetching:c.isFetching,apiPath:"/tasks/processes?limit=5"}),e.jsx(v,{to:"/processes/all",icon:p,title:"All processes"})]}),children:"Certified Processes"}),e.jsx("div",{className:"mb-3 -mt-2",children:e.jsx("span",{className:"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest",children:"all namespaces"})}),S.length===0?e.jsx(u,{icon:D,text:"No recent processes"}):e.jsx("div",{className:"space-y-1",children:S.map(s=>e.jsx(C,{dot:(s.task_count??0)>0&&(s.completed??0)>=(s.task_count??0)?"bg-status-success":(s.escalated??0)>0?"border border-status-error":"bg-status-active",pill:e.jsx(e.Fragment,{children:(s.workflow_types??[s.workflow_type]).filter(Boolean).map(y=>e.jsx(j,{type:y,size:"xs"},y))}),id:s.origin_id,date:s.last_activity??s.started_at,onClick:()=>t(`/processes/detail/${s.origin_id}`)},s.origin_id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:M,color:"text-blue-400",docsHash:"#docs:dashboard.md:durable-executions",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>h.refetch(),isFetching:h.isFetching,apiPath:`/workflow-states/jobs?namespace=${l}&limit=5`}),e.jsx(v,{to:"/workflows/executions",icon:p,title:"All durable executions"})]}),children:"Durable Executions"}),e.jsx(X,{appIds:b,selected:l,onSelect:s=>o("durablenamespace",s)}),R.length===0?e.jsx(u,{icon:M,text:"No recent executions"}):e.jsx("div",{className:"space-y-1",children:R.map(s=>e.jsx(C,{dot:V(s.status),pill:e.jsx(j,{type:s.entity||s.type||"workflow",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/workflows/executions/${s.workflow_id}`)},s.workflow_id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:Q,color:"text-violet-400",docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>k.refetch(),isFetching:k.isFetching,apiPath:`/mcp-runs?app_id=${r}&limit=5`}),e.jsx(v,{to:"/mcp/executions",icon:p,title:"All pipeline executions"})]}),children:"Pipeline Executions"}),e.jsx(X,{appIds:w,selected:r,onSelect:s=>o("pipelinenamespace",s)}),$.length===0?e.jsx(u,{icon:Q,text:"No recent pipeline runs"}):e.jsx("div",{className:"space-y-1",children:$.map(s=>e.jsx(C,{dot:V(s.status),pill:e.jsx(j,{type:s.entity||s.workflow_name||"pipeline",variant:"pipeline",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/mcp/executions/${s.workflow_id}?namespace=${r}`)},s.workflow_id))})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14",children:[e.jsxs("div",{children:[e.jsx(m,{icon:J,color:"text-amber-400",docsHash:"#docs:dashboard.md:all-escalations",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>_.refetch(),isFetching:_.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=priority&order=asc"}),e.jsx(v,{to:"/escalations/available",icon:p,title:"All available escalations"})]}),children:"All Escalations"}),q.length===0?e.jsx(u,{icon:J,text:"No pending escalations"}):e.jsx("div",{className:"space-y-1",children:q.map(s=>e.jsxs("button",{onClick:()=>t(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(N,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(j,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(B,{role:s.role})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:O,color:"text-orange-400",docsHash:"#docs:dashboard.md:escalations-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(g,{onRefresh:()=>E.refetch(),isFetching:E.isFetching,apiPath:`/escalations?assigned_to=${(a==null?void 0:a.userId)??""}&status=pending&limit=5`}),e.jsx(v,{to:"/escalations/queue",icon:p,title:"My escalation queue"})]}),children:"My Escalations"}),A.length===0?e.jsx(u,{icon:O,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-1",children:A.map(s=>e.jsxs("button",{onClick:()=>t(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(N,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(j,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(B,{role:s.role})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsx(m,{icon:U,color:"text-emerald-400",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${K?"bg-emerald-400":"bg-zinc-600"}`}),e.jsx("button",{onClick:()=>{const s=document.querySelector('[title="Fullscreen"]');s==null||s.click()},className:"text-text-quaternary hover:text-accent transition-colors",title:"View all events",children:e.jsx(p,{className:"w-2.5 h-2.5",strokeWidth:1.5})})]}),children:"Event Stream"}),P.length===0?e.jsx(u,{icon:U,text:"Events appear here in real time"}):e.jsx("div",{className:"divide-y divide-surface-border/20",children:P.map(s=>e.jsx(ge,{event:s},s.id))})]})]})]})}export{qe as HomePage};
|
|
2
|
+
//# sourceMappingURL=HomePage-DVOi7rR1.js.map
|