agent-relay-server 0.102.1 → 0.103.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/openapi.json +1 -1
- package/package.json +4 -2
- package/public/assets/MessageBubble-BpiTbbnp.js +4 -0
- package/public/assets/{MessageBubble-Dppo7pil.js.map → MessageBubble-BpiTbbnp.js.map} +1 -1
- package/public/assets/{PlanGraphPanel-DO5OY2qa.js → PlanGraphPanel-k8Aa98g5.js} +2 -2
- package/public/assets/{PlanGraphPanel-DO5OY2qa.js.map → PlanGraphPanel-k8Aa98g5.js.map} +1 -1
- package/public/assets/{activity-BhuOs5ha.js → activity-CxKi5Erb.js} +2 -2
- package/public/assets/{activity-BhuOs5ha.js.map → activity-CxKi5Erb.js.map} +1 -1
- package/public/assets/agent-profiles-DMZXdN6K.js +2 -0
- package/public/assets/agent-profiles-DMZXdN6K.js.map +1 -0
- package/public/assets/agents-BrvpH3gn.js +2 -0
- package/public/assets/agents-BrvpH3gn.js.map +1 -0
- package/public/assets/{analytics-BxGRljQc.js → analytics-1fvh-9ok.js} +2 -2
- package/public/assets/{analytics-BxGRljQc.js.map → analytics-1fvh-9ok.js.map} +1 -1
- package/public/assets/automation-BCgX5WOH.js +2 -0
- package/public/assets/automation-BCgX5WOH.js.map +1 -0
- package/public/assets/{branch-state-badge-olhanssg.js → branch-state-badge-DYA7bU0i.js} +2 -2
- package/public/assets/{branch-state-badge-olhanssg.js.map → branch-state-badge-DYA7bU0i.js.map} +1 -1
- package/public/assets/{channels-yHkm1dux.js → channels-CK80oJYG.js} +2 -2
- package/public/assets/{channels-yHkm1dux.js.map → channels-CK80oJYG.js.map} +1 -1
- package/public/assets/chat-D_2PEz06.js +2 -0
- package/public/assets/chat-D_2PEz06.js.map +1 -0
- package/public/assets/{connectors-DpR0V2hy.js → connectors-ChGyht5m.js} +2 -2
- package/public/assets/{connectors-DpR0V2hy.js.map → connectors-ChGyht5m.js.map} +1 -1
- package/public/assets/display-D1xB8NJZ.js +3 -0
- package/public/assets/display-D1xB8NJZ.js.map +1 -0
- package/public/assets/{formatted-body-impl-BTeCfK4I.js → formatted-body-impl-BJ4WCF5J.js} +2 -2
- package/public/assets/{formatted-body-impl-BTeCfK4I.js.map → formatted-body-impl-BJ4WCF5J.js.map} +1 -1
- package/public/assets/index-BMO_Sblt.css +2 -0
- package/public/assets/index-CN7QZlMb.js +23 -0
- package/public/assets/index-CN7QZlMb.js.map +1 -0
- package/public/assets/{insights-C4aYlgsY.js → insights-BCZRV0hX.js} +2 -2
- package/public/assets/{insights-C4aYlgsY.js.map → insights-BCZRV0hX.js.map} +1 -1
- package/public/assets/{integrations-CEmYa5mW.js → integrations-C7UGs00U.js} +2 -2
- package/public/assets/{integrations-CEmYa5mW.js.map → integrations-C7UGs00U.js.map} +1 -1
- package/public/assets/maintenance-ChYno3Fm.js +2 -0
- package/public/assets/{maintenance-DVx3SiC_.js.map → maintenance-ChYno3Fm.js.map} +1 -1
- package/public/assets/{managed-agents-DUyOTdz1.js → managed-agents-DjxZQNIR.js} +4 -4
- package/public/assets/managed-agents-DjxZQNIR.js.map +1 -0
- package/public/assets/{markdown-preview-impl-D3hYfzGD.js → markdown-preview-impl-DFa5HF1H.js} +2 -2
- package/public/assets/{markdown-preview-impl-D3hYfzGD.js.map → markdown-preview-impl-DFa5HF1H.js.map} +1 -1
- package/public/assets/{memory-2IfPgcnN.js → memory-CTw6kadT.js} +2 -2
- package/public/assets/{memory-2IfPgcnN.js.map → memory-CTw6kadT.js.map} +1 -1
- package/public/assets/{messages-CkOwABhw.js → messages-Cjr816D_.js} +2 -2
- package/public/assets/{messages-CkOwABhw.js.map → messages-Cjr816D_.js.map} +1 -1
- package/public/assets/{orchestrators-CEKO3eQ1.js → orchestrators-CdmFKA7K.js} +2 -2
- package/public/assets/{orchestrators-CEKO3eQ1.js.map → orchestrators-CdmFKA7K.js.map} +1 -1
- package/public/assets/overview-DBOnjfpP.js +2 -0
- package/public/assets/{overview-D9BxevAq.js.map → overview-DBOnjfpP.js.map} +1 -1
- package/public/assets/{pairs-CqT4D1uL.js → pairs-BkcdKdF7.js} +2 -2
- package/public/assets/{pairs-CqT4D1uL.js.map → pairs-BkcdKdF7.js.map} +1 -1
- package/public/assets/{projects-C_zwR-Fn.js → projects-ClKbDQB1.js} +2 -2
- package/public/assets/{projects-C_zwR-Fn.js.map → projects-ClKbDQB1.js.map} +1 -1
- package/public/assets/registry-Bsf3RtOO.js +2 -0
- package/public/assets/registry-Bsf3RtOO.js.map +1 -0
- package/public/assets/{security-8a5_4U3S.js → security-Iyu5bhJw.js} +2 -2
- package/public/assets/{security-8a5_4U3S.js.map → security-Iyu5bhJw.js.map} +1 -1
- package/public/assets/{select-s4BE-T62.js → select-Bi6tNJDx.js} +2 -2
- package/public/assets/{select-s4BE-T62.js.map → select-Bi6tNJDx.js.map} +1 -1
- package/public/assets/settings-CbHp2F9r.js +6 -0
- package/public/assets/settings-CbHp2F9r.js.map +1 -0
- package/public/assets/store-zeyDiSKE.js +9 -0
- package/public/assets/store-zeyDiSKE.js.map +1 -0
- package/public/assets/{tasks-Bcr17zR3.js → tasks-CPlf-5Tr.js} +2 -2
- package/public/assets/{tasks-Bcr17zR3.js.map → tasks-CPlf-5Tr.js.map} +1 -1
- package/public/assets/teams-D2uUNhlY.js +2 -0
- package/public/assets/{teams-B_HSkU9T.js.map → teams-D2uUNhlY.js.map} +1 -1
- package/public/assets/{terminal-viewer-impl-Ctp4csJ3.js → terminal-viewer-impl-uRzbrlXy.js} +2 -2
- package/public/assets/{terminal-viewer-impl-Ctp4csJ3.js.map → terminal-viewer-impl-uRzbrlXy.js.map} +1 -1
- package/public/assets/types-DorDDvEb.js +2 -0
- package/public/assets/types-DorDDvEb.js.map +1 -0
- package/public/assets/{user-avatar-RliaJcaG.js → user-avatar-GFWMuAGK.js} +2 -2
- package/public/assets/{user-avatar-RliaJcaG.js.map → user-avatar-GFWMuAGK.js.map} +1 -1
- package/public/assets/{work-queue-C0hpmlv8.js → work-queue-B30SNmuq.js} +2 -2
- package/public/assets/{work-queue-C0hpmlv8.js.map → work-queue-B30SNmuq.js.map} +1 -1
- package/public/assets/{workspaces-QXbQx_AG.js → workspaces-CSpmgbPT.js} +3 -3
- package/public/assets/{workspaces-QXbQx_AG.js.map → workspaces-CSpmgbPT.js.map} +1 -1
- package/public/index.html +5 -5
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/monitors/relay-monitor.provisioned.mjs +238 -16
- package/runner/src/config.ts +8 -3
- package/src/automations/validation.ts +3 -3
- package/src/cli/orchestrator.ts +7 -5
- package/src/cli/provider.ts +26 -10
- package/src/cli/upgrade.ts +5 -4
- package/src/commands-db.ts +1 -1
- package/src/config-store.ts +3 -3
- package/src/config.ts +3 -3
- package/src/context-advisory.ts +3 -3
- package/src/db/channels.ts +30 -2
- package/src/db/provider-quota-burn.ts +37 -5
- package/src/db/provider-quotas.ts +11 -2
- package/src/db/provisioning-registry.ts +49 -61
- package/src/managed-policy.ts +7 -2
- package/src/mcp/tools-spawn.ts +2 -2
- package/src/mcp-team-template-tools.ts +2 -2
- package/src/provider-catalog-store.ts +1 -1
- package/src/quota-band-transition.ts +59 -8
- package/src/recipe-validator.ts +4 -2
- package/src/routes/agent-profiles.ts +2 -2
- package/src/routes/agent-sessions.ts +18 -23
- package/src/routes/provider-config.ts +1 -1
- package/src/spawn-targets.ts +32 -4
- package/src/sse.ts +12 -1
- package/src/upgrade.ts +120 -44
- package/src/workspace-phase.ts +1 -0
- package/public/assets/MessageBubble-Dppo7pil.js +0 -4
- package/public/assets/agent-profiles-CT-vbfzd.js +0 -2
- package/public/assets/agent-profiles-CT-vbfzd.js.map +0 -1
- package/public/assets/agents-CLcgi8AD.js +0 -2
- package/public/assets/agents-CLcgi8AD.js.map +0 -1
- package/public/assets/automation-CE1i1zpw.js +0 -2
- package/public/assets/automation-CE1i1zpw.js.map +0 -1
- package/public/assets/chat-DHdFZvAg.js +0 -2
- package/public/assets/chat-DHdFZvAg.js.map +0 -1
- package/public/assets/display-DRiGi1zj.js +0 -3
- package/public/assets/display-DRiGi1zj.js.map +0 -1
- package/public/assets/index-CKhh9XRZ.css +0 -2
- package/public/assets/index-DeDosfVE.js +0 -23
- package/public/assets/index-DeDosfVE.js.map +0 -1
- package/public/assets/maintenance-DVx3SiC_.js +0 -2
- package/public/assets/managed-agents-DUyOTdz1.js.map +0 -1
- package/public/assets/overview-D9BxevAq.js +0 -2
- package/public/assets/registry-BLjwVXCW.js +0 -2
- package/public/assets/registry-BLjwVXCW.js.map +0 -1
- package/public/assets/settings-BR30UpbJ.js +0 -6
- package/public/assets/settings-BR30UpbJ.js.map +0 -1
- package/public/assets/store-DNbkrqbU.js +0 -9
- package/public/assets/store-DNbkrqbU.js.map +0 -1
- package/public/assets/teams-B_HSkU9T.js +0 -2
- package/public/assets/types-Tv67voFu.js +0 -2
- package/public/assets/types-Tv67voFu.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents-CLcgi8AD.js","names":["Popover","PopperPrimitive.Root","PopperPrimitive.Anchor","PopoverTrigger","PortalPrimitive","PopoverContent","RemoveScroll","PopperPrimitive.Content","PopperPrimitive.Arrow"],"sources":["../../dashboard/node_modules/@radix-ui/react-popover/dist/index.mjs","../../dashboard/src/components/ui/popover.tsx","../../dashboard/src/components/views/agents.tsx"],"sourcesContent":["\"use client\";\n\n// src/popover.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar POPOVER_NAME = \"Popover\";\nvar [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);\nvar Popover = (props) => {\n const {\n __scopePopover,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = false\n } = props;\n const popperScope = usePopperScope(__scopePopover);\n const triggerRef = React.useRef(null);\n const [hasCustomAnchor, setHasCustomAnchor] = React.useState(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: POPOVER_NAME\n });\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n PopoverProvider,\n {\n scope: __scopePopover,\n contentId: useId(),\n triggerRef,\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n hasCustomAnchor,\n onCustomAnchorAdd: React.useCallback(() => setHasCustomAnchor(true), []),\n onCustomAnchorRemove: React.useCallback(() => setHasCustomAnchor(false), []),\n modal,\n children\n }\n ) });\n};\nPopover.displayName = POPOVER_NAME;\nvar ANCHOR_NAME = \"PopoverAnchor\";\nvar PopoverAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...anchorProps } = props;\n const context = usePopoverContext(ANCHOR_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const { onCustomAnchorAdd, onCustomAnchorRemove } = context;\n React.useEffect(() => {\n onCustomAnchorAdd();\n return () => onCustomAnchorRemove();\n }, [onCustomAnchorAdd, onCustomAnchorRemove]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nPopoverAnchor.displayName = ANCHOR_NAME;\nvar TRIGGER_NAME = \"PopoverTrigger\";\nvar PopoverTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...triggerProps } = props;\n const context = usePopoverContext(TRIGGER_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n const trigger = /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n return context.hasCustomAnchor ? trigger : /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: trigger });\n }\n);\nPopoverTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"PopoverPortal\";\nvar [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar PopoverPortal = (props) => {\n const { __scopePopover, forceMount, children, container } = props;\n const context = usePopoverContext(PORTAL_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopePopover, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nPopoverPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"PopoverContent\";\nvar PopoverContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopePopover);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(PopoverContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(PopoverContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nPopoverContent.displayName = CONTENT_NAME;\nvar Slot = createSlot(\"PopoverContent.RemoveScroll\");\nvar PopoverContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const isRightClickOutsideRef = React.useRef(false);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n if (!isRightClickOutsideRef.current) context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(\n props.onPointerDownOutside,\n (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutsideRef.current = isRightClick;\n },\n { checkForDefaultPrevented: false }\n ),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nvar PopoverContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar PopoverContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopePopover,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n ...contentProps\n } = props;\n const context = usePopoverContext(CONTENT_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n useFocusGuards();\n return /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onInteractOutside,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onDismiss: () => context.onOpenChange(false),\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n \"data-state\": getState(context.open),\n role: \"dialog\",\n id: context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-popover-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-popover-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-popover-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-popover-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-popover-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n )\n }\n )\n }\n );\n }\n);\nvar CLOSE_NAME = \"PopoverClose\";\nvar PopoverClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...closeProps } = props;\n const context = usePopoverContext(CLOSE_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nPopoverClose.displayName = CLOSE_NAME;\nvar ARROW_NAME = \"PopoverArrow\";\nvar PopoverArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopePopover);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nPopoverArrow.displayName = ARROW_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar Root2 = Popover;\nvar Anchor2 = PopoverAnchor;\nvar Trigger = PopoverTrigger;\nvar Portal = PopoverPortal;\nvar Content2 = PopoverContent;\nvar Close = PopoverClose;\nvar Arrow2 = PopoverArrow;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n Close,\n Content2 as Content,\n Popover,\n PopoverAnchor,\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverTrigger,\n Portal,\n Root2 as Root,\n Trigger,\n createPopoverScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-0.5 text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return (\n <div\n data-slot=\"popover-title\"\n className={cn(\"font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n}\n","import { useAgentTerminal } from '@/hooks/use-agent-terminal'\nimport { useRelayStore, useNow } from '@/store'\nimport {\n useSortedAgents, useUniqueTags, useUniqueHosts, usePairsByAgentId, useAgentAttention,\n} from '@/hooks/use-selectors'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Popover, PopoverContent, PopoverHeader, PopoverTitle, PopoverTrigger } from '@/components/ui/popover'\nimport { StatusDot } from '@/components/shared/status-dot'\nimport { AgentTypeIcon } from '@/components/shared/agent-type-icon'\nimport { ProfileIcon, agentProfileName } from '@/components/shared/profile-icon'\nimport { BranchStateBadge } from '@/components/shared/branch-state-badge'\nimport { AgentRuntimeBadges, AgentRuntimeChips, ContextMeter } from '@/components/shared/agent-runtime-summary'\nimport { TerminalDialog } from '@/components/shared/terminal-viewer'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport { AgentProjectBadge } from '@/components/shared/agent-project-badge'\nimport {\n displayName, timeAgo, agentPresence, toneToColor, agentSupportsControlAction, agentCanBeForgotten, userFacingCapabilities, shortPath,\n} from '@/lib/display'\nimport { liveChildrenByParent, sortedLiveChildren, topLevelAgentsForTeamView } from '@/lib/agent-lineage'\nimport {\n MessageSquare, Link, Edit3, Power, Terminal, Minimize2, Eraser, Trash2, Plus, SortAsc, SortDesc, X, Flag, Users,\n} from 'lucide-react'\nimport type { Agent } from '@/types'\n\nfunction AgentCard({ agent, childAgents = [], parentAgent }: { agent: Agent; childAgents?: Agent[]; parentAgent?: Agent | null }) {\n const now = useNow()\n const set = useRelayStore((s) => s.set)\n const switchView = useRelayStore((s) => s.switchView)\n const openInboxThread = useRelayStore((s) => s.openInboxThread)\n const openAgentDetail = useRelayStore((s) => s.openAgentDetail)\n const openPairInvite = useRelayStore((s) => s.openPairInvite)\n const openRename = useRelayStore((s) => s.openRename)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const doAgentAction = useRelayStore((s) => s.doAgentAction)\n const doDeleteAgent = useRelayStore((s) => s.doDeleteAgent)\n const openFilesForAgent = useRelayStore((s) => s.openFilesForAgent)\n const workspaceAction = useRelayStore((s) => s.workspaceAction)\n const openWorkspaceFocus = useRelayStore((s) => s.openWorkspaceFocus)\n\n const { terminalOpen, terminalTarget, terminalOpening, openTerminal: handleOpenTerminal, closeTerminal: handleCloseTerminal } = useAgentTerminal(agent.id)\n\n const pairsMap = usePairsByAgentId()\n const attention = useAgentAttention(agent)\n const pair = pairsMap[agent.id] || null\n const presence = agentPresence(now, agent, attention, pair)\n\n const canShutdown = agentSupportsControlAction(agent, 'shutdown')\n const canCompact = agentSupportsControlAction(agent, 'compact')\n const canClearContext = agentSupportsControlAction(agent, 'clearContext')\n const canOpenTerminal = Boolean(agent.providerCapabilities?.terminal?.live?.read || agent.providerCapabilities?.terminal?.attach?.create)\n const canWriteTerminal = Boolean(agent.providerCapabilities?.terminal?.live?.write || agent.providerCapabilities?.model?.provider === 'claude')\n const canForget = agentCanBeForgotten(agent)\n const parentLabel = parentAgent ? displayName(parentAgent) : agent.spawnedBy\n const hasTeam = childAgents.length > 0\n\n return (\n <>\n <Card\n className=\"group hover:border-zinc-600 transition-colors cursor-pointer\"\n onClick={() => openAgentDetail(agent)}\n >\n <CardContent className=\"p-4\">\n <div className=\"flex items-start gap-2.5 mb-2.5\">\n <StatusDot agent={agent} now={now} className=\"mt-0.5\" />\n <AgentTypeIcon agent={agent} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1 min-w-0\">\n <ProfileIcon profile={agentProfileName(agent)} className=\"text-sm shrink-0\" />\n <span className=\"text-sm font-medium truncate\">{displayName(agent)}</span>\n </div>\n <div className={`text-xs mt-0.5 ${toneToColor(presence.tone)}`}>{presence.label}</div>\n {typeof agent.meta?.cwd === 'string' && agent.meta.cwd && (\n <button\n type=\"button\"\n className=\"mt-0.5 block max-w-full truncate font-mono text-[10px] text-muted-foreground hover:text-foreground\"\n title={`Open ${agent.meta.cwd as string} in Files`}\n onClick={(e) => { e.stopPropagation(); void openFilesForAgent(agent) }}\n >\n {shortPath(agent.meta.cwd as string)}\n </button>\n )}\n <AgentProjectBadge agent={agent} className=\"mt-1\" />\n </div>\n {agent.branchState && agent.branchWorkspaceId && (\n <BranchStateBadge\n state={agent.branchState}\n className=\"mt-0.5 shrink-0\"\n onClick={(e) => { e.stopPropagation(); void openWorkspaceFocus(agent.branchWorkspaceId!) }}\n />\n )}\n </div>\n\n {/* Presence badges */}\n {presence.badges.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {presence.badges.map((b) => (\n <span key={b.label} className={`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${b.className}`}>\n {b.label}\n </span>\n ))}\n </div>\n )}\n\n {(hasTeam || (agent.spawnedBy && parentLabel)) && (\n <div className=\"mb-2 flex flex-wrap gap-1.5\" onClick={(e) => e.stopPropagation()}>\n {hasTeam && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-6 max-w-full items-center gap-1.5 rounded-full border border-sky-500/30 bg-sky-500/10 px-2 text-[10px] font-medium text-sky-300 transition-colors hover:bg-sky-500/15\"\n title={`${childAgents.length} live child ${childAgents.length === 1 ? 'agent' : 'agents'}`}\n >\n <Users className=\"h-3 w-3\" />\n <span>{childAgents.length}</span>\n <span className=\"flex -space-x-1\">\n {childAgents.slice(0, 4).map((child) => (\n <StatusDot key={child.id} agent={child} now={now} className=\"h-2 w-2 ring-1 ring-background\" />\n ))}\n </span>\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-80\" onClick={(e) => e.stopPropagation()}>\n <PopoverHeader>\n <PopoverTitle>Team</PopoverTitle>\n </PopoverHeader>\n <div className=\"space-y-1.5\">\n {childAgents.map((child) => (\n <div key={child.id} className=\"rounded-md border border-border bg-card/60 p-2\">\n <div className=\"flex items-start gap-2\">\n <StatusDot agent={child} now={now} className=\"mt-1\" />\n <AgentTypeIcon agent={child} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{displayName(child)}</div>\n <div className=\"truncate text-[10px] text-muted-foreground\">\n {child.providerCapabilities?.model?.alias || child.providerCapabilities?.model?.id || child.providerCapabilities?.model?.provider || child.status}\n </div>\n </div>\n <Badge variant=\"outline\" className=\"h-4 px-1.5 text-[9px]\">{child.status}</Badge>\n </div>\n <div className=\"mt-2 flex gap-1\">\n <Button size=\"xs\" variant=\"outline\" onClick={() => openAgentDetail(child)}>Open</Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => { openInboxThread(child.id); switchView('chat') }}>\n <MessageSquare className=\"h-3 w-3\" />\n Chat\n </Button>\n </div>\n </div>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n {agent.spawnedBy && parentLabel && (\n <Badge variant=\"outline\" className=\"max-w-full text-[10px] text-muted-foreground\">\n <span className=\"truncate\">spawned by {parentLabel}</span>\n </Badge>\n )}\n </div>\n )}\n\n {/* Tags + caps */}\n {(agent.tags.length > 0 || userFacingCapabilities(agent.capabilities).length > 0) && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {agent.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px] px-1 py-0 h-4\">{t}</Badge>\n ))}\n {userFacingCapabilities(agent.capabilities).slice(0, 2).map((c) => (\n <Badge key={c} variant=\"secondary\" className=\"text-[9px] px-1 py-0 h-4\">{c}</Badge>\n ))}\n </div>\n )}\n\n <div className=\"space-y-2 mb-2\">\n <AgentRuntimeChips agent={agent} />\n <AgentRuntimeBadges agent={agent} compact />\n <ContextMeter agent={agent} />\n </div>\n\n <div className=\"text-xs text-muted-foreground\">\n {agent.id !== 'user' && agent.id !== 'system' && timeAgo(now, agent.lastSeen)}\n </div>\n\n {/* Action buttons – always visible on mobile, hover on desktop */}\n <div\n className=\"flex gap-1 mt-2.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity\"\n onClick={(e) => e.stopPropagation()}\n >\n <CopyButton value={agent.id} label=\"Copy agent ID\" size=\"icon\" className=\"h-7 w-7\" iconClassName=\"w-3 h-3\" />\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Chat\" onClick={() => { openInboxThread(agent.id); switchView('chat') }}>\n <MessageSquare className=\"w-3 h-3\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Pair\" onClick={() => openPairInvite(agent.id)}>\n <Link className=\"w-3 h-3\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Rename\" onClick={() => openRename(agent)}>\n <Edit3 className=\"w-3 h-3\" />\n </Button>\n {canOpenTerminal && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Terminal\" disabled={terminalOpening} onClick={() => void handleOpenTerminal()}>\n <Terminal className=\"w-3 h-3\" />\n </Button>\n )}\n {(agent.branchState === 'changes' || agent.branchState === 'idle') && agent.branchWorkspaceId && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-amber-400 hover:text-amber-300\" title=\"Mark workspace ready — hand off to the auto-merge\" onClick={() => openConfirm('Mark Workspace Ready', `Mark ${displayName(agent)}'s branch ready to land? The relay auto-merge will rebase and land it.`, () => workspaceAction(agent.branchWorkspaceId!, 'ready'))}>\n <Flag className=\"w-3 h-3\" />\n </Button>\n )}\n {canCompact && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Compact\" onClick={() => openConfirm('Compact Agent', `Compact context for ${displayName(agent)}?`, () => doAgentAction(agent, 'compact', 'agents-grid'))}>\n <Minimize2 className=\"w-3 h-3\" />\n </Button>\n )}\n {canClearContext && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Clear Context\" onClick={() => openConfirm('Clear Context', `Clear context for ${displayName(agent)}?`, () => doAgentAction(agent, 'clearContext', 'agents-grid'))}>\n <Eraser className=\"w-3 h-3\" />\n </Button>\n )}\n {canShutdown && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Shutdown\" onClick={() => openConfirm('Shutdown Agent', `Shutdown ${displayName(agent)}?`, () => doAgentAction(agent, 'shutdown', 'agents-grid'))}>\n <Power className=\"w-3 h-3\" />\n </Button>\n )}\n {canForget && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Forget stale agent\" onClick={() => openConfirm('Forget Agent', `Forget ${displayName(agent)}?`, () => doDeleteAgent(agent.id))}>\n <Trash2 className=\"w-3 h-3\" />\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n {terminalTarget && (\n <TerminalDialog open={terminalOpen} onOpenChange={handleCloseTerminal} orchestratorId={terminalTarget.orchestratorId} session={terminalTarget.session} interactive={terminalTarget.interactive || canWriteTerminal} />\n )}\n </>\n )\n}\n\nexport function AgentsView() {\n const agentPresetFilter = useRelayStore((s) => s.agentPresetFilter)\n const agentStatusFilter = useRelayStore((s) => s.agentStatusFilter)\n const agentTagFilter = useRelayStore((s) => s.agentTagFilter)\n const agentHostFilter = useRelayStore((s) => s.agentHostFilter)\n const agentSort = useRelayStore((s) => s.agentSort)\n const agentSortDir = useRelayStore((s) => s.agentSortDir)\n const showOffline = useRelayStore((s) => s.showOffline)\n const set = useRelayStore((s) => s.set)\n const openAgentSpawn = useRelayStore((s) => s.openAgentSpawn)\n const agentsById = useRelayStore((s) => s.agentsById)\n const now = useNow()\n\n const sortedAgents = useSortedAgents()\n const uniqueTags = useUniqueTags()\n const uniqueHosts = useUniqueHosts()\n const childrenByParent = liveChildrenByParent(sortedAgents, now)\n const topLevelAgents = topLevelAgentsForTeamView(sortedAgents, now)\n\n const hasFilters = agentPresetFilter || agentStatusFilter || agentTagFilter || agentHostFilter\n\n function clearFilters() {\n set({ agentPresetFilter: '', agentStatusFilter: '', agentTagFilter: '', agentHostFilter: '' })\n }\n\n function toggleSortDir() {\n set({ agentSortDir: agentSortDir === 'asc' ? 'desc' : 'asc' })\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <select\n value={agentPresetFilter}\n onChange={(e) => set({ agentPresetFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">All agents</option>\n <option value=\"active\">Active</option>\n <option value=\"claude\">Claude</option>\n <option value=\"codex\">Codex</option>\n <option value=\"paired\">Paired</option>\n <option value=\"unpaired\">Unpaired</option>\n <option value=\"offline_stale\">Offline / Stale</option>\n </select>\n\n <select\n value={agentStatusFilter}\n onChange={(e) => set({ agentStatusFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any status</option>\n <option value=\"online\">Online</option>\n <option value=\"idle\">Idle</option>\n <option value=\"busy\">Busy</option>\n <option value=\"offline\">Offline</option>\n <option value=\"starting\">Starting</option>\n </select>\n\n {uniqueTags.length > 0 && (\n <select\n value={agentTagFilter}\n onChange={(e) => set({ agentTagFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any tag</option>\n {uniqueTags.map((t) => <option key={t} value={t}>{t}</option>)}\n </select>\n )}\n\n {uniqueHosts.length > 1 && (\n <select\n value={agentHostFilter}\n onChange={(e) => set({ agentHostFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any host</option>\n {uniqueHosts.map((h) => <option key={h} value={h}>{h}</option>)}\n </select>\n )}\n\n <select\n value={agentSort}\n onChange={(e) => set({ agentSort: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"status\">Sort: Status</option>\n <option value=\"name\">Sort: Name</option>\n <option value=\"lastSeen\">Sort: Last seen</option>\n <option value=\"created\">Sort: Created</option>\n </select>\n\n <Button size=\"icon\" variant=\"outline\" className=\"h-8 w-8\" title=\"Toggle sort direction\" onClick={toggleSortDir}>\n {agentSortDir === 'asc' ? <SortAsc className=\"w-3.5 h-3.5\" /> : <SortDesc className=\"w-3.5 h-3.5\" />}\n </Button>\n\n <label className=\"flex items-center gap-1.5 text-sm text-muted-foreground cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={showOffline}\n onChange={(e) => set({ showOffline: e.target.checked })}\n className=\"rounded\"\n />\n Show offline\n </label>\n\n {hasFilters && (\n <Button size=\"sm\" variant=\"ghost\" className=\"h-8 text-muted-foreground hover:text-foreground gap-1\" onClick={clearFilters}>\n <X className=\"w-3 h-3\" />\n Clear filters\n </Button>\n )}\n\n <div className=\"ml-auto\">\n <Button size=\"sm\" onClick={openAgentSpawn} className=\"gap-1\">\n <Plus className=\"w-3.5 h-3.5\" />\n Spawn\n </Button>\n </div>\n </div>\n\n {/* Agent grid */}\n {topLevelAgents.length === 0 ? (\n <div className=\"text-center py-16 text-muted-foreground text-sm\">\n No agents match the current filters.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-3\">\n {topLevelAgents.map((agent) => (\n <AgentCard\n key={agent.id}\n agent={agent}\n parentAgent={agent.spawnedBy ? agentsById[agent.spawnedBy] ?? null : null}\n childAgents={sortedLiveChildren(childrenByParent.get(agent.id) ?? [])}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./chunk-CilyBKbf.js";import{A as t,B as n,H as r,M as i,On as a,Qn as o,Vt as s,W as c,dr as l,h as u}from"./lucide-react-BYZuAhQs.js";import{c as d,d as f,s as p,t as m}from"./store-DNbkrqbU.js";import{K as h,h as g}from"./display-DRiGi1zj.js";import{t as _}from"./badge-BLar6FjP.js";import{t as v}from"./button-BrIB69qd.js";import{t as y}from"./input-B_fUHtLD.js";import{n as b,r as x,v as S,z as C}from"./index-DeDosfVE.js";import{a as w,o as T,r as E,t as D}from"./card-lhnFnBoz.js";var O=e(l(),1),k=o(),A={scheduled:`bg-blue-500/10 text-blue-400 border-blue-500/20`,dispatching:`bg-sky-500/10 text-sky-400 border-sky-500/20`,waiting_agent:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,running:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,succeeded:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,failed:`bg-red-500/10 text-red-400 border-red-500/20`,canceled:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,timed_out:`bg-red-500/10 text-red-400 border-red-500/20`},j=new Set([`scheduled`,`dispatching`,`waiting_agent`,`running`]);function M(e){return e.status===`timed_out`&&e.result?.runtimeBudgetElapsed===!0?`budget elapsed`:e.status}function N(e){return e.status===`timed_out`&&e.result?.runtimeBudgetElapsed===!0?`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`:A[e.status]||``}function P(e){return e.status===`timed_out`&&e.result?.runtimeBudgetElapsed===!0?void 0:e.error}function F(e){return j.has(e.status)}function I(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function L(e){return typeof e==`string`&&e.length>0?e:void 0}function R(e){let t=Math.max(0,Math.round(e/1e3)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n?`${n}h ${r}m`:r?`${r}m ${i}s`:`${i}s`}function z(e){return I(e.meta?.runtimeBudgetDeadlineAt)??I(e.result?.deadlineAt)}function B(e,t){if(!e.startedAt)return`-`;let n=e.finishedAt||(F(e)?t:e.updatedAt);return R(Number(n)-Number(e.startedAt))}function V(e,t){let n=z(e);if(!(!n||!F(e)))return R(n-t)}function H(e){return e.status===`timed_out`&&e.result?.runtimeBudgetElapsed===!0?`runtime budget elapsed`:e.error}function U(e,t,n){let r=e.targetAgentId||e.spawnedAgentId||L(e.meta?.runtimeAgentId),i=r?t.find(e=>e.id===r):void 0,a=r?n.flatMap(e=>e.managedAgents.map(t=>({orchestrator:e,managedAgent:t}))).find(({managedAgent:e})=>e.agentId===r):void 0,o=L(e.meta?.terminalSession)||L(e.meta?.tmuxSession)||L(e.meta?.sessionName)||L(i?.meta?.terminalSession)||L(i?.meta?.tmuxSession)||L(i?.meta?.sessionName)||a?.managedAgent.terminalSession||a?.managedAgent.tmuxSession||a?.managedAgent.sessionName,s=L(e.meta?.orchestratorId)||a?.orchestrator.id||e.orchestratorId;return o?{orchestratorId:s,session:o}:void 0}function W(e=``){return{name:``,description:``,enabled:!0,schedule:`0 8 * * *`,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone||`UTC`,orchestratorId:e,targetMode:`existing_agent`,provider:`codex`,model:d(`codex`),effort:``,profile:`default-relay`,label:``,tags:``,capabilities:``,ifNoMatch:`fail`,cwd:``,approvalMode:`guarded`,workspaceMode:`inherit`,keepAlive:!1,budgetMinutes:``,warningMinutes:``,warningMessage:``,concurrencyPolicy:`skip`,title:``,body:``,severity:`info`,dedupeKey:``,externalUrl:``}}function G(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t.length?t:void 0}function K(e){let t=e.targetPolicy;return{...W(e.orchestratorId),id:e.id,name:e.name,description:e.description||``,enabled:e.enabled,schedule:e.schedule,timezone:e.timezone,orchestratorId:e.orchestratorId,targetMode:t.mode,provider:t.mode===`on_demand_agent`?t.provider:t.selector.provider||`codex`,model:t.mode===`on_demand_agent`?t.model||d(t.provider):``,effort:t.mode===`on_demand_agent`&&t.effort||``,profile:t.mode===`on_demand_agent`&&t.profile||`default-relay`,label:t.mode===`existing_agent`&&t.selector.label||``,tags:t.mode===`existing_agent`?(t.selector.tags||[]).join(`, `):``,capabilities:t.mode===`existing_agent`?(t.selector.capabilities||[]).join(`, `):``,ifNoMatch:t.mode===`existing_agent`&&t.ifNoMatch||`fail`,cwd:t.mode===`on_demand_agent`&&t.cwd||``,approvalMode:t.mode===`on_demand_agent`&&t.approvalMode||`guarded`,workspaceMode:t.mode===`on_demand_agent`&&t.workspaceMode||`inherit`,keepAlive:t.mode===`on_demand_agent`?!!t.keepAlive:!1,budgetMinutes:t.mode===`on_demand_agent`&&t.runtimeBudget?String(Math.round(t.runtimeBudget.maxRuntimeMs/6e4)):``,warningMinutes:t.mode===`on_demand_agent`&&t.runtimeBudget?.warnAtMs!==void 0?String(Math.round(t.runtimeBudget.warnAtMs/6e4)):``,warningMessage:t.mode===`on_demand_agent`&&t.runtimeBudget?.warningMessage||``,concurrencyPolicy:e.concurrencyPolicy,title:e.taskTemplate.title,body:e.taskTemplate.body,severity:e.taskTemplate.severity||`info`,dedupeKey:e.taskTemplate.dedupeKey||``,externalUrl:e.taskTemplate.externalUrl||``}}function q(e){let t=Number(e.budgetMinutes),n=Number(e.warningMinutes),r=e.targetMode===`on_demand_agent`&&e.budgetMinutes.trim()&&Number.isFinite(t)?{maxRuntimeMs:Math.round(t*6e4),warnAtMs:e.warningMinutes.trim()&&Number.isFinite(n)?Math.round(n*6e4):void 0,warningMessage:e.warningMessage.trim()||void 0}:void 0,i=e.targetMode===`existing_agent`?{mode:`existing_agent`,selector:{provider:e.provider||void 0,label:e.label.trim()||void 0,tags:G(e.tags),capabilities:G(e.capabilities)},ifNoMatch:e.ifNoMatch}:{mode:`on_demand_agent`,provider:e.provider,model:e.model||void 0,effort:e.effort?e.effort:void 0,profile:e.profile||void 0,cwd:e.cwd.trim()||void 0,approvalMode:e.approvalMode,workspaceMode:e.workspaceMode,keepAlive:e.keepAlive,runtimeBudget:r};return{kind:`scheduled_task`,name:e.name.trim(),description:e.description.trim()||void 0,enabled:e.enabled,schedule:e.schedule.trim(),timezone:e.timezone.trim()||`UTC`,catchUpPolicy:`skip`,concurrencyPolicy:e.concurrencyPolicy,orchestratorId:e.orchestratorId,targetPolicy:i,taskTemplate:{title:e.title.trim(),body:e.body.trim(),severity:e.severity,dedupeKey:e.dedupeKey.trim()||void 0,externalUrl:e.externalUrl.trim()||void 0}}}function J(){let e=f(),t=m(e=>e.automations),r=m(e=>e.automationRuns),i=m(e=>e.orchestrators),o=m(e=>e.agents),s=m(e=>e.apiCall),c=m(e=>e.showError),l=m(e=>e.openConfirm),u=m(e=>e.fetchAutomations),d=m(e=>e.fetchAutomationRuns),p=m(e=>e.fetchTasks),h=m(e=>e.fetchProviderCatalog),g=m(e=>e.agentProfiles),[y,b]=(0,O.useState)(``),[x,S]=(0,O.useState)(()=>W(i[0]?.id||``)),[C,w]=(0,O.useState)(!1),[T,E]=(0,O.useState)(null),D=t.find(e=>e.id===y),A=i.filter(e=>e.status===`online`),j=r.filter(F);(0,O.useEffect)(()=>{Promise.all([u(),d(),h()])},[]),(0,O.useEffect)(()=>{!x.orchestratorId&&i[0]&&S(e=>({...e,orchestratorId:i[0].id}))},[i]);let M=(0,O.useMemo)(()=>{let e=new Map;for(let t of r){let n=e.get(t.automationId)||[];n.push(t),e.set(t.automationId,n)}return e},[r]);function N(){b(``),S(W(i[0]?.id||``))}function P(e){b(e.id),S(K(e))}async function I(){w(!0);try{let e=q(x);if(x.id)await s(`PATCH`,`/automations/`+encodeURIComponent(x.id),e);else{let t=await s(`POST`,`/automations`,e);b(t.id),S(K(t))}await Promise.all([u(),d()])}catch(e){c(`Save Failed`,e.message)}finally{w(!1)}}async function L(e,t){try{await s(`PATCH`,`/automations/`+encodeURIComponent(e.id),t),await u()}catch(e){c(`Update Failed`,e.message)}}async function R(e){try{await s(`POST`,`/automations/`+encodeURIComponent(e.id)+`/run`),await Promise.all([d(),p()])}catch(e){c(`Run Failed`,e.message)}}function z(e){l(`Delete Automation`,`Delete automation "${e.name}"?`,async()=>{try{await s(`DELETE`,`/automations/`+encodeURIComponent(e.id)),y===e.id&&N(),await Promise.all([u(),d()])}catch(e){c(`Delete Failed`,e.message)}})}return(0,k.jsxs)(`div`,{className:`space-y-4`,children:[(0,k.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,k.jsx)(a,{className:`w-5 h-5 text-muted-foreground`}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Automation`}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Scheduled tasks`})]}),(0,k.jsxs)(`div`,{className:`ml-auto flex flex-wrap items-center gap-2`,children:[(0,k.jsxs)(_,{variant:`outline`,className:`text-xs`,children:[t.length,` schedules`]}),(0,k.jsxs)(_,{variant:`outline`,className:`text-xs`,children:[j.length,` running`]}),(0,k.jsxs)(v,{size:`sm`,className:`gap-1`,onClick:N,children:[(0,k.jsx)(n,{className:`w-3.5 h-3.5`}),`New`]})]})]}),j.length>0&&(0,k.jsx)(Y,{runs:j,automations:t,agents:o,orchestrators:i,now:e,logRunId:T,onToggleLogs:e=>E(t=>t===e?null:e)}),(0,k.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,1fr)_420px]`,children:[(0,k.jsx)(`div`,{className:`space-y-3`,children:t.length===0?(0,k.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`No automations`}):t.map(t=>(0,k.jsx)(X,{automation:t,runs:M.get(t.id)||[],now:e,selected:y===t.id,onEdit:()=>P(t),onRun:()=>R(t),onToggle:()=>L(t,{enabled:!t.enabled}),onDelete:()=>z(t)},t.id))}),(0,k.jsx)(Z,{form:x,agentProfiles:g,selected:D,saving:C,orchestrators:A.length?A:i,onChange:e=>S(t=>({...t,...e})),onSave:I})]}),(0,k.jsx)($,{runs:r,automations:t,agents:o,orchestrators:i,now:e,logRunId:T,onToggleLogs:e=>E(t=>t===e?null:e)})]})}function Y({runs:e,automations:t,agents:n,orchestrators:r,now:i,logRunId:a,onToggleLogs:o}){let c=new Map(t.map(e=>[e.id,e.name]));return(0,k.jsxs)(`div`,{className:`rounded-lg border border-border bg-card/40`,children:[(0,k.jsx)(`div`,{className:`border-b border-border px-3 py-2 text-sm font-medium`,children:`Active runs`}),(0,k.jsx)(`div`,{className:`divide-y divide-border`,children:e.map(e=>{let t=U(e,n,r),l=V(e,i);return(0,k.jsxs)(`div`,{className:`space-y-3 px-3 py-3`,children:[(0,k.jsxs)(`div`,{className:`grid gap-3 text-xs md:grid-cols-[minmax(12rem,1fr)_7rem_7rem_7rem_8rem_auto] md:items-center`,children:[(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`div`,{className:`truncate text-sm font-medium`,children:c.get(e.automationId)||e.automationId.slice(0,12)}),(0,k.jsx)(`div`,{className:`truncate font-mono text-muted-foreground`,children:e.targetAgentId||e.spawnedAgentId||L(e.meta?.onDemandLabel)||`-`})]}),(0,k.jsx)(_,{variant:`outline`,className:`border text-[10px] w-fit ${N(e)}`,children:M(e)}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`span`,{className:`text-muted-foreground`,children:`elapsed `}),B(e,i)]}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`span`,{className:`text-muted-foreground`,children:`left `}),l||`-`]}),(0,k.jsx)(`div`,{className:`font-mono text-muted-foreground`,children:e.taskId?`task #${e.taskId}`:`-`}),t&&(0,k.jsxs)(v,{type:`button`,size:`sm`,variant:`outline`,className:`h-7 gap-1 text-xs`,onClick:()=>o(e.id),children:[(0,k.jsx)(s,{className:`w-3 h-3`}),`Logs`]})]}),a===e.id&&t&&(0,k.jsx)(S,{orchestratorId:t.orchestratorId,session:t.session})]},e.id)})})]})}function X({automation:e,runs:t,now:n,selected:i,onEdit:a,onRun:o,onToggle:s,onDelete:l}){let d=t[0],f=e.targetPolicy,p=f.mode===`existing_agent`?[f.selector.provider,f.selector.label?`label:${f.selector.label}`:``,...(f.selector.tags||[]).map(e=>`tag:${e}`),...(f.selector.capabilities||[]).map(e=>`cap:${e}`)].filter(Boolean).join(` `):`${f.provider} on demand`;return(0,k.jsxs)(D,{className:`${i?`ring-1 ring-primary/50`:``} ${e.enabled?``:`opacity-60`}`,children:[(0,k.jsx)(w,{className:`px-4 py-3`,children:(0,k.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,k.jsx)(C,{checked:e.enabled,onCheckedChange:s,className:`mt-0.5`}),(0,k.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,k.jsx)(T,{className:`text-sm truncate`,children:e.name}),(0,k.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1.5 text-xs text-muted-foreground`,children:[(0,k.jsx)(`span`,{className:`font-mono`,children:e.schedule}),(0,k.jsx)(`span`,{children:e.timezone}),(0,k.jsx)(`span`,{children:e.orchestratorId}),(0,k.jsx)(`span`,{className:`truncate max-w-[28rem]`,children:p})]})]}),(0,k.jsxs)(`div`,{className:`flex gap-1`,children:[(0,k.jsx)(v,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Run now`,onClick:o,children:(0,k.jsx)(r,{className:`w-3.5 h-3.5`})}),(0,k.jsx)(v,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Edit`,onClick:a,children:(0,k.jsx)(c,{className:`w-3.5 h-3.5`})}),(0,k.jsx)(v,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-red-400 hover:text-red-300`,title:`Delete`,onClick:l,children:(0,k.jsx)(u,{className:`w-3.5 h-3.5`})})]})]})}),(0,k.jsx)(E,{className:`px-4 pb-3 pt-0`,children:(0,k.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-xs text-muted-foreground`,children:[(0,k.jsxs)(`span`,{title:e.nextRunAt?g(e.nextRunAt):void 0,children:[`next `,e.nextRunAt?h(n,e.nextRunAt):`disabled`]}),d&&(0,k.jsx)(_,{variant:`outline`,className:`border text-[10px] ${N(d)}`,children:M(d)}),d?.taskId&&(0,k.jsxs)(`span`,{children:[`task #`,d.taskId]}),d&&P(d)&&(0,k.jsx)(`span`,{className:`text-red-400 truncate`,children:P(d)})]})})]})}function Z({form:e,selected:n,saving:r,orchestrators:a,agentProfiles:o,onChange:s,onSave:c}){let l=m(e=>e.providerCatalog),u=a.find(t=>t.id===e.orchestratorId)?.providers||[],f=p(e.provider,l),h=f.find(t=>t.alias===e.model)?.efforts||[];function g(t){let n=a.find(e=>e.id===t)?.providers[0]||e.provider;s({orchestratorId:t,provider:n,model:d(n,l),effort:``})}function S(e){s({provider:e,model:d(e,l),effort:``})}return(0,k.jsxs)(`div`,{className:`rounded-lg border border-border bg-card p-4 space-y-4 h-fit xl:sticky xl:top-4`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(`h3`,{className:`text-sm font-semibold`,children:n?`Edit schedule`:`New schedule`}),(0,k.jsx)(_,{variant:e.enabled?`default`:`secondary`,className:`ml-auto text-[10px]`,children:e.enabled?`enabled`:`disabled`})]}),(0,k.jsxs)(`div`,{className:`grid gap-3`,children:[(0,k.jsx)(Q,{label:`Name`,children:(0,k.jsx)(y,{value:e.name,onChange:e=>s({name:e.target.value})})}),(0,k.jsx)(Q,{label:`Description`,children:(0,k.jsx)(y,{value:e.description,onChange:e=>s({description:e.target.value})})}),(0,k.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,k.jsx)(Q,{label:`Cron`,children:(0,k.jsx)(y,{value:e.schedule,onChange:e=>s({schedule:e.target.value}),className:`font-mono`})}),(0,k.jsx)(Q,{label:`Timezone`,children:(0,k.jsx)(y,{value:e.timezone,onChange:e=>s({timezone:e.target.value})})})]}),(0,k.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,k.jsx)(Q,{label:`Orchestrator`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.orchestratorId,onChange:e=>g(e.target.value),children:[(0,k.jsx)(`option`,{value:``,children:`Select`}),a.map(e=>(0,k.jsxs)(`option`,{value:e.id,children:[e.hostname,` (`,e.id,`)`]},e.id))]})}),(0,k.jsx)(Q,{label:`Concurrency`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.concurrencyPolicy,onChange:e=>s({concurrencyPolicy:e.target.value}),children:[(0,k.jsx)(`option`,{value:`skip`,children:`skip`}),(0,k.jsx)(`option`,{value:`replace`,children:`replace`}),(0,k.jsx)(`option`,{value:`queue`,children:`queue`})]})})]}),(0,k.jsxs)(`label`,{className:`flex items-center justify-between rounded-md border border-border px-3 py-2`,children:[(0,k.jsx)(`span`,{className:`text-sm`,children:`Enabled`}),(0,k.jsx)(C,{checked:e.enabled,onCheckedChange:e=>s({enabled:e})})]})]}),(0,k.jsxs)(`div`,{className:`space-y-3`,children:[(0,k.jsx)(b,{children:`Target`}),(0,k.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,k.jsx)(v,{type:`button`,variant:e.targetMode===`existing_agent`?`default`:`outline`,onClick:()=>s({targetMode:`existing_agent`}),children:`Existing`}),(0,k.jsx)(v,{type:`button`,variant:e.targetMode===`on_demand_agent`?`default`:`outline`,onClick:()=>s({targetMode:`on_demand_agent`}),children:`On demand`})]}),(0,k.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,k.jsx)(Q,{label:`Provider`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.provider,onChange:e=>S(e.target.value),disabled:!u.length,children:[!u.length&&(0,k.jsx)(`option`,{value:e.provider,children:`No providers available`}),u.map(e=>(0,k.jsx)(`option`,{value:e,children:e},e))]})}),e.targetMode===`existing_agent`?(0,k.jsx)(Q,{label:`If no match`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.ifNoMatch,onChange:e=>s({ifNoMatch:e.target.value}),children:[(0,k.jsx)(`option`,{value:`fail`,children:`fail`}),(0,k.jsx)(`option`,{value:`spawn`,children:`spawn`})]})}):(0,k.jsx)(Q,{label:`Approval`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.approvalMode,onChange:e=>s({approvalMode:e.target.value}),children:[(0,k.jsx)(`option`,{value:`guarded`,children:`guarded`}),(0,k.jsx)(`option`,{value:`read-only`,children:`read-only`}),(0,k.jsx)(`option`,{value:`open`,children:`open`})]})})]}),e.targetMode===`on_demand_agent`&&(0,k.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,k.jsx)(Q,{label:`Model`,children:(0,k.jsx)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.model,onChange:e=>s({model:e.target.value,effort:``}),children:f.map(e=>(0,k.jsx)(`option`,{value:e.alias,children:e.label},e.alias))})}),(0,k.jsx)(Q,{label:`Effort`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.effort,onChange:e=>s({effort:e.target.value}),disabled:!h.length,children:[(0,k.jsx)(`option`,{value:``,children:`Default`}),h.map(e=>(0,k.jsx)(`option`,{value:e,children:e},e))]})}),(0,k.jsx)(Q,{label:`Agent profile`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.profile||`default-relay`,onChange:e=>s({profile:e.target.value}),children:[!o.length&&(0,k.jsx)(`option`,{value:`default-relay`,children:`default-relay`}),o.map(e=>(0,k.jsx)(`option`,{value:e.name,children:e.name},e.name))]})}),(0,k.jsx)(Q,{label:`Workspace`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.workspaceMode,onChange:e=>s({workspaceMode:e.target.value}),children:[(0,k.jsx)(`option`,{value:`inherit`,children:`inherit (default → isolated worktree)`}),(0,k.jsx)(`option`,{value:`shared`,children:`shared (run in the repo, commit to its branch)`}),(0,k.jsx)(`option`,{value:`isolated`,children:`isolated (fresh git worktree per run)`})]})})]}),e.targetMode===`existing_agent`?(0,k.jsxs)(`div`,{className:`grid gap-3`,children:[(0,k.jsx)(Q,{label:`Label`,children:(0,k.jsx)(y,{value:e.label,onChange:e=>s({label:e.target.value})})}),(0,k.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,k.jsx)(Q,{label:`Tags`,children:(0,k.jsx)(y,{value:e.tags,onChange:e=>s({tags:e.target.value})})}),(0,k.jsx)(Q,{label:`Capabilities`,children:(0,k.jsx)(y,{value:e.capabilities,onChange:e=>s({capabilities:e.target.value})})})]})]}):(0,k.jsxs)(`div`,{className:`grid gap-3`,children:[(0,k.jsx)(Q,{label:`Cwd`,children:(0,k.jsx)(y,{value:e.cwd,onChange:e=>s({cwd:e.target.value})})}),(0,k.jsxs)(`label`,{className:`flex items-center justify-between rounded-md border border-border px-3 py-2`,children:[(0,k.jsx)(`span`,{className:`text-sm`,children:`Keep alive`}),(0,k.jsx)(C,{checked:e.keepAlive,onCheckedChange:e=>s({keepAlive:e})})]}),(0,k.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,k.jsx)(Q,{label:`Budget minutes`,children:(0,k.jsx)(y,{type:`number`,min:1,step:1,value:e.budgetMinutes,onChange:e=>s({budgetMinutes:e.target.value})})}),(0,k.jsx)(Q,{label:`Warning minute`,children:(0,k.jsx)(y,{type:`number`,min:0,step:1,value:e.warningMinutes,onChange:e=>s({warningMinutes:e.target.value})})})]}),(0,k.jsx)(Q,{label:`Warning message`,children:(0,k.jsx)(x,{value:e.warningMessage,onChange:e=>s({warningMessage:e.target.value}),className:`min-h-20`})})]})]}),(0,k.jsxs)(`div`,{className:`space-y-3`,children:[(0,k.jsx)(b,{children:`Task`}),(0,k.jsx)(Q,{label:`Title`,children:(0,k.jsx)(y,{value:e.title,onChange:e=>s({title:e.target.value})})}),(0,k.jsx)(Q,{label:`Body`,children:(0,k.jsx)(x,{value:e.body,onChange:e=>s({body:e.target.value}),className:`min-h-28`})}),(0,k.jsxs)(`div`,{className:`grid grid-cols-3 gap-3`,children:[(0,k.jsx)(Q,{label:`Severity`,children:(0,k.jsxs)(`select`,{className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:e.severity,onChange:e=>s({severity:e.target.value}),children:[(0,k.jsx)(`option`,{value:`info`,children:`info`}),(0,k.jsx)(`option`,{value:`warning`,children:`warning`}),(0,k.jsx)(`option`,{value:`critical`,children:`critical`})]})}),(0,k.jsx)(Q,{label:`Dedupe key`,children:(0,k.jsx)(y,{value:e.dedupeKey,onChange:e=>s({dedupeKey:e.target.value})})}),(0,k.jsx)(Q,{label:`External URL`,children:(0,k.jsx)(y,{value:e.externalUrl,onChange:e=>s({externalUrl:e.target.value})})})]})]}),(0,k.jsxs)(v,{className:`w-full gap-2`,onClick:c,disabled:r||!e.name||!e.schedule||!e.orchestratorId||!e.title||!e.body,children:[r?(0,k.jsx)(i,{className:`w-4 h-4 animate-spin`}):(0,k.jsx)(t,{className:`w-4 h-4`}),`Save`]})]})}function Q({label:e,children:t}){return(0,k.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,k.jsx)(b,{className:`text-xs text-muted-foreground`,children:e}),t]})}function $({runs:e,automations:t,agents:n,orchestrators:r,now:i,logRunId:a,onToggleLogs:o}){let c=new Map(t.map(e=>[e.id,e.name]));return(0,k.jsxs)(`div`,{className:`space-y-2`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(`h3`,{className:`text-sm font-semibold`,children:`Runs`}),(0,k.jsx)(_,{variant:`secondary`,className:`text-[10px]`,children:e.length})]}),(0,k.jsxs)(`div`,{className:`rounded-lg border border-border overflow-x-auto`,children:[(0,k.jsxs)(`div`,{className:`grid grid-cols-[minmax(10rem,1fr)_8rem_8rem_7rem_7rem_5rem] gap-3 bg-muted/30 px-3 py-2 text-xs text-muted-foreground`,children:[(0,k.jsx)(`span`,{children:`Automation`}),(0,k.jsx)(`span`,{children:`Status`}),(0,k.jsx)(`span`,{children:`Agent`}),(0,k.jsx)(`span`,{children:`Runtime`}),(0,k.jsx)(`span`,{children:`Updated`}),(0,k.jsx)(`span`,{children:`Logs`})]}),e.length===0?(0,k.jsx)(`div`,{className:`px-3 py-10 text-center text-sm text-muted-foreground`,children:`No runs`}):e.slice(0,80).map(e=>{let t=U(e,n,r),l=V(e,i),u=H(e);return(0,k.jsxs)(`div`,{className:`border-t border-border`,children:[(0,k.jsxs)(`div`,{className:`grid grid-cols-[minmax(10rem,1fr)_8rem_8rem_7rem_7rem_5rem] gap-3 px-3 py-2 text-xs items-center`,children:[(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`div`,{className:`truncate`,children:c.get(e.automationId)||e.automationId.slice(0,12)}),(0,k.jsxs)(`div`,{className:`truncate text-muted-foreground`,children:[e.taskId?`task #${e.taskId}`:`no task`,l?` · ${l} left`:``,u?` · ${u}`:``]})]}),(0,k.jsx)(_,{variant:`outline`,className:`border text-[10px] w-fit ${N(e)}`,children:M(e)}),(0,k.jsx)(`span`,{className:`truncate font-mono text-muted-foreground`,children:e.targetAgentId||e.spawnedAgentId||`-`}),(0,k.jsx)(`span`,{className:`text-muted-foreground`,children:B(e,i)}),(0,k.jsx)(`span`,{className:`text-muted-foreground`,title:g(e.updatedAt),children:h(i,e.updatedAt)}),t?(0,k.jsx)(v,{type:`button`,size:`sm`,variant:`ghost`,className:`h-7 w-7 p-0`,title:`Open logs`,onClick:()=>o(e.id),children:(0,k.jsx)(s,{className:`w-3.5 h-3.5`})}):(0,k.jsx)(`span`,{className:`text-muted-foreground`,children:`-`})]}),a===e.id&&t&&(0,k.jsx)(`div`,{className:`border-t border-border px-3 py-3`,children:(0,k.jsx)(S,{orchestratorId:t.orchestratorId,session:t.session})})]},e.id)})]})]})}export{J as AutomationView};
|
|
2
|
-
//# sourceMappingURL=automation-CE1i1zpw.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"automation-CE1i1zpw.js","names":[],"sources":["../../dashboard/src/components/views/automation.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { useRelayStore, useNow } from '@/store'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { Switch } from '@/components/ui/switch'\nimport { Textarea } from '@/components/ui/textarea'\nimport { fmtTime, timeAgo } from '@/lib/display'\nimport { LogViewer } from '@/components/shared/log-viewer'\nimport { availableModelsFor, defaultModelFor } from '@/store/helpers'\nimport { CalendarClock, FileText, Pencil, Play, Plus, RotateCw, Save, Trash2 } from 'lucide-react'\nimport type {\n Agent,\n Automation,\n AutomationConcurrencyPolicy,\n AutomationRun,\n AutomationTargetPolicy,\n CreateAutomationInput,\n Orchestrator,\n SpawnApprovalMode,\n SpawnEffort,\n SpawnProvider,\n TaskSeverity,\n WorkspaceMode,\n} from '@/types'\n\nconst RUN_STATUS_COLORS: Record<string, string> = {\n scheduled: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n dispatching: 'bg-sky-500/10 text-sky-400 border-sky-500/20',\n waiting_agent: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n running: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n succeeded: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n failed: 'bg-red-500/10 text-red-400 border-red-500/20',\n canceled: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n timed_out: 'bg-red-500/10 text-red-400 border-red-500/20',\n}\n\nconst ACTIVE_RUN_STATUSES = new Set(['scheduled', 'dispatching', 'waiting_agent', 'running'])\n\nfunction runStatusLabel(run: AutomationRun): string {\n return run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true ? 'budget elapsed' : run.status\n}\n\nfunction runStatusClass(run: AutomationRun): string {\n if (run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true) return 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20'\n return RUN_STATUS_COLORS[run.status] || ''\n}\n\nfunction runErrorText(run: AutomationRun): string | undefined {\n return run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true ? undefined : run.error\n}\n\nfunction isActiveRun(run: AutomationRun): boolean {\n return ACTIVE_RUN_STATUSES.has(run.status)\n}\n\nfunction num(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction duration(ms: number): string {\n const total = Math.max(0, Math.round(ms / 1000))\n const hours = Math.floor(total / 3600)\n const minutes = Math.floor((total % 3600) / 60)\n const seconds = total % 60\n if (hours) return `${hours}h ${minutes}m`\n if (minutes) return `${minutes}m ${seconds}s`\n return `${seconds}s`\n}\n\nfunction runDeadline(run: AutomationRun): number | undefined {\n return num(run.meta?.runtimeBudgetDeadlineAt) ?? num(run.result?.deadlineAt)\n}\n\nfunction elapsedText(run: AutomationRun, now: number): string {\n if (!run.startedAt) return '-'\n const end = run.finishedAt || (isActiveRun(run) ? now : run.updatedAt)\n return duration(Number(end) - Number(run.startedAt))\n}\n\nfunction remainingText(run: AutomationRun, now: number): string | undefined {\n const deadline = runDeadline(run)\n if (!deadline || !isActiveRun(run)) return undefined\n return duration(deadline - now)\n}\n\nfunction shutdownText(run: AutomationRun): string | undefined {\n if (run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true) return 'runtime budget elapsed'\n return run.error\n}\n\nfunction runLogTarget(run: AutomationRun, agents: Agent[], orchestrators: Orchestrator[]): { orchestratorId: string; session: string } | undefined {\n const agentId = run.targetAgentId || run.spawnedAgentId || str(run.meta?.runtimeAgentId)\n const agent = agentId ? agents.find((candidate) => candidate.id === agentId) : undefined\n const managed = agentId\n ? orchestrators.flatMap((orchestrator) => orchestrator.managedAgents.map((managedAgent) => ({ orchestrator, managedAgent })))\n .find(({ managedAgent }) => managedAgent.agentId === agentId)\n : undefined\n const session = str(run.meta?.terminalSession)\n || str(run.meta?.tmuxSession)\n || str(run.meta?.sessionName)\n || str(agent?.meta?.terminalSession)\n || str(agent?.meta?.tmuxSession)\n || str(agent?.meta?.sessionName)\n || managed?.managedAgent.terminalSession\n || managed?.managedAgent.tmuxSession\n || managed?.managedAgent.sessionName\n const orchestratorId = str(run.meta?.orchestratorId) || managed?.orchestrator.id || run.orchestratorId\n return session ? { orchestratorId, session } : undefined\n}\n\ntype TargetMode = 'existing_agent' | 'on_demand_agent'\n\ninterface AutomationForm {\n id?: string\n name: string\n description: string\n enabled: boolean\n schedule: string\n timezone: string\n orchestratorId: string\n targetMode: TargetMode\n provider: SpawnProvider\n model: string\n effort: string\n profile: string\n label: string\n tags: string\n capabilities: string\n ifNoMatch: 'fail' | 'spawn'\n cwd: string\n approvalMode: SpawnApprovalMode\n workspaceMode: WorkspaceMode\n keepAlive: boolean\n budgetMinutes: string\n warningMinutes: string\n warningMessage: string\n concurrencyPolicy: AutomationConcurrencyPolicy\n title: string\n body: string\n severity: TaskSeverity\n dedupeKey: string\n externalUrl: string\n}\n\nfunction blankForm(orchestratorId = ''): AutomationForm {\n return {\n name: '',\n description: '',\n enabled: true,\n schedule: '0 8 * * *',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC',\n orchestratorId,\n targetMode: 'existing_agent',\n provider: 'codex',\n model: defaultModelFor('codex'),\n effort: '',\n profile: 'default-relay',\n label: '',\n tags: '',\n capabilities: '',\n ifNoMatch: 'fail',\n cwd: '',\n approvalMode: 'guarded',\n workspaceMode: 'inherit',\n keepAlive: false,\n budgetMinutes: '',\n warningMinutes: '',\n warningMessage: '',\n concurrencyPolicy: 'skip',\n title: '',\n body: '',\n severity: 'info',\n dedupeKey: '',\n externalUrl: '',\n }\n}\n\nfunction splitCsv(value: string): string[] | undefined {\n const items = value.split(',').map((item) => item.trim()).filter(Boolean)\n return items.length ? items : undefined\n}\n\nfunction automationToForm(automation: Automation): AutomationForm {\n const policy = automation.targetPolicy\n return {\n ...blankForm(automation.orchestratorId),\n id: automation.id,\n name: automation.name,\n description: automation.description || '',\n enabled: automation.enabled,\n schedule: automation.schedule,\n timezone: automation.timezone,\n orchestratorId: automation.orchestratorId,\n targetMode: policy.mode,\n provider: policy.mode === 'on_demand_agent' ? policy.provider : policy.selector.provider || 'codex',\n model: policy.mode === 'on_demand_agent' ? policy.model || defaultModelFor(policy.provider) : '',\n effort: policy.mode === 'on_demand_agent' ? policy.effort || '' : '',\n profile: policy.mode === 'on_demand_agent' ? policy.profile || 'default-relay' : 'default-relay',\n label: policy.mode === 'existing_agent' ? policy.selector.label || '' : '',\n tags: policy.mode === 'existing_agent' ? (policy.selector.tags || []).join(', ') : '',\n capabilities: policy.mode === 'existing_agent' ? (policy.selector.capabilities || []).join(', ') : '',\n ifNoMatch: policy.mode === 'existing_agent' ? policy.ifNoMatch || 'fail' : 'fail',\n cwd: policy.mode === 'on_demand_agent' ? policy.cwd || '' : '',\n approvalMode: policy.mode === 'on_demand_agent' ? policy.approvalMode || 'guarded' : 'guarded',\n workspaceMode: policy.mode === 'on_demand_agent' ? policy.workspaceMode || 'inherit' : 'inherit',\n keepAlive: policy.mode === 'on_demand_agent' ? Boolean(policy.keepAlive) : false,\n budgetMinutes: policy.mode === 'on_demand_agent' && policy.runtimeBudget ? String(Math.round(policy.runtimeBudget.maxRuntimeMs / 60_000)) : '',\n warningMinutes: policy.mode === 'on_demand_agent' && policy.runtimeBudget?.warnAtMs !== undefined ? String(Math.round(policy.runtimeBudget.warnAtMs / 60_000)) : '',\n warningMessage: policy.mode === 'on_demand_agent' ? policy.runtimeBudget?.warningMessage || '' : '',\n concurrencyPolicy: automation.concurrencyPolicy,\n title: automation.taskTemplate.title,\n body: automation.taskTemplate.body,\n severity: automation.taskTemplate.severity || 'info',\n dedupeKey: automation.taskTemplate.dedupeKey || '',\n externalUrl: automation.taskTemplate.externalUrl || '',\n }\n}\n\nfunction formToInput(form: AutomationForm): CreateAutomationInput {\n const budgetMinutes = Number(form.budgetMinutes)\n const warningMinutes = Number(form.warningMinutes)\n const runtimeBudget = form.targetMode === 'on_demand_agent' && form.budgetMinutes.trim() && Number.isFinite(budgetMinutes)\n ? {\n maxRuntimeMs: Math.round(budgetMinutes * 60_000),\n warnAtMs: form.warningMinutes.trim() && Number.isFinite(warningMinutes) ? Math.round(warningMinutes * 60_000) : undefined,\n warningMessage: form.warningMessage.trim() || undefined,\n }\n : undefined\n const targetPolicy: AutomationTargetPolicy = form.targetMode === 'existing_agent'\n ? {\n mode: 'existing_agent',\n selector: {\n provider: form.provider || undefined,\n label: form.label.trim() || undefined,\n tags: splitCsv(form.tags),\n capabilities: splitCsv(form.capabilities),\n },\n ifNoMatch: form.ifNoMatch,\n }\n : {\n mode: 'on_demand_agent',\n provider: form.provider,\n model: form.model || undefined,\n effort: form.effort ? form.effort as SpawnEffort : undefined,\n profile: form.profile || undefined,\n cwd: form.cwd.trim() || undefined,\n approvalMode: form.approvalMode,\n workspaceMode: form.workspaceMode,\n keepAlive: form.keepAlive,\n runtimeBudget,\n }\n\n return {\n kind: 'scheduled_task',\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n enabled: form.enabled,\n schedule: form.schedule.trim(),\n timezone: form.timezone.trim() || 'UTC',\n catchUpPolicy: 'skip',\n concurrencyPolicy: form.concurrencyPolicy,\n orchestratorId: form.orchestratorId,\n targetPolicy,\n taskTemplate: {\n title: form.title.trim(),\n body: form.body.trim(),\n severity: form.severity,\n dedupeKey: form.dedupeKey.trim() || undefined,\n externalUrl: form.externalUrl.trim() || undefined,\n },\n }\n}\n\nexport function AutomationView() {\n const now = useNow()\n const automations = useRelayStore((s) => s.automations)\n const automationRuns = useRelayStore((s) => s.automationRuns)\n const orchestrators = useRelayStore((s) => s.orchestrators)\n const agents = useRelayStore((s) => s.agents)\n const apiCall = useRelayStore((s) => s.apiCall)\n const showError = useRelayStore((s) => s.showError)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const fetchAutomations = useRelayStore((s) => s.fetchAutomations)\n const fetchAutomationRuns = useRelayStore((s) => s.fetchAutomationRuns)\n const fetchTasks = useRelayStore((s) => s.fetchTasks)\n const fetchProviderCatalog = useRelayStore((s) => s.fetchProviderCatalog)\n const agentProfiles = useRelayStore((s) => s.agentProfiles)\n const [selectedId, setSelectedId] = useState<string>('')\n const [form, setForm] = useState<AutomationForm>(() => blankForm(orchestrators[0]?.id || ''))\n const [saving, setSaving] = useState(false)\n const [logRunId, setLogRunId] = useState<string | null>(null)\n\n const selected = automations.find((automation) => automation.id === selectedId)\n const onlineOrchestrators = orchestrators.filter((orchestrator) => orchestrator.status === 'online')\n const activeRuns = automationRuns.filter(isActiveRun)\n\n useEffect(() => {\n void Promise.all([fetchAutomations(), fetchAutomationRuns(), fetchProviderCatalog()])\n }, [])\n\n useEffect(() => {\n if (!form.orchestratorId && orchestrators[0]) {\n setForm((current) => ({ ...current, orchestratorId: orchestrators[0]!.id }))\n }\n }, [orchestrators])\n\n const runsByAutomation = useMemo(() => {\n const grouped = new Map<string, AutomationRun[]>()\n for (const run of automationRuns) {\n const list = grouped.get(run.automationId) || []\n list.push(run)\n grouped.set(run.automationId, list)\n }\n return grouped\n }, [automationRuns])\n\n function newAutomation() {\n setSelectedId('')\n setForm(blankForm(orchestrators[0]?.id || ''))\n }\n\n function editAutomation(automation: Automation) {\n setSelectedId(automation.id)\n setForm(automationToForm(automation))\n }\n\n async function saveAutomation() {\n setSaving(true)\n try {\n const input = formToInput(form)\n if (form.id) await apiCall('PATCH', '/automations/' + encodeURIComponent(form.id), input)\n else {\n const created = await apiCall<Automation>('POST', '/automations', input)\n setSelectedId(created.id)\n setForm(automationToForm(created))\n }\n await Promise.all([fetchAutomations(), fetchAutomationRuns()])\n } catch (e) {\n showError('Save Failed', (e as Error).message)\n } finally {\n setSaving(false)\n }\n }\n\n async function patchAutomation(automation: Automation, partial: Partial<Automation>) {\n try {\n await apiCall('PATCH', '/automations/' + encodeURIComponent(automation.id), partial)\n await fetchAutomations()\n } catch (e) {\n showError('Update Failed', (e as Error).message)\n }\n }\n\n async function runNow(automation: Automation) {\n try {\n await apiCall('POST', '/automations/' + encodeURIComponent(automation.id) + '/run')\n await Promise.all([fetchAutomationRuns(), fetchTasks()])\n } catch (e) {\n showError('Run Failed', (e as Error).message)\n }\n }\n\n function deleteAutomation(automation: Automation) {\n openConfirm('Delete Automation', `Delete automation \"${automation.name}\"?`, async () => {\n try {\n await apiCall('DELETE', '/automations/' + encodeURIComponent(automation.id))\n if (selectedId === automation.id) newAutomation()\n await Promise.all([fetchAutomations(), fetchAutomationRuns()])\n } catch (e) {\n showError('Delete Failed', (e as Error).message)\n }\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <CalendarClock className=\"w-5 h-5 text-muted-foreground\" />\n <div>\n <h2 className=\"text-lg font-semibold\">Automation</h2>\n <p className=\"text-xs text-muted-foreground\">Scheduled tasks</p>\n </div>\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs\">{automations.length} schedules</Badge>\n <Badge variant=\"outline\" className=\"text-xs\">{activeRuns.length} running</Badge>\n <Button size=\"sm\" className=\"gap-1\" onClick={newAutomation}>\n <Plus className=\"w-3.5 h-3.5\" />\n New\n </Button>\n </div>\n </div>\n\n {activeRuns.length > 0 && (\n <ActiveRuns\n runs={activeRuns}\n automations={automations}\n agents={agents}\n orchestrators={orchestrators}\n now={now}\n logRunId={logRunId}\n onToggleLogs={(runId) => setLogRunId((current) => current === runId ? null : runId)}\n />\n )}\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1fr)_420px]\">\n <div className=\"space-y-3\">\n {automations.length === 0 ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">No automations</div>\n ) : automations.map((automation) => (\n <AutomationCard\n key={automation.id}\n automation={automation}\n runs={runsByAutomation.get(automation.id) || []}\n now={now}\n selected={selectedId === automation.id}\n onEdit={() => editAutomation(automation)}\n onRun={() => runNow(automation)}\n onToggle={() => patchAutomation(automation, { enabled: !automation.enabled })}\n onDelete={() => deleteAutomation(automation)}\n />\n ))}\n </div>\n\n <AutomationEditor\n form={form}\n agentProfiles={agentProfiles}\n selected={selected}\n saving={saving}\n orchestrators={onlineOrchestrators.length ? onlineOrchestrators : orchestrators}\n onChange={(patch) => setForm((current) => ({ ...current, ...patch }))}\n onSave={saveAutomation}\n />\n </div>\n\n <RunHistory\n runs={automationRuns}\n automations={automations}\n agents={agents}\n orchestrators={orchestrators}\n now={now}\n logRunId={logRunId}\n onToggleLogs={(runId) => setLogRunId((current) => current === runId ? null : runId)}\n />\n </div>\n )\n}\n\nfunction ActiveRuns({\n runs,\n automations,\n agents,\n orchestrators,\n now,\n logRunId,\n onToggleLogs,\n}: {\n runs: AutomationRun[]\n automations: Automation[]\n agents: Agent[]\n orchestrators: Orchestrator[]\n now: number\n logRunId: string | null\n onToggleLogs: (runId: string) => void\n}) {\n const names = new Map(automations.map((automation) => [automation.id, automation.name]))\n return (\n <div className=\"rounded-lg border border-border bg-card/40\">\n <div className=\"border-b border-border px-3 py-2 text-sm font-medium\">Active runs</div>\n <div className=\"divide-y divide-border\">\n {runs.map((run) => {\n const logTarget = runLogTarget(run, agents, orchestrators)\n const remaining = remainingText(run, now)\n return (\n <div key={run.id} className=\"space-y-3 px-3 py-3\">\n <div className=\"grid gap-3 text-xs md:grid-cols-[minmax(12rem,1fr)_7rem_7rem_7rem_8rem_auto] md:items-center\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{names.get(run.automationId) || run.automationId.slice(0, 12)}</div>\n <div className=\"truncate font-mono text-muted-foreground\">{run.targetAgentId || run.spawnedAgentId || str(run.meta?.onDemandLabel) || '-'}</div>\n </div>\n <Badge variant=\"outline\" className={`border text-[10px] w-fit ${runStatusClass(run)}`}>{runStatusLabel(run)}</Badge>\n <div><span className=\"text-muted-foreground\">elapsed </span>{elapsedText(run, now)}</div>\n <div><span className=\"text-muted-foreground\">left </span>{remaining || '-'}</div>\n <div className=\"font-mono text-muted-foreground\">{run.taskId ? `task #${run.taskId}` : '-'}</div>\n {logTarget && (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"h-7 gap-1 text-xs\" onClick={() => onToggleLogs(run.id)}>\n <FileText className=\"w-3 h-3\" />\n Logs\n </Button>\n )}\n </div>\n {logRunId === run.id && logTarget && <LogViewer orchestratorId={logTarget.orchestratorId} session={logTarget.session} />}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nfunction AutomationCard({\n automation,\n runs,\n now,\n selected,\n onEdit,\n onRun,\n onToggle,\n onDelete,\n}: {\n automation: Automation\n runs: AutomationRun[]\n now: number\n selected: boolean\n onEdit: () => void\n onRun: () => void\n onToggle: () => void\n onDelete: () => void\n}) {\n const latestRun = runs[0]\n const policy = automation.targetPolicy\n const target = policy.mode === 'existing_agent'\n ? [\n policy.selector.provider,\n policy.selector.label ? `label:${policy.selector.label}` : '',\n ...(policy.selector.tags || []).map((tag) => `tag:${tag}`),\n ...(policy.selector.capabilities || []).map((cap) => `cap:${cap}`),\n ].filter(Boolean).join(' ')\n : `${policy.provider} on demand`\n\n return (\n <Card className={`${selected ? 'ring-1 ring-primary/50' : ''} ${automation.enabled ? '' : 'opacity-60'}`}>\n <CardHeader className=\"px-4 py-3\">\n <div className=\"flex items-start gap-3\">\n <Switch checked={automation.enabled} onCheckedChange={onToggle} className=\"mt-0.5\" />\n <div className=\"min-w-0 flex-1\">\n <CardTitle className=\"text-sm truncate\">{automation.name}</CardTitle>\n <div className=\"mt-1 flex flex-wrap gap-1.5 text-xs text-muted-foreground\">\n <span className=\"font-mono\">{automation.schedule}</span>\n <span>{automation.timezone}</span>\n <span>{automation.orchestratorId}</span>\n <span className=\"truncate max-w-[28rem]\">{target}</span>\n </div>\n </div>\n <div className=\"flex gap-1\">\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Run now\" onClick={onRun}>\n <Play className=\"w-3.5 h-3.5\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Edit\" onClick={onEdit}>\n <Pencil className=\"w-3.5 h-3.5\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Delete\" onClick={onDelete}>\n <Trash2 className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"px-4 pb-3 pt-0\">\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <span title={automation.nextRunAt ? fmtTime(automation.nextRunAt) : undefined}>\n next {automation.nextRunAt ? timeAgo(now, automation.nextRunAt) : 'disabled'}\n </span>\n {latestRun && (\n <Badge variant=\"outline\" className={`border text-[10px] ${runStatusClass(latestRun)}`}>\n {runStatusLabel(latestRun)}\n </Badge>\n )}\n {latestRun?.taskId && <span>task #{latestRun.taskId}</span>}\n {latestRun && runErrorText(latestRun) && <span className=\"text-red-400 truncate\">{runErrorText(latestRun)}</span>}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nfunction AutomationEditor({\n form,\n selected,\n saving,\n orchestrators,\n agentProfiles,\n onChange,\n onSave,\n}: {\n form: AutomationForm\n selected?: Automation\n saving: boolean\n orchestrators: Array<{ id: string; hostname: string; providers: SpawnProvider[] }>\n agentProfiles: Array<{ name: string }>\n onChange: (patch: Partial<AutomationForm>) => void\n onSave: () => void\n}) {\n const providerCatalog = useRelayStore((s) => s.providerCatalog)\n const selectedOrchestrator = orchestrators.find((orch) => orch.id === form.orchestratorId)\n const providers = selectedOrchestrator?.providers || []\n const models = availableModelsFor(form.provider, providerCatalog)\n const selectedModel = models.find((model) => model.alias === form.model)\n const efforts = selectedModel?.efforts || []\n\n function selectOrchestrator(orchestratorId: string) {\n const orchestrator = orchestrators.find((orch) => orch.id === orchestratorId)\n const provider = orchestrator?.providers[0] || form.provider\n onChange({ orchestratorId, provider, model: defaultModelFor(provider, providerCatalog), effort: '' })\n }\n\n function selectProvider(provider: SpawnProvider) {\n onChange({ provider, model: defaultModelFor(provider, providerCatalog), effort: '' })\n }\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-4 space-y-4 h-fit xl:sticky xl:top-4\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{selected ? 'Edit schedule' : 'New schedule'}</h3>\n <Badge variant={form.enabled ? 'default' : 'secondary'} className=\"ml-auto text-[10px]\">\n {form.enabled ? 'enabled' : 'disabled'}\n </Badge>\n </div>\n\n <div className=\"grid gap-3\">\n <Field label=\"Name\">\n <Input value={form.name} onChange={(e) => onChange({ name: e.target.value })} />\n </Field>\n <Field label=\"Description\">\n <Input value={form.description} onChange={(e) => onChange({ description: e.target.value })} />\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Cron\">\n <Input value={form.schedule} onChange={(e) => onChange({ schedule: e.target.value })} className=\"font-mono\" />\n </Field>\n <Field label=\"Timezone\">\n <Input value={form.timezone} onChange={(e) => onChange({ timezone: e.target.value })} />\n </Field>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Orchestrator\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.orchestratorId} onChange={(e) => selectOrchestrator(e.target.value)}>\n <option value=\"\">Select</option>\n {orchestrators.map((orch) => <option key={orch.id} value={orch.id}>{orch.hostname} ({orch.id})</option>)}\n </select>\n </Field>\n <Field label=\"Concurrency\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.concurrencyPolicy} onChange={(e) => onChange({ concurrencyPolicy: e.target.value as AutomationConcurrencyPolicy })}>\n <option value=\"skip\">skip</option>\n <option value=\"replace\">replace</option>\n <option value=\"queue\">queue</option>\n </select>\n </Field>\n </div>\n <label className=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <span className=\"text-sm\">Enabled</span>\n <Switch checked={form.enabled} onCheckedChange={(enabled) => onChange({ enabled })} />\n </label>\n </div>\n\n <div className=\"space-y-3\">\n <Label>Target</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n <Button type=\"button\" variant={form.targetMode === 'existing_agent' ? 'default' : 'outline'} onClick={() => onChange({ targetMode: 'existing_agent' })}>\n Existing\n </Button>\n <Button type=\"button\" variant={form.targetMode === 'on_demand_agent' ? 'default' : 'outline'} onClick={() => onChange({ targetMode: 'on_demand_agent' })}>\n On demand\n </Button>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Provider\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.provider} onChange={(e) => selectProvider(e.target.value as SpawnProvider)} disabled={!providers.length}>\n {!providers.length && <option value={form.provider}>No providers available</option>}\n {providers.map((provider) => <option key={provider} value={provider}>{provider}</option>)}\n </select>\n </Field>\n {form.targetMode === 'existing_agent' ? (\n <Field label=\"If no match\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.ifNoMatch} onChange={(e) => onChange({ ifNoMatch: e.target.value as 'fail' | 'spawn' })}>\n <option value=\"fail\">fail</option>\n <option value=\"spawn\">spawn</option>\n </select>\n </Field>\n ) : (\n <Field label=\"Approval\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.approvalMode} onChange={(e) => onChange({ approvalMode: e.target.value as SpawnApprovalMode })}>\n <option value=\"guarded\">guarded</option>\n <option value=\"read-only\">read-only</option>\n <option value=\"open\">open</option>\n </select>\n </Field>\n )}\n </div>\n\n {form.targetMode === 'on_demand_agent' && (\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Model\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.model} onChange={(e) => onChange({ model: e.target.value, effort: '' })}>\n {models.map((model) => <option key={model.alias} value={model.alias}>{model.label}</option>)}\n </select>\n </Field>\n <Field label=\"Effort\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.effort} onChange={(e) => onChange({ effort: e.target.value })} disabled={!efforts.length}>\n <option value=\"\">Default</option>\n {efforts.map((level) => <option key={level} value={level}>{level}</option>)}\n </select>\n </Field>\n <Field label=\"Agent profile\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.profile || 'default-relay'} onChange={(e) => onChange({ profile: e.target.value })}>\n {!agentProfiles.length && <option value=\"default-relay\">default-relay</option>}\n {agentProfiles.map((profile) => <option key={profile.name} value={profile.name}>{profile.name}</option>)}\n </select>\n </Field>\n <Field label=\"Workspace\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.workspaceMode} onChange={(e) => onChange({ workspaceMode: e.target.value as WorkspaceMode })}>\n <option value=\"inherit\">inherit (default → isolated worktree)</option>\n <option value=\"shared\">shared (run in the repo, commit to its branch)</option>\n <option value=\"isolated\">isolated (fresh git worktree per run)</option>\n </select>\n </Field>\n </div>\n )}\n\n {form.targetMode === 'existing_agent' ? (\n <div className=\"grid gap-3\">\n <Field label=\"Label\">\n <Input value={form.label} onChange={(e) => onChange({ label: e.target.value })} />\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Tags\">\n <Input value={form.tags} onChange={(e) => onChange({ tags: e.target.value })} />\n </Field>\n <Field label=\"Capabilities\">\n <Input value={form.capabilities} onChange={(e) => onChange({ capabilities: e.target.value })} />\n </Field>\n </div>\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <Field label=\"Cwd\">\n <Input value={form.cwd} onChange={(e) => onChange({ cwd: e.target.value })} />\n </Field>\n <label className=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <span className=\"text-sm\">Keep alive</span>\n <Switch checked={form.keepAlive} onCheckedChange={(keepAlive) => onChange({ keepAlive })} />\n </label>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Budget minutes\">\n <Input type=\"number\" min={1} step={1} value={form.budgetMinutes} onChange={(e) => onChange({ budgetMinutes: e.target.value })} />\n </Field>\n <Field label=\"Warning minute\">\n <Input type=\"number\" min={0} step={1} value={form.warningMinutes} onChange={(e) => onChange({ warningMinutes: e.target.value })} />\n </Field>\n </div>\n <Field label=\"Warning message\">\n <Textarea value={form.warningMessage} onChange={(e) => onChange({ warningMessage: e.target.value })} className=\"min-h-20\" />\n </Field>\n </div>\n )}\n </div>\n\n <div className=\"space-y-3\">\n <Label>Task</Label>\n <Field label=\"Title\">\n <Input value={form.title} onChange={(e) => onChange({ title: e.target.value })} />\n </Field>\n <Field label=\"Body\">\n <Textarea value={form.body} onChange={(e) => onChange({ body: e.target.value })} className=\"min-h-28\" />\n </Field>\n <div className=\"grid grid-cols-3 gap-3\">\n <Field label=\"Severity\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.severity} onChange={(e) => onChange({ severity: e.target.value as TaskSeverity })}>\n <option value=\"info\">info</option>\n <option value=\"warning\">warning</option>\n <option value=\"critical\">critical</option>\n </select>\n </Field>\n <Field label=\"Dedupe key\">\n <Input value={form.dedupeKey} onChange={(e) => onChange({ dedupeKey: e.target.value })} />\n </Field>\n <Field label=\"External URL\">\n <Input value={form.externalUrl} onChange={(e) => onChange({ externalUrl: e.target.value })} />\n </Field>\n </div>\n </div>\n\n <Button className=\"w-full gap-2\" onClick={onSave} disabled={saving || !form.name || !form.schedule || !form.orchestratorId || !form.title || !form.body}>\n {saving ? <RotateCw className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\n Save\n </Button>\n </div>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground\">{label}</Label>\n {children}\n </div>\n )\n}\n\nfunction RunHistory({\n runs,\n automations,\n agents,\n orchestrators,\n now,\n logRunId,\n onToggleLogs,\n}: {\n runs: AutomationRun[]\n automations: Automation[]\n agents: Agent[]\n orchestrators: Orchestrator[]\n now: number\n logRunId: string | null\n onToggleLogs: (runId: string) => void\n}) {\n const names = new Map(automations.map((automation) => [automation.id, automation.name]))\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">Runs</h3>\n <Badge variant=\"secondary\" className=\"text-[10px]\">{runs.length}</Badge>\n </div>\n <div className=\"rounded-lg border border-border overflow-x-auto\">\n <div className=\"grid grid-cols-[minmax(10rem,1fr)_8rem_8rem_7rem_7rem_5rem] gap-3 bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <span>Automation</span>\n <span>Status</span>\n <span>Agent</span>\n <span>Runtime</span>\n <span>Updated</span>\n <span>Logs</span>\n </div>\n {runs.length === 0 ? (\n <div className=\"px-3 py-10 text-center text-sm text-muted-foreground\">No runs</div>\n ) : runs.slice(0, 80).map((run) => {\n const logTarget = runLogTarget(run, agents, orchestrators)\n const remaining = remainingText(run, now)\n const shutdown = shutdownText(run)\n return (\n <div key={run.id} className=\"border-t border-border\">\n <div className=\"grid grid-cols-[minmax(10rem,1fr)_8rem_8rem_7rem_7rem_5rem] gap-3 px-3 py-2 text-xs items-center\">\n <div className=\"min-w-0\">\n <div className=\"truncate\">{names.get(run.automationId) || run.automationId.slice(0, 12)}</div>\n <div className=\"truncate text-muted-foreground\">\n {run.taskId ? `task #${run.taskId}` : 'no task'}\n {remaining ? ` · ${remaining} left` : ''}\n {shutdown ? ` · ${shutdown}` : ''}\n </div>\n </div>\n <Badge variant=\"outline\" className={`border text-[10px] w-fit ${runStatusClass(run)}`}>{runStatusLabel(run)}</Badge>\n <span className=\"truncate font-mono text-muted-foreground\">{run.targetAgentId || run.spawnedAgentId || '-'}</span>\n <span className=\"text-muted-foreground\">{elapsedText(run, now)}</span>\n <span className=\"text-muted-foreground\" title={fmtTime(run.updatedAt)}>{timeAgo(now, run.updatedAt)}</span>\n {logTarget ? (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-7 w-7 p-0\" title=\"Open logs\" onClick={() => onToggleLogs(run.id)}>\n <FileText className=\"w-3.5 h-3.5\" />\n </Button>\n ) : <span className=\"text-muted-foreground\">-</span>}\n </div>\n {logRunId === run.id && logTarget && (\n <div className=\"border-t border-border px-3 py-3\">\n <LogViewer orchestratorId={logTarget.orchestratorId} session={logTarget.session} />\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
|