774 lines
64 KiB
JavaScript
774 lines
64 KiB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{$t as t,Qt as n,Yt as r,er as i,nn as a,rn as o}from"./control-ui-foundation-CeFMP1Ly.js";import{Da as s,Js as c,Oa as l,U as u,Zn as d,_ as ee,b as f,fl as p,g as te,ja as ne,lc as re,ml as ie,ms as ae,ps as m,qs as oe,u as h,uc as se,vr as ce,w as le,y as g,yr as ue}from"./control-ui-core-pH6nakZ-.js";import{G as _,I as de,J as v,R as y,W as b,Z as fe,at as pe,h as me,i as he,m as ge,n as _e,rt as x}from"./lit-runtime-BEtFSUCp.js";import{Cn as ve,Jt as ye,Yt as be,ln as xe,m as Se,p as Ce}from"./control-ui-core-DGVkFhVB.js";import{Ft as we,Gt as Te,Ht as S,It as C,Lt as Ee,N as De,Rt as Oe,qt as w}from"./control-ui-core-Br5DB0Zj.js";import{In as ke,Ln as Ae}from"./control-ui-boot-wpHCbPL9.js";import{$i as je,$s as Me,Ca as Ne,Cc as Pe,Jl as Fe,Kl as Ie,Ld as Le,Qs as Re,Sn as ze,Tc as Be,Xs as T,Ys as Ve,Zs as He,_a as Ue,ac as We,an as Ge,bc as Ke,cc as qe,dc as Je,ea as Ye,ec as Xe,fc as Ze,gc as Qe,gn as $e,hc as E,ic as D,lc as et,mc as tt,mn as nt,nc as O,oc as rt,on as it,pc as at,rc as ot,sc as st,tc as ct,uc as lt,vc as ut,vn as k,wa as dt,wc as ft,xc as pt,xn as mt,ya as ht,yc as gt,yn as _t}from"./control-ui-boot-Cdpgu1Gm.js";import{it as A}from"./control-ui-boot-BPFwXC8p.js";import{n as vt,t as yt}from"./channel-picker-DBMoQAsl.js";import{n as bt,t as xt}from"./select-picker-BINM0f88.js";import"./text-BRLnxsjx.js";import{t as St}from"./web-awesome-popover-DTDr8XNA.js";import{n as Ct,t as wt}from"./hub-tabs-mHLCJmKB.js";import{n as Tt,t as Et}from"./settings-workspace-Bo4nqRhI.js";import{n as Dt,t as Ot}from"./gateway-page-controller-bzyUg03c.js";import{n as kt,t as At}from"./model-picker-CTfQ10Hi.js";import{n as jt,t as Mt}from"./cron-jobs-pagination-BITiheQo.js";import{a as Nt,n as Pt,s as j}from"./presenter-CKFufLDk.js";import{n as Ft,t as It}from"./agent-scope-control-C6P46hJO.js";function Lt(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return``}}function Rt(){try{return Intl.supportedValuesOf?.(`timeZone`)??[]}catch{return[]}}function zt(e){let t=new Set;return e.map(e=>e.trim()).filter(e=>!e||t.has(e)?!1:(t.add(e),!0))}function Bt(e,t=Lt(),n=Rt()){return zt([t,`UTC`,...e.map(e=>e.schedule.kind===`cron`&&typeof e.schedule.tz==`string`?e.schedule.tz:``),...a(n.map(e=>e.trim()).filter(Boolean))])}function Vt(){return(Vt=e((()=>{r()})))()}function Ht(e){let t=re(e.runtimeConfig),r=e.cron.cronForm.deliveryChannel.trim()||`last`,i=new Set((e.agentsList?.agents??[]).filter(e=>e.kind===`system`).map(e=>e.id.trim())),a=n([...c(e.agentsList?.agents??[]).map(e=>e.id.trim()),...e.cron.cronJobs.map(e=>typeof e.agentId==`string`&&!i.has(e.agentId.trim())?e.agentId.trim():``)]),o=n([...e.modelSuggestions,...et(t),...e.cron.cronJobs.map(e=>{let t=Re(e);return t?.kind===`agentTurn`&&typeof t.model==`string`?t.model.trim():``})]),s=e.cron.cronJobs.map(e=>typeof e.delivery?.to==`string`?e.delivery.to.trim():``).filter(Boolean),l=(r===`last`?Object.values(e.channels.channelsSnapshot?.channelAccounts??{}).flat():e.channels.channelsSnapshot?.channelAccounts?.[r]??[]).flatMap(e=>[e.accountId,e.name]).filter(e=>typeof e==`string`).map(e=>e.trim()).filter(Boolean),u=n([...s,...l]);return{agentSuggestions:a,modelSuggestions:o,timezoneSuggestions:Bt(e.cron.cronJobs),accountTargets:l,deliveryToSuggestions:e.cron.cronForm.deliveryMode===`webhook`?u.filter(e=>/^https?:\/\//i.test(e)):u}}var Ut;function Wt(){return(Wt=e((()=>{r(),oe(),se(),ct(),Vt(),Ut=[`off`,`minimal`,`low`,`medium`,`high`]})))()}function Gt(e){let t=new URLSearchParams(e),n=t.get(`job`)?.trim()||null;return{jobId:n,runId:n&&t.get(`run`)?.trim()||null}}function Kt(e,t){if(t.runId===e)return!0;let n=qt.exec(e);return n!==null&&n[1]===t.jobId&&t.runAtMs===Number(n[2])}var qt;function M(){return(M=e((()=>{qt=/^cron:(.+):(\d+)$/u})))()}function N(e){let t=e.tabs;return t?Ct({id:t.id,active:e.value,tabs:e.options.map(e=>({value:e.value,label:e.label,testId:e.testId})),ariaLabel:e.ariaLabel??``,panelId:t.panelId,className:`cron-tabs`,variant:t.variant,onSelect:e.onChange}):_t({value:e.value,options:e.options,ariaLabel:e.ariaLabel,onChange:t=>e.onChange(t)})}function Jt(){return(Jt=e((()=>{wt(),it()})))()}function Yt(e){let t=e.agentScoped?e.scopedTotal??w(`common.na`):e.status?.jobs??Math.max(e.jobsTotal,e.jobs.length),n=e.status?.enabled===!1?null:e.agentScoped?e.scopedNextWakeAtMs:e.status?.nextWakeAtMs??null,r=e.failingCount;return v`
|
|
<div class="cron-stats">
|
|
<div class="cron-stat">
|
|
<span class="cron-stat__value">${t}</span>
|
|
<span class="cron-stat__label">${w(`cron.stats.tasks`)}</span>
|
|
</div>
|
|
<span class="cron-stat__separator" aria-hidden="true">·</span>
|
|
<button
|
|
type="button"
|
|
class="cron-stat cron-stat--action"
|
|
data-test-id="cron-stat-failing"
|
|
title=${w(`cron.list.activityTab`)}
|
|
@click=${()=>{e.onListTabChange(`activity`),e.onRunsFiltersChange({cronRunsStatuses:[`error`]})}}
|
|
>
|
|
<span
|
|
class="cron-stat__value ${typeof r==`number`&&r>0?`cron-stat__value--danger`:``}"
|
|
>
|
|
${r??w(`common.na`)}
|
|
</span>
|
|
<span class="cron-stat__label">${w(`cron.stats.failing`)}</span>
|
|
</button>
|
|
<span class="cron-stat__separator" aria-hidden="true">·</span>
|
|
<div class="cron-stat">
|
|
<span class="cron-stat__label">${w(`cron.stats.nextWake`)}</span>
|
|
<span class="cron-stat__value cron-stat__value--time">
|
|
${Nt(n)}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
`}function Xt(){return(Xt=e((()=>{b(),S(),j()})))()}function P(e,t,n,r){return{id:e,emoji:t,nameKey:`cron.suggestions.ideas.${e}.name`,taglineKey:`cron.suggestions.ideas.${e}.tagline`,promptKey:`cron.suggestions.ideas.${e}.prompt`,scheduleKey:n,schedule:r}}function Zt(e){return{name:w(e.nameKey),payloadText:w(e.promptKey),payloadKind:`agentTurn`,sessionTarget:`isolated`,wakeMode:`now`,deleteAfterRun:!1,enabled:!0,...e.schedule}}var F,I,Qt,$t,en;function tn(){return(tn=e((()=>{S(),F={scheduleKind:`cron`,cronExpr:`0 9 * * 1-5`},I={scheduleKind:`cron`,cronExpr:`0 8 * * *`},Qt={scheduleKind:`cron`,cronExpr:`0 9 * * 1`},$t={scheduleKind:`every`,everyAmount:`1`,everyUnit:`hours`},en=[P(`repoPulse`,`🐙`,`cron.suggestions.schedules.weekdayMornings`,F),P(`standupGhostwriter`,`👻`,`cron.suggestions.schedules.weekdayMornings`,F),P(`hackerNewsScout`,`🔭`,`cron.suggestions.schedules.everyMorning`,I),P(`dependencyRadar`,`🛰️`,`cron.suggestions.schedules.weekly`,Qt),P(`watchdog`,`🦉`,`cron.suggestions.schedules.hourly`,$t),P(`polyglotMinute`,`🗣️`,`cron.suggestions.schedules.everyMorning`,I)]})))()}function L(e,t){return v`
|
|
<div class="cron-condition-activity__metric">
|
|
<dt>${e}</dt>
|
|
<dd>${t}</dd>
|
|
</div>
|
|
`}function nn(e){let t=f(e.lastCheckedAtMs,{fallback:w(`cron.runs.notChecked`)}),n=f(e.lastFiredAtMs,{fallback:w(`cron.runs.neverFired`)});return v`
|
|
<div class="cron-condition-activity" data-test-id="cron-condition-activity">
|
|
<div class="cron-condition-activity__intro">
|
|
<div class="settings-row__title">
|
|
<span class="cron-condition-activity__icon" aria-hidden="true">${C(`gitBranch`)}</span>
|
|
${w(`cron.runs.conditionActivity`)}
|
|
</div>
|
|
<div class="settings-row__desc">${w(`cron.runs.conditionActivityHint`)}</div>
|
|
</div>
|
|
<dl class="cron-condition-activity__metrics">
|
|
${L(w(`cron.runs.checks`),String(e.checkCount))}
|
|
${L(w(`cron.runs.lastChecked`),t)}
|
|
${L(w(`cron.runs.lastFired`),n)}
|
|
</dl>
|
|
</div>
|
|
`}function rn(e){if(e.checkCount===0)return w(`cron.runs.emptyConditionUnchecked`);let t=e.checkCount===1?`cron.runs.emptyConditionHintOne`:`cron.runs.emptyConditionHint`;return w(t,{count:String(e.checkCount)})}function an(){return[{value:`ok`,label:w(`cron.runs.runStatusOk`)},{value:`error`,label:w(`cron.runs.runStatusError`)},{value:`skipped`,label:w(`cron.runs.runStatusSkipped`)}]}function on(){return[{value:`delivered`,label:w(`cron.runs.deliveryDelivered`)},{value:`not-delivered`,label:w(`cron.runs.deliveryNotDelivered`)},{value:`unknown`,label:w(`cron.runs.deliveryUnknown`)},{value:`not-requested`,label:w(`cron.runs.deliveryNotRequested`)}]}function sn(e,t,n){let r=new Set(e);return n?r.add(t):r.delete(t),Array.from(r)}function cn(e,t){return e.length===0?t:e.length<=2?e.join(`, `):`${e[0]} +${e.length-1}`}function ln(e){let t=e.options.filter(t=>e.selected.includes(t.value)).map(e=>e.label),n=t.length>2?`${e.summary} (${new Intl.ListFormat(Te.getLocale(),{style:`long`,type:`conjunction`}).format(t)})`:e.summary;return v`
|
|
<div class="cron-filter-dropdown" data-filter=${e.id}>
|
|
<wa-dropdown
|
|
class="cron-filter-dropdown__details"
|
|
placement="bottom-start"
|
|
@wa-select=${t=>{let n=t.detail.item.value;if(n===`${z}clear`){e.onClear();return}if(n?.startsWith(R)){t.preventDefault();let r=n.slice(7);e.onToggle(r,!e.selected.includes(r))}}}
|
|
>
|
|
<button
|
|
slot="trigger"
|
|
type="button"
|
|
class="btn btn--sm cron-filter-dropdown__trigger ${e.selected.length>0?`active`:``}"
|
|
title=${e.title}
|
|
aria-label=${`${e.title} ${n}`}
|
|
>
|
|
<span>${e.summary}</span>
|
|
${C(`chevronDown`)}
|
|
</button>
|
|
${e.options.map(t=>v`
|
|
<wa-dropdown-item
|
|
class="cron-filter-dropdown__option"
|
|
type="checkbox"
|
|
value=${`${R}${t.value}`}
|
|
.checked=${e.selected.includes(t.value)}
|
|
>
|
|
${t.label}
|
|
</wa-dropdown-item>
|
|
`)}
|
|
<div class="session-menu__separator" role="separator"></div>
|
|
<wa-dropdown-item value=${`${z}clear`}>
|
|
${w(`cron.runs.clear`)}
|
|
</wa-dropdown-item>
|
|
</wa-dropdown>
|
|
</div>
|
|
`}function un(e){let t=e.runs.toSorted((t,n)=>e.runsSortDir===`asc`?t.ts-n.ts:n.ts-t.ts),n=e.runsQuery.trim().length>0||e.runsStatuses.length>0||e.runsDeliveryStatuses.length>0,r=an(),i=on(),a=r.filter(t=>e.runsStatuses.includes(t.value)).map(e=>e.label),o=i.filter(t=>e.runsDeliveryStatuses.includes(t.value)).map(e=>e.label),s=cn(a,w(`cron.runs.allStatuses`)),c=cn(o,w(`cron.runs.allDelivery`)),l=e.runsSortDir===`asc`?w(`cron.runs.oldestFirst`):w(`cron.runs.newestFirst`);return v`
|
|
<div class="cron-runs">
|
|
${e.conditionActivity?nn(e.conditionActivity):_}
|
|
<div class="cron-run-filters">
|
|
<div class="cron-search-box cron-run-filter-search">
|
|
<span class="cron-search-box__icon" aria-hidden="true">${C(`search`)}</span>
|
|
<input
|
|
type="search"
|
|
class="settings-input"
|
|
.value=${e.runsQuery}
|
|
aria-label=${w(`cron.runs.searchRuns`)}
|
|
placeholder=${w(`cron.runs.searchPlaceholder`)}
|
|
@input=${t=>e.onRunsFiltersChange({cronRunsQuery:t.target.value})}
|
|
/>
|
|
</div>
|
|
${ln({id:`status`,title:w(`cron.runs.status`),summary:s,options:r,selected:e.runsStatuses,onToggle:(t,n)=>{let r=sn(e.runsStatuses,t,n);e.onRunsFiltersChange({cronRunsStatuses:r})},onClear:()=>{e.onRunsFiltersChange({cronRunsStatuses:[]})}})}
|
|
${ln({id:`delivery`,title:w(`cron.runs.delivery`),summary:c,options:i,selected:e.runsDeliveryStatuses,onToggle:(t,n)=>{let r=sn(e.runsDeliveryStatuses,t,n);e.onRunsFiltersChange({cronRunsDeliveryStatuses:r})},onClear:()=>{e.onRunsFiltersChange({cronRunsDeliveryStatuses:[]})}})}
|
|
<div class="cron-filter-dropdown">
|
|
<wa-dropdown
|
|
class="cron-filter-dropdown__details"
|
|
placement="bottom-start"
|
|
@wa-select=${t=>{let n=t.detail.item.value;(n===`asc`||n===`desc`)&&e.onRunsFiltersChange({cronRunsSortDir:n})}}
|
|
>
|
|
<button
|
|
slot="trigger"
|
|
type="button"
|
|
class="btn btn--sm cron-filter-dropdown__trigger cron-run-sort"
|
|
aria-label=${`${w(`cron.jobs.sort`)} ${l}`}
|
|
>
|
|
<span>${l}</span>
|
|
${C(`chevronDown`)}
|
|
</button>
|
|
<wa-dropdown-item value="desc" aria-current=${String(e.runsSortDir===`desc`)}>
|
|
${w(`cron.runs.newestFirst`)}
|
|
<span slot="details" aria-hidden="true">
|
|
${e.runsSortDir===`desc`?C(`check`):_}
|
|
</span>
|
|
</wa-dropdown-item>
|
|
<wa-dropdown-item value="asc" aria-current=${String(e.runsSortDir===`asc`)}>
|
|
${w(`cron.runs.oldestFirst`)}
|
|
<span slot="details" aria-hidden="true">
|
|
${e.runsSortDir===`asc`?C(`check`):_}
|
|
</span>
|
|
</wa-dropdown-item>
|
|
</wa-dropdown>
|
|
</div>
|
|
</div>
|
|
${t.length===0?n?v`<div class="muted cron-runs__empty">${w(`cron.runs.noMatching`)}</div>`:v`
|
|
<div class="cron-empty-state">
|
|
<div class="cron-empty-state__title">
|
|
${e.conditionActivity?w(`cron.runs.emptyConditionTitle`):w(`cron.runs.emptyTitle`)}
|
|
</div>
|
|
<div class="cron-empty-state__copy">
|
|
${e.conditionActivity?rn(e.conditionActivity):w(`cron.runs.emptyHint`)}
|
|
</div>
|
|
</div>
|
|
`:v`
|
|
<div class="cron-runs__list">
|
|
${t.map(t=>mn(t,e.agentId,e.basePath,e.highlightedRunId,e.onNavigateToChat))}
|
|
</div>
|
|
`}
|
|
${e.runsHasMore?v`
|
|
<button
|
|
class="btn btn--sm cron-load-more"
|
|
?disabled=${e.runsLoadingMore}
|
|
@click=${e.onLoadMoreRuns}
|
|
>
|
|
${e.runsLoadingMore?w(`cron.list.loading`):w(`cron.runs.loadMore`)}
|
|
</button>
|
|
`:_}
|
|
</div>
|
|
`}function dn(e,t=Date.now()){let n=f(e);return w(e>t?`cron.runEntry.next`:`cron.runEntry.due`,{rel:n})}function fn(e){switch(e){case`ok`:return w(`cron.runs.runStatusOk`);case`error`:return w(`cron.runs.runStatusError`);case`skipped`:return w(`cron.runs.runStatusSkipped`);default:return w(`cron.runs.runStatusUnknown`)}}function pn(e){switch(e){case`delivered`:return w(`cron.runs.deliveryDelivered`);case`not-delivered`:return w(`cron.runs.deliveryNotDelivered`);case`not-requested`:return w(`cron.runs.deliveryNotRequested`);default:return w(`cron.runs.deliveryUnknown`)}}function mn(e,t,n,r,i){let a=typeof e.sessionKey==`string`&&e.sessionKey.trim().length>0?ne({face:`chat`,sessionKey:e.sessionKey,fallbackAgentId:t,basePath:n}).href:null,o=fn(e.status??`unknown`),s=pn(e.deliveryStatus??`not-requested`),c=e.usage,l=c&&typeof c.total_tokens==`number`?`${h(c.total_tokens)} ${w(`usage.metrics.tokens`)}`:c&&typeof c.input_tokens==`number`&&typeof c.output_tokens==`number`?`${h(c.input_tokens)} in / ${h(c.output_tokens)} out`:null,d=e.summary||m(e.error)||w(`cron.runEntry.noSummary`),f=!!e.error&&!!e.summary,p=m(e.deliverySuppressionReason),re=[s,p?w(`cron.runEntry.deliverySuppression`,{reason:p}):null,e.model,e.provider,l].filter(Boolean),ie=!!(r&&Kt(r,e));return v`
|
|
<div class="cron-run-entry ${ie?`cron-run-entry--highlighted`:``}">
|
|
<div class="cron-run-entry__header">
|
|
<div class="cron-run-entry__main">
|
|
<div class="cron-run-entry__title">
|
|
${e.jobName??e.jobId}
|
|
<span class="muted"> · ${o}</span>
|
|
</div>
|
|
<div class="cron-run-entry__facts muted">${re.join(` · `)}</div>
|
|
</div>
|
|
<div class="cron-run-entry__meta">
|
|
<div>${g(e.ts)}</div>
|
|
${typeof e.runAtMs==`number`?v`<div class="muted">${w(`cron.runEntry.runAt`)} ${g(e.runAtMs)}</div>`:_}
|
|
<div class="muted">
|
|
${typeof e.durationMs==`number`&&Number.isFinite(e.durationMs)?te(e.durationMs)??ee(e.durationMs,w(`common.na`)):w(`common.na`)}
|
|
</div>
|
|
${typeof e.nextRunAtMs==`number`?v`<div class="muted">${dn(e.nextRunAtMs)}</div>`:_}
|
|
${a?v`<div>
|
|
<a
|
|
class="session-link"
|
|
href=${a}
|
|
@click=${t=>{u(t)&&i&&e.sessionKey&&(t.preventDefault(),i(e.sessionKey))}}
|
|
>${w(`cron.runEntry.openRunChat`)}</a
|
|
>
|
|
</div>`:_}
|
|
${f?v`<div class="muted">${m(e.error)}</div>`:_}
|
|
${e.deliveryError?v`<div class="muted">${m(e.deliveryError)}</div>`:_}
|
|
</div>
|
|
</div>
|
|
<div class="cron-run-entry__body chat-text">
|
|
${he(Ye(d))}
|
|
</div>
|
|
</div>
|
|
`}var R,z;function hn(){return(hn=e((()=>{b(),_e(),Oe(),De(),je(),S(),ae(),le(),s(),M(),R=`option:`,z=`command:`})))()}function gn(e){return[{value:`last`,label:`last`,kind:`neutral`},...o(e.channels.filter(Boolean)).map(t=>({value:t,label:e.channelMeta?.find(e=>e.id===t)?.label||e.channelLabels?.[t]||t}))]}function B(e,n){let r=o(t(n));return r.length===0?_:v`<datalist id=${e}>
|
|
${r.map(e=>v`<option value=${e}></option> `)}
|
|
</datalist>`}function V(e){return`cron-error-${e}`}function H(e){return`cron-${e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}`}function _n(e,t,n){return e===`payloadText`&&t.payloadKind===`systemEvent`?w(`cron.form.mainTimelineMessage`):w(e===`deliveryTo`&&n===`webhook`?`cron.form.webhookUrl`:Q[e])}function vn(e,t,n){return Object.keys(Q).flatMap(r=>{let i=e[r];return i?[{key:r,label:_n(r,t,n),message:i,inputId:H(r)}]:[]})}function yn(e){let t=document.getElementById(e);t instanceof HTMLElement&&(typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`center`,behavior:Ge()}),t.focus())}function bn(e,t){return e?v`<div id=${y(t)} class="cron-help cron-error">${w(e)}</div>`:_}function xn(e){return v`
|
|
${e}
|
|
<span class="cron-required-marker" aria-hidden="true">*</span>
|
|
<span class="cron-required-sr">${w(`cron.form.requiredSr`)}</span>
|
|
`}function U(e){let t=e.wide?`cron-control cron-control--wide`:`cron-control`,n=e.error?v`<div class=${t}>
|
|
${e.control}${bn(e.error,e.errorId)}
|
|
</div>`:v`<div class=${t}>${e.control}</div>`;return v`
|
|
<div class=${e.stacked?`settings-row settings-row--stacked`:`settings-row`}>
|
|
<label class="settings-row__text" for=${y(e.controlId||void 0)}>
|
|
<span class="settings-row__title">
|
|
${e.required?xn(e.label):e.label}
|
|
</span>
|
|
${e.help?v`<span class="settings-row__desc">${e.help}</span>`:_}
|
|
</label>
|
|
<div class="settings-row__control">${n}</div>
|
|
</div>
|
|
`}function W(e,t,n){let r=n.errorKey?e.fieldErrors[n.errorKey]:void 0,i=r&&n.errorKey&&n.describeError!==!1?V(n.errorKey):void 0;return v`
|
|
<input
|
|
id=${H(t)}
|
|
class=${n.mono?`settings-input mono`:`settings-input`}
|
|
type=${y(n.type)}
|
|
aria-required=${y(n.required?`true`:void 0)}
|
|
.value=${e.form[t]}
|
|
list=${y(n.list)}
|
|
?disabled=${n.disabled??!1}
|
|
aria-invalid=${y(n.errorKey?r?`true`:`false`:void 0)}
|
|
aria-describedby=${y(i)}
|
|
placeholder=${y(n.placeholder)}
|
|
@input=${n=>e.onFormChange({[t]:n.currentTarget.value})}
|
|
/>
|
|
`}function G(e,t,n){let r=n.errorKey;return U({label:n.label,controlId:H(t),required:n.required,help:n.help,error:r?e.fieldErrors[r]:void 0,errorId:r?V(r):void 0,control:W(e,t,n)})}function K(e,t,n){let r=n.value??e.form[t];return(n.channel?vt:bt)({id:n.standalone?void 0:H(t),label:n.label,value:n.channel?r||`last`:r,options:n.options,disabled:n.disabled,onChange:n=>e.onFormChange({[t]:n})})}function q(e,t,n){return U({label:n.label,controlId:H(t),help:n.help,control:K(e,t,n)})}function J(e,t,n){return ze({title:n.label,description:n.help,checked:e.form[t],onChange:n=>e.onFormChange({[t]:n})})}function Sn(e){let t=e.editingJob?`job`:e.createOpen?`create`:`overview`;return v`
|
|
${t===`overview`?wn(e):Ln(e,t)}
|
|
${B(`cron-agent-suggestions`,e.agentSuggestions)}
|
|
${B(`cron-thinking-suggestions`,e.thinkingSuggestions)}
|
|
${B(`cron-tz-suggestions`,e.timezoneSuggestions)}
|
|
${B(`cron-delivery-to-suggestions`,e.deliveryToSuggestions)}
|
|
${B(`cron-delivery-account-suggestions`,e.accountSuggestions)}
|
|
`}function Cn(e){return e.canManage?_:v`<div class="cron-admin-note" role="note">
|
|
<span aria-hidden="true">${C(`lock`)}</span>
|
|
<span>${w(`cron.adminRequired`)}</span>
|
|
</div>`}function wn(e){let t=e.jobsScheduleKindFilter!==`all`||e.jobsLastStatusFilter!==`all`||e.jobsTriggerFilter!==`all`||e.jobsSortBy!==`nextRunAtMs`||e.jobsSortDir!==`asc`,n=t||e.jobsQuery.trim().length>0||e.jobsEnabledFilter!==`all`,r=!e.loading&&e.hasLoaded&&!e.listError&&!e.error&&e.jobsTotal===0&&!n&&e.canManage,i=[v`
|
|
<div class="cron-overview-header">
|
|
<div class="cron-overview-summary">
|
|
${Yt(e)} ${Cn(e)}
|
|
</div>
|
|
${e.status&&!e.status.enabled?v`
|
|
<div class="cron-error-banner" data-test-id="cron-scheduler-banner">
|
|
<strong>${w(`cron.list.schedulerOff`)}</strong>
|
|
${w(`cron.runNotStarted.stopped`)}
|
|
</div>
|
|
`:_}
|
|
${e.listError?v`<div class="cron-error-banner" role="alert">${e.listError}</div>`:_}
|
|
${e.error?v`<div class="cron-error-banner" role="alert">${e.error}</div>`:_}
|
|
${En(e,t)}
|
|
</div>
|
|
`,v`
|
|
<div
|
|
id="cron-list-panel"
|
|
class="cron-tab-panel"
|
|
role="tabpanel"
|
|
aria-labelledby=${`cron-list-tab-${e.listTab}`}
|
|
>
|
|
${e.listTab===`activity`?k({},v`<div class="cron-activity">${un(e)}</div>`):[k({},On(e,n)),r?In(e):_]}
|
|
</div>
|
|
`];return v`
|
|
<section class="cron-page" data-panel-mode="overview">
|
|
${nt(i,{wide:!0})}
|
|
</section>
|
|
`}function Tn(e){return N({value:e.listTab,options:[{value:`tasks`,label:w(`cron.list.tasksTab`),testId:`cron-list-tab-tasks`},{value:`activity`,label:w(`cron.list.activityTab`),testId:`cron-list-tab-activity`}],ariaLabel:w(`cron.list.viewLabel`),tabs:{id:`cron-list`,panelId:`cron-list-panel`},onChange:e.onListTabChange})}function En(e,t){return v`
|
|
<div class="cron-toolbar">
|
|
<div class="cron-toolbar__primary">
|
|
${Tn(e)}
|
|
<div class="cron-toolbar__end">
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm btn--ghost cron-refresh ${e.loading?`cron-refresh--loading`:``}"
|
|
?disabled=${e.loading}
|
|
title=${e.loading?w(`cron.list.refreshing`):w(`cron.list.refresh`)}
|
|
aria-label=${w(`cron.list.refresh`)}
|
|
@click=${e.onRefresh}
|
|
>
|
|
${C(`refresh`)}
|
|
</button>
|
|
${e.canManage?v`
|
|
<button
|
|
type="button"
|
|
class="btn primary btn--sm cron-new-task"
|
|
data-test-id="cron-new-task"
|
|
@click=${()=>e.onOpenCreate()}
|
|
>
|
|
${C(`plus`)} ${w(`cron.list.newTask`)}
|
|
</button>
|
|
`:_}
|
|
</div>
|
|
</div>
|
|
${e.listTab===`tasks`?v`
|
|
<div class="cron-toolbar__filters">
|
|
<div class="cron-search-box">
|
|
<span class="cron-search-box__icon" aria-hidden="true">${C(`search`)}</span>
|
|
<input
|
|
type="search"
|
|
class="settings-input"
|
|
.value=${e.jobsQuery}
|
|
aria-label=${w(`cron.list.searchPlaceholder`)}
|
|
placeholder=${w(`cron.list.searchPlaceholder`)}
|
|
@input=${t=>e.onJobsFiltersChange({cronJobsQuery:t.target.value})}
|
|
/>
|
|
</div>
|
|
${N({value:e.jobsEnabledFilter,options:Xn.map(e=>({value:e.value,label:w(e.labelKey),testId:`cron-tab-${e.value}`})),ariaLabel:w(`cron.tabs.filterLabel`),onChange:t=>void e.onJobsFiltersChange({cronJobsEnabledFilter:t})})}
|
|
${Dn(e,t)}
|
|
</div>
|
|
`:_}
|
|
</div>
|
|
`}function Y(e,t,n){return v`
|
|
<label class="field">
|
|
<span>${n.label}</span>
|
|
<select
|
|
class="settings-select"
|
|
data-test-id=${y(n.testId)}
|
|
.value=${n.value}
|
|
@change=${n=>e.onJobsFiltersChange({[t]:n.currentTarget.value})}
|
|
>
|
|
${n.options.map(({value:e,label:t})=>v`<option value=${e} ?selected=${e===n.value}>${t}</option>`)}
|
|
</select>
|
|
</label>
|
|
`}function Dn(e,t){return v`
|
|
<button
|
|
id="cron-jobs-filter-trigger"
|
|
type="button"
|
|
class="btn btn--sm cron-filter-popover__trigger ${t?`active`:``}"
|
|
title=${w(`cron.list.filters`)}
|
|
aria-label=${w(`cron.list.filters`)}
|
|
aria-haspopup="dialog"
|
|
aria-expanded="false"
|
|
>
|
|
${C(`listFilter`)}
|
|
</button>
|
|
<wa-popover
|
|
class="cron-filter-popover"
|
|
for="cron-jobs-filter-trigger"
|
|
placement="bottom-end"
|
|
without-arrow
|
|
@wa-show=${e=>{e.currentTarget.previousElementSibling?.setAttribute(`aria-expanded`,`true`)}}
|
|
@wa-hide=${e=>{e.currentTarget.previousElementSibling?.setAttribute(`aria-expanded`,`false`)}}
|
|
>
|
|
<div class="cron-filter-popover__panel">
|
|
${Y(e,`cronJobsScheduleKindFilter`,{label:w(`cron.jobs.schedule`),value:e.jobsScheduleKindFilter,testId:`cron-jobs-schedule-filter`,options:Object.entries(Zn).map(([e,t])=>({value:e,label:w(t)}))})}
|
|
${Y(e,`cronJobsLastStatusFilter`,{label:w(`cron.jobs.lastRun`),value:e.jobsLastStatusFilter,testId:`cron-jobs-last-status-filter`,options:[{value:`all`,label:w(`cron.jobs.all`)},{value:`ok`,label:w(`cron.runs.runStatusOk`)},{value:`error`,label:w(`cron.runs.runStatusError`)},{value:`skipped`,label:w(`cron.runs.runStatusSkipped`)},{value:`unknown`,label:w(`cron.runs.runStatusUnknown`)}]})}
|
|
${Y(e,`cronJobsTriggerFilter`,{label:w(`cron.jobs.condition`),value:e.jobsTriggerFilter,testId:`cron-jobs-trigger-filter`,options:[{value:`all`,label:w(`cron.jobs.all`)},{value:`conditional`,label:w(`cron.jobs.conditional`)},{value:`unconditional`,label:w(`cron.jobs.unconditional`)}]})}
|
|
${Y(e,`cronJobsSortBy`,{label:w(`cron.jobs.sort`),value:e.jobsSortBy,options:[{value:`nextRunAtMs`,label:w(`cron.jobs.nextRun`)},{value:`updatedAtMs`,label:w(`cron.jobs.recentlyUpdated`)},{value:`name`,label:w(`cron.jobs.name`)}]})}
|
|
${Y(e,`cronJobsSortDir`,{label:w(`cron.jobs.direction`),value:e.jobsSortDir,options:[{value:`asc`,label:w(`cron.jobs.ascending`)},{value:`desc`,label:w(`cron.jobs.descending`)}]})}
|
|
<button
|
|
class="btn btn--sm"
|
|
data-test-id="cron-jobs-filters-reset"
|
|
?disabled=${!t}
|
|
@click=${e.onJobsFiltersReset}
|
|
>
|
|
${w(`cron.jobs.reset`)}
|
|
</button>
|
|
</div>
|
|
</wa-popover>
|
|
`}function On(e,t){let n=e.loading&&!e.hasLoaded,r=e.loading||e.jobsLoadingMore;return v`
|
|
<div
|
|
class="cron-table ${e.canManage?``:`cron-table--read-only`}"
|
|
aria-busy=${r?`true`:_}
|
|
>
|
|
<div class="cron-table__head">
|
|
<span>${w(`cron.jobs.name`)}</span>
|
|
<span>${w(`cron.jobs.schedule`)}</span>
|
|
<span>${w(`cron.jobs.nextRun`)}</span>
|
|
<span>${w(`cron.jobs.lastRun`)}</span>
|
|
${e.canManage?v`<span aria-hidden="true"></span>`:_}
|
|
</div>
|
|
${e.jobs.length===0?n?v`
|
|
<div
|
|
class="cron-empty-state"
|
|
role="status"
|
|
aria-live="polite"
|
|
data-test-id="cron-jobs-loading"
|
|
>
|
|
<div class="cron-empty-state__title">${w(`cron.list.loading`)}</div>
|
|
</div>
|
|
`:e.hasLoaded?v`
|
|
<div class="cron-empty-state">
|
|
<div class="cron-empty-state__title">
|
|
${w(t?`cron.list.noMatching`:`cron.list.emptyTitle`)}
|
|
</div>
|
|
${t?_:v`<div class="cron-empty-state__copy">${w(`cron.list.emptyHint`)}</div>`}
|
|
</div>
|
|
`:_:me(e.jobs,e=>e.id,t=>kn(t,e))}
|
|
${jt({jobsShown:e.jobs.length,jobsTotal:e.jobsTotal,hasMore:e.jobsHasMore,loading:e.loading,loadingMore:e.jobsLoadingMore,onLoadMore:e.onLoadMoreJobs})}
|
|
</div>
|
|
`}function kn(e,t){let n=e.description?.trim(),r=A(e.payload.kind),i=e.state?.nextRunAtMs,a=typeof i==`number`&&Number.isFinite(i),o=ft(e)?v`<span class="cron-table__running">${w(`cron.runs.runStatusRunning`)}</span>`:a?f(i):w(`common.na`);return v`
|
|
<div
|
|
class="cron-table__row ${e.enabled?``:`cron-table__row--paused`}"
|
|
data-test-id=${`cron-row-${e.id}`}
|
|
@click=${()=>t.onSelectJob(e)}
|
|
>
|
|
<button type="button" class="cron-table__name">
|
|
${An(e)}
|
|
<span class="cron-table__name-copy">
|
|
<span class="cron-table__name-line">
|
|
<span class="cron-table__name-text">${e.name}</span>
|
|
${e.trigger?jn():_}
|
|
</span>
|
|
${n||!e.enabled?v`
|
|
<span class="cron-table__name-meta">
|
|
${n?v`
|
|
<span
|
|
class="cron-table__description"
|
|
data-test-id=${`cron-row-description-${e.id}`}
|
|
title=${`${w(`cron.form.description`)}: ${n}`}
|
|
>${n}</span
|
|
>
|
|
`:_}
|
|
${n&&!e.enabled?v`<span class="cron-table__meta-separator" aria-hidden="true">·</span>`:_}
|
|
${e.enabled?_:Mn(e)}
|
|
</span>
|
|
`:_}
|
|
</span>
|
|
</button>
|
|
${X(`cron-table__schedule`,w(`cron.jobs.schedule`),Pt(e))}
|
|
${X(`cron-table__next`,w(`cron.jobs.nextRun`),o)}
|
|
${X(`cron-table__last`,w(`cron.jobs.lastRun`),Pn(e))}
|
|
${t.canManage?v`
|
|
<span class="cron-table__actions" @click=${e=>e.stopPropagation()}>
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm btn--ghost cron-row-run"
|
|
data-test-id=${`cron-row-run-${e.id}`}
|
|
title=${w(`cron.actions.runNow`)}
|
|
aria-label=${w(`cron.actions.runNow`)}
|
|
?disabled=${t.busy}
|
|
@click=${()=>t.onRun(e,`force`)}
|
|
>
|
|
${C(`play`)}
|
|
</button>
|
|
${r?_:zn(t,e,{compact:!0,testId:`cron-row-toggle-${e.id}`})}
|
|
${Fn(t,e)}
|
|
</span>
|
|
`:_}
|
|
</div>
|
|
`}function X(e,t,n){return v`<span class="cron-table__cell ${e}">
|
|
<span class="cron-table__cell-label">${t}</span>
|
|
<span class="cron-table__cell-value">${n}</span>
|
|
</span>`}function An(e){let t=e.state?.autoDisabled,n=ft(e)?{className:`cron-table__state--running`,iconName:`loader`,label:w(`cron.runs.runStatusRunning`)}:t?{className:`cron-table__state--error`,iconName:`lock`,label:Nn(e)}:Pe(e)?{className:`cron-table__state--error`,iconName:`alertTriangle`,label:w(`cron.runs.runStatusError`)}:e.enabled?{className:`cron-table__state--active`,iconName:null,label:w(`cron.detail.active`)}:{className:`cron-table__state--paused`,iconName:`pause`,label:w(`cron.list.paused`)};return v`<span
|
|
class="cron-table__state ${n.className}"
|
|
role="img"
|
|
aria-label=${n.label}
|
|
title=${n.label}
|
|
>${n.iconName?C(n.iconName):v`<span class="cron-table__state-dot"></span>`}</span
|
|
>`}function jn(){let e=w(`cron.form.triggerConfigured`);return v`<span class="cron-trigger-icon" role="img" aria-label=${e} title=${e}
|
|
>${C(`gitBranch`)}</span
|
|
>`}function Mn(e){if(!e.state?.autoDisabled)return v`<span class="muted cron-table__paused-note">${w(`cron.list.paused`)}</span>`;let t=Nn(e),n=e.state?.lastError?.trim();return v`<span
|
|
class="cron-table__paused-note cron-table__auto-disabled"
|
|
data-test-id=${`cron-row-auto-disabled-${e.id}`}
|
|
title=${n?m(n):t}
|
|
>${t}</span
|
|
>`}function Nn(e){let t=e.state?.autoDisabled;return t?w(t.reason===`schedule-errors`?`cron.list.autoDisabledScheduleErrors`:`cron.list.autoDisabledRunFailures`,{count:String(t.consecutiveErrors)}):w(`cron.list.paused`)}function Pn(e){let t=Be(e),n=e.state?.lastRunAtMs,r=typeof n==`number`&&Number.isFinite(n)?f(n):null;if(t===`unknown`||!r)return v`<span class="muted">${w(`common.na`)}</span>`;let i=t===`ok`?v`<span class="cron-last-glyph cron-last-glyph--ok">${C(`check`)}</span>`:t===`error`?v`<span class="cron-last-glyph cron-last-glyph--error">${C(`x`)}</span>`:v`<span class="cron-last-glyph">${C(`cornerDownRight`)}</span>`,a=fn(t);return v`
|
|
<span class="cron-table__last-run" role="img" aria-label=${a} title=${a}>
|
|
${i}
|
|
<span class="cron-table__last-time">${r}</span>
|
|
</span>
|
|
`}function Fn(e,t){if(!e.canManage)return _;let n=A(t.payload.kind);return v`
|
|
<wa-dropdown
|
|
class="cron-job-menu"
|
|
placement="bottom-end"
|
|
@wa-select=${r=>{if(e.canManage)switch(r.detail.item.value){case`run-if-due`:e.onRun(t,`due`);break;case`clone`:n||e.onClone(t);break;case`remove`:n||e.onRemove(t);break;case void 0:}}}
|
|
>
|
|
<button
|
|
slot="trigger"
|
|
type="button"
|
|
class="btn btn--sm btn--ghost cron-job-menu__trigger"
|
|
aria-label=${w(`cron.actions.more`)}
|
|
title=${w(`cron.actions.more`)}
|
|
>
|
|
${C(`moreHorizontal`)}
|
|
</button>
|
|
${Z(e,`run-if-due`,w(`cron.actions.runIfDue`))}
|
|
${n?_:Z(e,`clone`,w(`cron.actions.clone`))}
|
|
${n?_:Z(e,`remove`,w(`cron.actions.remove`),{danger:!0})}
|
|
</wa-dropdown>
|
|
`}function In(e){return k({title:w(`cron.suggestions.title`)},en.map(t=>v`
|
|
<button
|
|
type="button"
|
|
class="settings-row settings-row--nav cron-suggestion"
|
|
data-suggestion=${t.id}
|
|
@click=${()=>e.onOpenCreate(Zt(t))}
|
|
>
|
|
<div class="settings-row__text">
|
|
<span class="settings-row__title">
|
|
<span aria-hidden="true">${t.emoji}</span> ${w(t.nameKey)}
|
|
</span>
|
|
<span class="settings-row__desc">${w(t.taglineKey)}</span>
|
|
</div>
|
|
<div class="settings-row__control">
|
|
<span class="settings-row__value">${w(t.scheduleKey)}</span>
|
|
<span class="settings-row__chevron">${Ee.chevronRight}</span>
|
|
</div>
|
|
</button>
|
|
`))}function Ln(e,t){let n=t===`job`?e.editingJob??void 0:void 0,r=t===`job`&&!!n,i=t===`job`&&e.detailTab===`history`,a=n?.trigger?{checkCount:n.state?.triggerEvalCount??0,lastCheckedAtMs:n.state?.lastTriggerEvalAtMs,lastFiredAtMs:n.state?.lastTriggerFireAtMs}:void 0,o=[v`
|
|
<div class="cron-back-row">
|
|
<button
|
|
type="button"
|
|
class="cron-back"
|
|
data-test-id="cron-back"
|
|
?disabled=${e.busy}
|
|
@click=${e.onClosePanel}
|
|
>
|
|
${C(`arrowLeft`)} ${w(`cron.detail.back`)}
|
|
</button>
|
|
</div>
|
|
`,Rn(e,t,n),Cn(e),r?Bn(e):_,e.error?v`<div class="cron-error-banner">${e.error}</div>`:_,v`
|
|
<div
|
|
id="cron-detail-panel"
|
|
class="cron-tab-panel"
|
|
role=${r?`tabpanel`:_}
|
|
aria-labelledby=${r?`cron-detail-tab-${e.detailTab}`:_}
|
|
>
|
|
${i?k({title:w(`cron.detail.historyTitle`)},v`<div class="cron-history">
|
|
${un({...e,conditionActivity:a})}
|
|
</div>`):Vn(e,t)}
|
|
</div>
|
|
`];return v`
|
|
<section class="cron-page cron-page--detail" data-panel-mode=${t}>
|
|
${nt(o,{wide:!0})}
|
|
</section>
|
|
`}function Rn(e,t,n){let r=t===`job`?n?.name??e.form.name:w(`cron.detail.newTitle`),i=t===`job`?n?.description?.trim():void 0,a=A(n?.payload.kind),o=n?.state?.nextRunAtMs,s=typeof o==`number`&&Number.isFinite(o)?` · ${w(`cron.jobState.next`)} ${f(o)}`:``,c=t===`job`&&n?`${Pt(n)}${s}`:w(`cron.detail.newSubtitle`);return v`
|
|
<div class="cron-detail-header">
|
|
<div class="cron-detail-header__copy">
|
|
<div class="cron-detail-title">${r}</div>
|
|
${i?v`<div class="cron-detail-description" data-test-id="cron-detail-description">
|
|
<span class="cron-detail-description__label">${w(`cron.form.description`)}:</span>
|
|
${i}
|
|
</div>`:_}
|
|
<div class="cron-detail-meta">
|
|
${t===`job`&&n&&e.canManage&&!a?zn(e,n):_}
|
|
<span class="cron-detail-sub">${c}</span>
|
|
${n?.trigger?jn():_}
|
|
</div>
|
|
</div>
|
|
<div class="cron-detail-actions">
|
|
${t===`job`&&n&&e.canManage?v`
|
|
<button
|
|
type="button"
|
|
class="btn btn--sm"
|
|
data-test-id="cron-run-now"
|
|
?disabled=${e.busy}
|
|
@click=${()=>e.onRun(n,`force`)}
|
|
>
|
|
${C(`play`)} ${w(`cron.actions.runNow`)}
|
|
</button>
|
|
${Fn(e,n)}
|
|
`:_}
|
|
</div>
|
|
</div>
|
|
`}function zn(e,t,n){let r=t.enabled?w(`cron.detail.active`):w(`cron.detail.paused`),i=t.enabled?w(`cron.actions.pause`):w(`cron.actions.resume`);return v`
|
|
<span
|
|
class="cron-enabled-toggle"
|
|
data-test-id=${n?.testId??`cron-toggle-enabled`}
|
|
title=${n?.compact?i:_}
|
|
>
|
|
${mt({checked:t.enabled,disabled:e.busy||!e.canManage,ariaLabel:n?.compact?i:r,onChange:n=>{e.canManage&&e.onToggle(t,n)}})}
|
|
${n?.compact?_:v`<span class="cron-detail-sub">${r}</span>`}
|
|
</span>
|
|
`}function Bn(e){return N({value:e.detailTab,options:[{value:`settings`,label:w(`cron.detail.settingsTab`),testId:`cron-detail-tab-settings`},{value:`history`,label:w(`cron.detail.historyTitle`),testId:`cron-detail-tab-history`}],ariaLabel:w(`cron.detail.tabsLabel`),tabs:{id:`cron-detail`,panelId:`cron-detail-panel`,variant:`sub`},onChange:e.onDetailTabChange})}function Vn(e,t){let n=e.form.payloadLocked,r=t===`job`&&A(e.editingJob?.payload.kind),i=!n&&e.form.payloadKind===`agentTurn`,a=e.form.sessionTarget!==`main`&&(e.form.payloadKind===`agentTurn`||n),o=e.form.deliveryMode===`announce`&&!a?`none`:e.form.deliveryMode,s=vn(e.fieldErrors,e.form,o),c=e.canManage&&!e.busy&&s.length>0,l=c&&!e.canSubmit?s.length===1?w(`cron.form.fixFields`,{count:String(s.length)}):w(`cron.form.fixFieldsPlural`,{count:String(s.length)}):``;return v`
|
|
<fieldset
|
|
class="cron-editor"
|
|
?disabled=${e.busy||!e.canManage||r}
|
|
aria-busy=${String(e.busy)}
|
|
>
|
|
${Hn(e,{payloadLocked:n,isAgentTurn:i})} ${Un(e)}
|
|
${Gn(e)}
|
|
${Kn(e,{supportsAnnounce:a,selectedDeliveryMode:o})}
|
|
${qn(e,{mode:t,isAgentTurn:i,selectedDeliveryMode:o})}
|
|
${c?v`
|
|
<div class="cron-form-status" role="status" aria-live="polite">
|
|
<div class="cron-form-status__title">${w(`cron.form.cantAddYet`)}</div>
|
|
<div class="cron-help">${w(`cron.form.fillRequired`)}</div>
|
|
<ul class="cron-form-status__list">
|
|
${s.map(e=>v`
|
|
<li>
|
|
<button
|
|
type="button"
|
|
class="cron-form-status__link"
|
|
@click=${()=>yn(e.inputId)}
|
|
>
|
|
${e.label}: ${w(e.message)}
|
|
</button>
|
|
</li>
|
|
`)}
|
|
</ul>
|
|
</div>
|
|
`:_}
|
|
${e.canManage&&!r?v`
|
|
<div class="cron-editor-actions">
|
|
<button
|
|
class="btn primary"
|
|
data-test-id="cron-submit"
|
|
?disabled=${e.busy||!e.canSubmit}
|
|
@click=${e.onSubmit}
|
|
>
|
|
${e.busy?w(`cron.form.saving`):w(t===`job`?`cron.form.saveChanges`:`cron.form.createTask`)}
|
|
</button>
|
|
${t===`create`?v`
|
|
<button
|
|
class="btn"
|
|
data-test-id="cron-submit-run"
|
|
?disabled=${e.busy||!e.canSubmit}
|
|
@click=${e.onSubmitRunNow}
|
|
>
|
|
${w(`cron.form.createAndRun`)}
|
|
</button>
|
|
`:_}
|
|
<button class="btn" ?disabled=${e.busy} @click=${e.onClosePanel}>
|
|
${w(`cron.form.cancel`)}
|
|
</button>
|
|
${l?v`<div class="cron-submit-reason" aria-live="polite">
|
|
${l}
|
|
</div>`:_}
|
|
</div>
|
|
`:_}
|
|
</fieldset>
|
|
`}function Z(e,t,n,r){return v`
|
|
<wa-dropdown-item
|
|
class=${r?.danger?`cron-job-menu__item danger`:`cron-job-menu__item`}
|
|
value=${t}
|
|
variant=${r?.danger?`danger`:`default`}
|
|
?disabled=${e.busy||!e.canManage}
|
|
>
|
|
${n}
|
|
</wa-dropdown-item>
|
|
`}function Hn(e,t){let n=e.form.payloadKind===`script`?w(`cron.form.script`):e.form.payloadKind===`heartbeat`?`Heartbeat monitor`:e.form.payloadKind===`skillCollectionReview`?`Skill collection review`:w(`cron.form.command`),r=t.payloadLocked?n:e.form.payloadKind===`systemEvent`?w(`cron.form.mainTimelineMessage`):w(`cron.form.assistantTaskPrompt`),i=t.payloadLocked?w(`cron.form.readOnlyPayloadHelp`):e.form.payloadKind===`systemEvent`?w(`cron.form.systemEventHelp`):w(`cron.form.agentTurnHelp`),a=t.payloadLocked?Qn[e.form.payloadKind]:``,s=U({label:r,controlId:a?``:`cron-payload-text`,required:!0,help:i,stacked:!0,wide:!0,error:e.fieldErrors.payloadText,errorId:V(`payloadText`),control:a?v`
|
|
<pre
|
|
id="cron-payload-text"
|
|
class="code-block cron-payload-code"
|
|
data-test-id="cron-payload-code"
|
|
tabindex="0"
|
|
aria-label=${r}
|
|
><code class="hljs">${he(Ue(e.form.payloadText,a))}</code></pre>
|
|
`:v`
|
|
<textarea
|
|
id="cron-payload-text"
|
|
class="settings-input"
|
|
rows="6"
|
|
.value=${e.form.payloadText}
|
|
?readonly=${t.payloadLocked}
|
|
aria-required="true"
|
|
placeholder=${w(`cron.form.promptPlaceholder`)}
|
|
aria-invalid=${e.fieldErrors.payloadText?`true`:`false`}
|
|
aria-describedby=${y(e.fieldErrors.payloadText?V(`payloadText`):void 0)}
|
|
@input=${t=>e.onFormChange({payloadText:t.target.value})}
|
|
></textarea>
|
|
`}),c=w(`cron.form.action`),l=t.payloadLocked?U({label:c,controlId:H(`payloadKind`),control:v`
|
|
<input
|
|
id=${H(`payloadKind`)}
|
|
class="settings-input"
|
|
.value=${n}
|
|
readonly
|
|
/>
|
|
`}):q(e,`payloadKind`,{label:c,options:[{value:`systemEvent`,label:w(`cron.form.systemEvent`)},{value:`agentTurn`,label:w(`cron.form.agentTurn`)}]}),u=w(`cron.form.model`),d=e.fieldErrors.payloadModel,ee=o(e.modelSuggestions).map(e=>({value:e,label:e,provider:Fe(e)??void 0})),f=t.isAgentTurn?v`
|
|
${U({label:u,controlId:``,help:w(`cron.form.modelHelp`),error:d,errorId:V(`payloadModel`),control:kt({id:`cron-payload-model-picker`,label:u,value:e.form.payloadModel,options:[{value:``,label:w(`quickSettings.model.default`)},...ee],custom:{id:H(`payloadModel`),label:w(`cron.form.customModel`),placeholder:w(`cron.form.modelPlaceholder`),invalid:!!d,describedBy:d?V(`payloadModel`):void 0},onChange:t=>e.onFormChange({payloadModel:t})})})}
|
|
${G(e,`payloadThinking`,{label:w(`cron.form.thinking`),help:w(`cron.form.thinkingHelp`),errorKey:`payloadThinking`,describeError:!1,list:`cron-thinking-suggestions`,placeholder:w(`cron.form.thinkingPlaceholder`)})}
|
|
`:_;return k({},v`${s}${l}${f}`)}function Un(e){let t=e.form.sessionTarget,n=t===`main`||t===`isolated`;return k({title:w(`cron.detail.generalSection`)},v`
|
|
${G(e,`name`,{label:w(`cron.form.fieldName`),required:!0,errorKey:`name`,placeholder:w(`cron.form.namePlaceholder`)})}
|
|
${G(e,`agentId`,{label:w(`cron.form.agentId`),help:w(`cron.form.agentHelp`),list:`cron-agent-suggestions`,disabled:e.form.clearAgent,placeholder:w(`cron.form.agentPlaceholder`)})}
|
|
${q(e,`sessionTarget`,{label:w(`cron.form.runsIn`),help:w(`cron.form.sessionHelp`),options:[{value:`main`,label:w(`cron.form.mainSession`)},{value:`isolated`,label:w(`cron.form.isolatedSession`)},...n?[]:[{value:t,label:t}]]})}
|
|
`)}function Wn(e){if(e.scheduleKind===`every`){let t=e.everyAmount.trim();if(pt(t,e.everyUnit)===void 0)return null;if(Number(t)===1){let t=e.everyUnit===`seconds`?`cron.form.summaryEverySecondOne`:e.everyUnit===`minutes`?`cron.form.summaryEveryMinuteOne`:e.everyUnit===`hours`?`cron.form.summaryEveryHourOne`:`cron.form.summaryEveryDayOne`;return w(t)}let n=e.everyUnit===`seconds`?`cron.form.summaryEverySeconds`:e.everyUnit===`minutes`?`cron.form.summaryEveryMinutes`:e.everyUnit===`hours`?`cron.form.summaryEveryHours`:`cron.form.summaryEveryDays`;return w(n,{amount:t})}if(e.scheduleKind===`at`){let t=Date.parse(e.scheduleAt);return Number.isFinite(t)?w(`cron.form.summaryOnce`,{at:g(t)}):null}if(e.scheduleKind===`cron`){let t=e.cronExpr.trim();if(!t)return null;let n=e.cronTz.trim();return n?w(`cron.form.summaryCronTz`,{expr:t,tz:n}):w(`cron.form.summaryCron`,{expr:t})}return e.scheduleKind===`on-exit`?w(`cron.form.repeatOnExit`):e.scheduleKind===`stream`?w(`cron.form.repeatStream`):null}function Gn(e){let t=e.form,n=t.scheduleKind===`on-exit`,r=t.scheduleKind===`stream`,i=n?{value:`on-exit`,label:w(`cron.form.repeatOnExit`)}:r?{value:`stream`,label:w(`cron.form.repeatStream`)}:null,a=[...i?[{...i,testId:`cron-schedule-kind-${i.value}`}]:[],{value:`every`,label:w(`cron.form.repeatInterval`),testId:`cron-schedule-kind-every`},{value:`at`,label:w(`cron.form.repeatOnce`),testId:`cron-schedule-kind-at`},{value:`cron`,label:w(`cron.form.cronOption`),testId:`cron-schedule-kind-cron`}],o=Wn(t);return k({title:w(`cron.detail.scheduleSection`)},v`
|
|
${$e({title:w(`cron.form.repeat`),description:n?w(`cron.form.onExitHelp`):void 0,stacked:!0,control:N({value:t.scheduleKind,options:a,ariaLabel:w(`cron.form.repeat`),onChange:n=>e.onFormChange({scheduleKind:n,...n===`at`&&(t.scheduleKind===`every`||t.scheduleKind===`cron`)?{deleteAfterRun:!0}:n===`every`||n===`cron`?{deleteAfterRun:!1}:{}})})})}
|
|
${t.scheduleKind===`at`?G(e,`scheduleAt`,{label:w(`cron.form.runAt`),required:!0,errorKey:`scheduleAt`,type:`datetime-local`}):_}
|
|
${t.scheduleKind===`every`?U({label:w(`cron.form.every`),controlId:`cron-every-amount`,required:!0,error:e.fieldErrors.everyAmount,errorId:V(`everyAmount`),control:v`
|
|
<div class="cron-inline-controls">
|
|
${W(e,`everyAmount`,{label:w(`cron.form.every`),required:!0,errorKey:`everyAmount`,placeholder:w(`cron.form.everyAmountPlaceholder`)})}
|
|
${K(e,`everyUnit`,{label:w(`cron.form.unit`),standalone:!0,options:[{value:`seconds`,label:w(`cron.form.seconds`)},{value:`minutes`,label:w(`cron.form.minutes`)},{value:`hours`,label:w(`cron.form.hours`)},{value:`days`,label:w(`cron.form.days`)}]})}
|
|
</div>
|
|
`}):_}
|
|
${t.scheduleKind===`cron`?v`
|
|
${G(e,`cronExpr`,{label:w(`cron.form.expression`),required:!0,errorKey:`cronExpr`,mono:!0,placeholder:w(`cron.form.expressionPlaceholder`)})}
|
|
${G(e,`cronTz`,{label:w(`cron.form.timezoneOptional`),help:w(`cron.form.timezoneHelp`),list:`cron-tz-suggestions`,placeholder:w(`cron.form.timezonePlaceholder`)})}
|
|
`:_}
|
|
${o?v` <div class="cron-schedule-summary">${C(`clock`)}<span>${o}</span></div> `:_}
|
|
`)}function Kn(e,t){let n=gn(e);return k({title:w(`cron.detail.deliverySection`)},v`
|
|
${q(e,`deliveryMode`,{label:w(`cron.form.deliveryModeLabel`),help:w(`cron.form.deliveryHelp`),value:t.selectedDeliveryMode,options:[...t.supportsAnnounce?[{value:`announce`,label:w(`cron.form.announceDefault`)}]:[],{value:`webhook`,label:w(`cron.form.webhookPost`)},{value:`none`,label:w(`cron.form.noneInternal`)}]})}
|
|
${t.selectedDeliveryMode===`announce`?v`
|
|
${q(e,`deliveryChannel`,{label:w(`cron.form.channel`),help:w(`cron.form.channelHelp`),value:e.form.deliveryChannel||`last`,options:n,channel:!0})}
|
|
${G(e,`deliveryTo`,{label:w(`cron.form.to`),help:w(`cron.form.toHelp`),list:`cron-delivery-to-suggestions`,placeholder:w(`cron.form.toPlaceholder`)})}
|
|
`:_}
|
|
${t.selectedDeliveryMode===`webhook`?G(e,`deliveryTo`,{label:w(`cron.form.webhookUrl`),required:!0,help:w(`cron.form.webhookHelp`),errorKey:`deliveryTo`,list:`cron-delivery-to-suggestions`,placeholder:w(`cron.form.webhookPlaceholder`)}):_}
|
|
`)}function qn(e,t){let n=e.form.scheduleKind===`cron`,r=gn(e);return v`
|
|
<section class="settings-section">
|
|
<details class="cron-advanced">
|
|
<summary class="settings-section__heading cron-advanced__summary">
|
|
${w(`cron.form.advanced`)}
|
|
${e.form.triggerEnabled?v`<span class="cron-trigger-summary">
|
|
${C(`gitBranch`)} ${w(`cron.form.triggerConfigured`)}
|
|
</span>`:_}
|
|
</summary>
|
|
<p class="settings-section__desc">${w(`cron.form.advancedHelp`)}</p>
|
|
<div class="settings-group">
|
|
${Jn(e)}
|
|
${G(e,`description`,{label:w(`cron.form.description`),placeholder:w(`cron.form.descriptionPlaceholder`)})}
|
|
${t.mode===`create`?J(e,`enabled`,{label:w(`cron.form.startEnabled`)}):_}
|
|
${q(e,`wakeMode`,{label:w(`cron.form.wakeMode`),help:w(`cron.form.wakeModeHelp`),options:[{value:`now`,label:w(`cron.form.now`)},{value:`next-heartbeat`,label:w(`cron.form.nextHeartbeat`)}]})}
|
|
${t.isAgentTurn?G(e,`timeoutSeconds`,{label:w(`cron.form.timeoutSeconds`),help:w(`cron.form.timeoutHelp`),errorKey:`timeoutSeconds`,placeholder:w(`cron.form.timeoutPlaceholder`)}):_}
|
|
${e.form.scheduleKind===`at`||e.form.scheduleKind===`on-exit`?J(e,`deleteAfterRun`,{label:w(`cron.form.deleteAfterRun`),help:w(`cron.form.deleteAfterRunHelp`)}):_}
|
|
${J(e,`clearAgent`,{label:w(`cron.form.clearAgentOverride`),help:w(`cron.form.clearAgentHelp`)})}
|
|
${U({label:w(`cron.form.sessionKey`),controlId:`cron-session-key`,help:w(`cron.form.sessionKeyHelp`),control:v`
|
|
<input
|
|
id="cron-session-key"
|
|
class="settings-input"
|
|
.value=${e.form.sessionKey}
|
|
placeholder="agent:main:main"
|
|
@input=${t=>e.onFormChange({sessionKey:t.target.value})}
|
|
/>
|
|
`})}
|
|
${n?v`
|
|
${J(e,`scheduleExact`,{label:w(`cron.form.exactTiming`),help:w(`cron.form.exactTimingHelp`)})}
|
|
${U({label:w(`cron.form.staggerWindow`),controlId:`cron-stagger-amount`,error:e.fieldErrors.staggerAmount,errorId:V(`staggerAmount`),control:v`
|
|
<div class="cron-inline-controls">
|
|
${W(e,`staggerAmount`,{label:w(`cron.form.staggerWindow`),disabled:e.form.scheduleExact,errorKey:`staggerAmount`,placeholder:w(`cron.form.staggerPlaceholder`)})}
|
|
${K(e,`staggerUnit`,{label:w(`cron.form.staggerUnit`),standalone:!0,disabled:e.form.scheduleExact,options:[{value:`seconds`,label:w(`cron.form.seconds`)},{value:`minutes`,label:w(`cron.form.minutes`)}]})}
|
|
</div>
|
|
`})}
|
|
`:_}
|
|
${t.isAgentTurn?v`
|
|
${U({label:w(`cron.form.accountId`),controlId:`cron-delivery-account-id`,help:w(`cron.form.accountIdHelp`),control:v`
|
|
<input
|
|
id="cron-delivery-account-id"
|
|
class="settings-input"
|
|
.value=${e.form.deliveryAccountId}
|
|
list="cron-delivery-account-suggestions"
|
|
?disabled=${t.selectedDeliveryMode!==`announce`}
|
|
placeholder="default"
|
|
@input=${t=>e.onFormChange({deliveryAccountId:t.target.value})}
|
|
/>
|
|
`})}
|
|
${J(e,`payloadLightContext`,{label:w(`cron.form.lightContext`),help:w(`cron.form.lightContextHelp`)})}
|
|
${Yn(e,r)}
|
|
`:_}
|
|
${t.selectedDeliveryMode===`none`?_:J(e,`deliveryBestEffort`,{label:w(`cron.form.bestEffortDelivery`),help:w(`cron.form.bestEffortHelp`)})}
|
|
</div>
|
|
</details>
|
|
</section>
|
|
`}function Jn(e){let t=e.form.payloadKind===`script`;return!t&&e.status===null?_:e.status?.triggersEnabled!==!0||t?$e({title:w(`cron.form.conditionTrigger`),description:t?w(`cron.errors.triggerScriptPayloadUnsupported`):e.form.triggerEnabled?w(`cron.form.triggerDisabledConfigured`):w(`cron.form.triggerDisabled`),control:e.form.triggerEnabled?v`<button
|
|
type="button"
|
|
class="btn btn--sm"
|
|
@click=${()=>e.onFormChange({triggerEnabled:!1})}
|
|
>
|
|
${w(`cron.form.clearTrigger`)}
|
|
</button>`:_}):v`
|
|
${J(e,`triggerEnabled`,{label:w(`cron.form.conditionTrigger`),help:w(`cron.form.conditionTriggerHelp`)})}
|
|
${e.form.triggerEnabled?v`
|
|
${U({label:w(`cron.form.triggerScript`),controlId:`cron-trigger-script`,required:!0,help:w(`cron.form.triggerScriptHelp`),error:e.fieldErrors.triggerScript,errorId:V(`triggerScript`),stacked:!0,wide:!0,control:v`<textarea
|
|
id="cron-trigger-script"
|
|
class="settings-input cron-trigger-script mono"
|
|
rows="8"
|
|
spellcheck="false"
|
|
aria-invalid=${e.fieldErrors.triggerScript?`true`:`false`}
|
|
aria-describedby=${y(e.fieldErrors.triggerScript?V(`triggerScript`):void 0)}
|
|
.value=${e.form.triggerScript}
|
|
@input=${t=>{let n=t.currentTarget;n instanceof HTMLTextAreaElement&&e.onFormChange({triggerScript:n.value})}}
|
|
></textarea>`})}
|
|
${J(e,`triggerOnce`,{label:w(`cron.form.triggerOnce`),help:w(`cron.form.triggerOnceHelp`)})}
|
|
`:_}
|
|
`}function Yn(e,t){return v`
|
|
${q(e,`failureAlertMode`,{label:w(`cron.form.failureAlerts`),help:w(`cron.form.failureAlertsHelp`),options:[{value:`inherit`,label:w(`cron.form.failureAlertInherit`)},{value:`disabled`,label:w(`cron.form.failureAlertDisabled`)},{value:`custom`,label:w(`cron.form.failureAlertCustom`)}]})}
|
|
${e.form.failureAlertMode===`custom`?v`
|
|
${G(e,`failureAlertAfter`,{label:w(`cron.form.failureAlertAfter`),help:w(`cron.form.failureAlertAfterHelp`),errorKey:`failureAlertAfter`,placeholder:`2`})}
|
|
${G(e,`failureAlertCooldownSeconds`,{label:w(`cron.form.failureAlertCooldown`),help:w(`cron.form.failureAlertCooldownHelp`),errorKey:`failureAlertCooldownSeconds`,placeholder:`3600`})}
|
|
${q(e,`failureAlertChannel`,{label:w(`cron.form.failureAlertChannel`),value:e.form.failureAlertChannel||`last`,options:t,channel:!0})}
|
|
${G(e,`failureAlertTo`,{label:w(`cron.form.failureAlertTo`),help:w(`cron.form.failureAlertToHelp`),list:`cron-delivery-to-suggestions`,placeholder:w(`cron.form.failureAlertToPlaceholder`)})}
|
|
${q(e,`failureAlertDeliveryMode`,{label:w(`cron.form.failureAlertMode`),value:e.form.failureAlertDeliveryMode||`announce`,options:[{value:`announce`,label:w(`cron.form.failureAlertAnnounce`)},{value:`webhook`,label:w(`cron.form.failureAlertWebhook`)}]})}
|
|
${G(e,`failureAlertAccountId`,{label:w(`cron.form.failureAlertAccountId`),placeholder:w(`cron.form.failureAlertAccountPlaceholder`)})}
|
|
`:_}
|
|
`}var Q,Xn,Zn,Qn;function $n(){return($n=e((()=>{r(),b(),de(),ge(),_e(),yt(),Mt(),Oe(),ht(),At(),Ie(),xt(),we(),De(),St(),it(),S(),Ke(),ae(),le(),j(),Jt(),Xt(),tn(),hn(),Q={name:`cron.form.fieldName`,scheduleAt:`cron.form.runAt`,everyAmount:`cron.form.every`,cronExpr:`cron.form.expression`,staggerAmount:`cron.form.staggerWindow`,triggerScript:`cron.form.triggerScript`,payloadText:`cron.form.assistantTaskPrompt`,payloadModel:`cron.form.model`,payloadThinking:`cron.form.thinking`,timeoutSeconds:`cron.form.timeoutSeconds`,deliveryTo:`cron.form.to`,failureAlertAfter:`cron.form.failureAlertAfter`,failureAlertCooldownSeconds:`cron.form.failureAlertCooldown`},Xn=[{value:`all`,labelKey:`cron.tabs.all`},{value:`enabled`,labelKey:`cron.tabs.active`},{value:`disabled`,labelKey:`cron.tabs.paused`}],Zn={all:`cron.jobs.all`,at:`cron.form.at`,every:`cron.form.every`,cron:`cron.form.cronOption`,"on-exit":`cron.form.repeatOnExit`,stream:`cron.form.repeatStream`},Qn={script:`javascript`,command:`bash`,heartbeat:``,skillCollectionReview:``,systemEvent:``,agentTurn:``}})))()}var $,er;function tr(){return(tr=e((()=>{Ae(),b(),fe(),xe(),Se(),ye(),It(),Ne(),Et(),S(),d(),ct(),s(),Dt(),ie(),ue(),Wt(),M(),$n(),$=class extends p{constructor(...e){super(...e),this.routeSearch=``,this.cron=He(),this.agentsList=null,this.cronModelSuggestions=[],this.listTab=`tasks`,this.detailTab=`settings`,this.pendingRouteData=null,this.highlightedRunId=null,this.pendingRunScroll=!1,this.modelSuggestionsState=null,this.gateway=new Ot(this,{getGateway:()=>this.context?.gateway,invalidateRequests:e=>this.resetGatewayState(e.snapshot),onSnapshot:e=>{e.initial&&this.resetGatewayState(e.snapshot)},ensureInitialData:()=>this.ensureInitialData()}),this.observeAgentScope=Le(e=>{this.resetGatewayState(this.context.gateway.snapshot),this.cron.cronAgentId=e,this.listTab=`tasks`,this.detailTab=`settings`,this.ensureInitialData(),this.requestUpdate()}),this.subscriptions=new ce(this).watch(()=>this.context?.agents,(e,t)=>e.subscribe(t),()=>this.syncAgentsState()).watch(()=>this.context?.channels,(e,t)=>e.subscribe(t)).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t)).effect(()=>this.context?.agentSelection,e=>this.observeAgentScope(e)).effect(()=>this.context?.gateway,e=>e.subscribeEvents(t=>{this.gateway.gateway===e&&this.context.gateway===e&&this.gateway.connected&&this.gateway.client&&t.event===`cron`&&this.refreshCron({tableFilters:!0})})),this.lastPanelKey=null}get canManageCron(){return be(this.context.gateway.snapshot).canAdmin}disconnectedCallback(){this.subscriptions.clear(),super.disconnectedCallback()}resetGatewayState(e){let t=e?.phase===`connected`;this.cron=He({client:e?.client??null,connected:t}),this.cron.cronAgentId=this.context.agentSelection.state.scopeId,this.agentsList=t?this.context.agents.state.agentsList:null,this.cronModelSuggestions=[],this.modelSuggestionsState=null}syncAgentsState(){this.agentsList=this.context.agents.state.agentsList}ensureInitialData(){if(!(!this.cron.connected||!this.cron.client)&&(!this.agentsList&&!this.context.agents.state.agentsLoading&&this.context.agents.ensureList(),!this.cron.cronStatus&&!this.cron.cronLoading?this.refreshCron({tableFilters:!0}):!this.cron.cronRuns.length&&!this.cron.cronRunsLoadingMore&&this.loadRuns(this.cron.cronRunsScope===`all`?null:this.cron.cronRunsJobId),this.modelSuggestionsState!==this.cron)){let e=this.cron;this.modelSuggestionsState=e,this.loadModelSuggestions(e)}}requestCronUpdate(e=this.cron){this.cron===e&&this.requestUpdate()}willUpdate(e){if(e.has(`routeSearch`)){let e=Gt(this.routeSearch);this.pendingRouteData=e.jobId?e:null,this.highlightedRunId=null,this.pendingRunScroll=!1}}updated(){let e=this.cron.cronEditingJob?.id??null,t=`${e?`job`:this.cron.cronCreateOpen?`create`:`overview`}:${e??``}`;if(t!==this.lastPanelKey){this.lastPanelKey=t,this.detailTab=e&&this.highlightedRunId?`history`:`settings`;let n=this.closest(`.content`);n instanceof HTMLElement&&typeof n.scrollTo==`function`&&n.scrollTo({top:0})}if(this.pendingRouteData&&!this.cron.cronLoading&&this.cron.cronJobsSnapshotRevision){let e=this.pendingRouteData;this.pendingRouteData=null;let t=this.cron.cronJobs.find(t=>t.id===e.jobId);t&&this.selectJob(t,e.runId)}if(this.pendingRunScroll){let e=this.querySelector(`.cron-run-entry--highlighted`);e&&(e.scrollIntoView?.({block:`nearest`}),this.pendingRunScroll=!1)}}async refreshCron(e){let t=this.cron;if(!t.connected||!t.client)return;let n=t.cronRunsScope===`job`?t.cronRunsJobId:null;this.loadRuns(n),this.context.channels.refresh(!1),await Promise.all([this.runCronTask(e=>We(e)),this.runCronTask(e=>ut(e)),this.runCronTask(e=>gt(e)),this.runCronTask(t=>O(t,{tableFilters:e.tableFilters}))])}loadRuns(e){return this.runCronTask(t=>D(t,e))}async loadModelSuggestions(e){let t={client:e.client,connected:e.connected,cronModelSuggestions:this.cronModelSuggestions};await ot(t,this.context.agentSelection.state.selectedId),this.isConnected&&this.cron===e&&this.modelSuggestionsState===e&&e.connected&&t.client===e.client&&(this.cronModelSuggestions=t.cronModelSuggestions)}async runCronTask(e){let t=this.cron;try{let n=e(t);return this.requestCronUpdate(t),await n}finally{this.requestCronUpdate(t)}}runCronAdminTask(e){this.canManageCron&&this.runCronTask(e)}patchForm(e){this.canManageCron&&(this.cron.cronForm=st({...this.cron.cronForm,...e},e),this.cron.cronFieldErrors=Qe(this.cron.cronForm),this.requestCronUpdate())}selectJob(e,t=null){this.highlightedRunId=t,this.pendingRunScroll=!!t,t&&(this.detailTab=`history`),this.cron.cronCreateOpen=!1,Ze(this.cron,e),this.requestCronUpdate(),this.runCronTask(async t=>{E(t,{cronRunsScope:`job`}),t.cronRunsJobId=e.id,await D(t,e.id)})}openCreate(e){if(this.canManageCron){if(T(this.cron,this.context.agentSelection.state.selectedId),this.cron.cronCreateOpen=!0,e){this.patchForm(e);return}this.requestCronUpdate()}}cloneJob(e){this.canManageCron&&(Je(this.cron,e),this.cron.cronCreateOpen=!0,this.requestCronUpdate())}async removeJob(e){let t=this.context,n=this.cron,r=this.gateway.capture(),i=this.canManageCron,a=n.cronEditingJob?.id===e.id?n.cronEditingJob:n.cronJobs.find(t=>t.id===e.id&&t.updatedAtMs===e.updatedAtMs);if(!r||!i||!a)return;let o=a.id,s=a.updatedAtMs,c=a.name,l=await dt({title:w(`cron.actions.removeConfirmTitle`,{name:c}),message:w(`cron.actions.removeConfirmMessage`),confirmLabel:w(`cron.actions.remove`),danger:!0}),u=n.cronEditingJob?.id===o?n.cronEditingJob:n.cronJobs.find(e=>e.id===o);!l||this.context!==t||this.cron!==n||!this.gateway.isCurrent(r)||!this.canManageCron||!u||u.updatedAtMs!==s||await this.runCronTask(async e=>{await qe(e,u),e.cronRunsScope===`job`&&e.cronRunsJobId===null&&(E(e,{cronRunsScope:`all`}),await D(e,null))})}closePanel(){T(this.cron,this.context.agentSelection.state.selectedId),this.cron.cronCreateOpen=!1,this.requestCronUpdate(),this.runCronTask(async e=>{E(e,{cronRunsScope:`all`}),e.cronRunsJobId=null,await D(e,null)})}submitForm(e={}){this.runCronAdminTask(async t=>{let n=await Ve(t);n.saved&&(t.cronEditingJob||(e.runNow&&n.jobId&&await lt(t,n.jobId,`force`),t.cronCreateOpen=!1,t.cronRunsScope===`job`&&(E(t,{cronRunsScope:`all`}),t.cronRunsJobId=null,await D(t,null))))})}render(){let e=this.context.channels.state,t=l(this.context),n=Ht({channels:e,runtimeConfig:this.context.runtimeConfig.state,cron:this.cron,agentsList:this.agentsList,modelSuggestions:this.cronModelSuggestions}),r=this.canManageCron;return v`
|
|
<section class="content-header">
|
|
<div>
|
|
<div class="page-title">${ve(`cron`)}</div>
|
|
</div>
|
|
${Ft({agents:this.agentsList?.agents??[],selection:this.context.agentSelection})}
|
|
</section>
|
|
${Tt(Sn({basePath:this.context.basePath,agentId:t,loading:this.cron.cronLoading,hasLoaded:this.cron.cronJobsSnapshotRevision!==null,listError:this.cron.cronJobsError,canManage:r,status:this.cron.cronStatus,failingCount:this.cron.cronFailingCount,agentScoped:this.cron.cronAgentId!==null,scopedTotal:this.cron.cronScopedTotal,scopedNextWakeAtMs:this.cron.cronScopedNextWakeAtMs,jobs:Me(this.cron),jobsLoadingMore:this.cron.cronJobsLoadingMore,jobsTotal:this.cron.cronJobsTotal,jobsHasMore:this.cron.cronJobsHasMore,jobsQuery:this.cron.cronJobsQuery,jobsEnabledFilter:this.cron.cronJobsEnabledFilter,jobsScheduleKindFilter:this.cron.cronJobsScheduleKindFilter,jobsLastStatusFilter:this.cron.cronJobsLastStatusFilter,jobsTriggerFilter:this.cron.cronJobsTriggerFilter,jobsSortBy:this.cron.cronJobsSortBy,jobsSortDir:this.cron.cronJobsSortDir,editingJob:this.cron.cronEditingJob,createOpen:this.cron.cronCreateOpen,listTab:this.listTab,detailTab:this.detailTab,error:this.cron.cronError,busy:this.cron.cronBusy,form:this.cron.cronForm,channels:e.channelsSnapshot?.channelMeta?.length?e.channelsSnapshot.channelMeta.map(e=>e.id):e.channelsSnapshot?.channelOrder??[],channelLabels:e.channelsSnapshot?.channelLabels??{},channelMeta:e.channelsSnapshot?.channelMeta??[],runs:this.cron.cronRuns,highlightedRunId:this.highlightedRunId,runsTotal:this.cron.cronRunsTotal,runsHasMore:this.cron.cronRunsHasMore,runsLoadingMore:this.cron.cronRunsLoadingMore,runsStatuses:this.cron.cronRunsStatuses,runsDeliveryStatuses:this.cron.cronRunsDeliveryStatuses,runsQuery:this.cron.cronRunsQuery,runsSortDir:this.cron.cronRunsSortDir,fieldErrors:this.cron.cronFieldErrors,canSubmit:!Xe(this.cron.cronFieldErrors),agentSuggestions:n.agentSuggestions,modelSuggestions:n.modelSuggestions,thinkingSuggestions:Ut,timezoneSuggestions:n.timezoneSuggestions,deliveryToSuggestions:n.deliveryToSuggestions,accountSuggestions:n.accountTargets,onListTabChange:e=>{this.listTab=e},onDetailTabChange:e=>{this.detailTab=e},onFormChange:e=>this.patchForm(e),onRefresh:()=>void this.refreshCron({tableFilters:!0}),onSubmit:()=>this.submitForm(),onSubmitRunNow:()=>this.submitForm({runNow:!0}),onSelectJob:e=>this.selectJob(e),onOpenCreate:e=>this.openCreate(e),onClosePanel:()=>this.closePanel(),onClone:e=>this.cloneJob(e),onToggle:(e,t)=>this.runCronAdminTask(n=>at(n,e,t)),onRun:(e,t)=>this.runCronAdminTask(n=>lt(n,e.id,t??`force`)),onRemove:e=>void this.removeJob(e),onLoadMoreJobs:()=>void this.runCronTask(e=>O(e,{append:!0,tableFilters:!0})),onJobsFiltersChange:e=>void this.runCronTask(async t=>{tt(t,e),await O(t,{append:!1,tableFilters:!0})}),onJobsFiltersReset:()=>void this.runCronTask(async e=>{tt(e,{cronJobsScheduleKindFilter:`all`,cronJobsLastStatusFilter:`all`,cronJobsTriggerFilter:`all`,cronJobsSortBy:`nextRunAtMs`,cronJobsSortDir:`asc`}),await O(e,{append:!1,tableFilters:!0})}),onLoadMoreRuns:()=>void this.runCronTask(e=>rt(e)),onRunsFiltersChange:e=>void this.runCronTask(async t=>{E(t,e),await D(t,t.cronRunsScope===`all`?null:t.cronRunsJobId)}),onNavigateToChat:e=>this.context.navigate(`chat`,ne({context:this.context,face:`chat`,sessionKey:e}).options)}))}
|
|
`}},i([ke({context:Ce,subscribe:!0})],$.prototype,`context`,void 0),i([pe({attribute:!1})],$.prototype,`routeSearch`,void 0),i([x()],$.prototype,`cron`,void 0),i([x()],$.prototype,`agentsList`,void 0),i([x()],$.prototype,`cronModelSuggestions`,void 0),i([x()],$.prototype,`listTab`,void 0),i([x()],$.prototype,`detailTab`,void 0),er={header:!0,render:e=>v`<openclaw-cron-page
|
|
.routeSearch=${typeof e==`string`?e:``}
|
|
></openclaw-cron-page>`},customElements.get(`openclaw-cron-page`)||customElements.define(`openclaw-cron-page`,$)})))()}tr();export{er as cronPageComponent};
|
|
//# sourceMappingURL=cron-page-DuAoJlqW.js.map
|