getkova 2026.4.21 → 2026.4.22

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.
Files changed (102) hide show
  1. package/dist/control-ui/apple-touch-icon.png +0 -0
  2. package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
  3. package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
  4. package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
  5. package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
  6. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
  7. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
  8. package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
  9. package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
  10. package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
  11. package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
  12. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
  13. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
  14. package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
  15. package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
  16. package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
  17. package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
  18. package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
  19. package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
  20. package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
  21. package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
  22. package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
  23. package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
  24. package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
  25. package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
  26. package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
  27. package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
  28. package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
  29. package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
  30. package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
  31. package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
  32. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
  33. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
  34. package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
  35. package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
  36. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
  37. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
  38. package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
  39. package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
  40. package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
  41. package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
  42. package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
  43. package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
  44. package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
  45. package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
  46. package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
  47. package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
  48. package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
  49. package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
  50. package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
  51. package/dist/control-ui/assets/kova-logo.png +0 -0
  52. package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
  53. package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
  54. package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
  55. package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
  56. package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
  57. package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
  58. package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
  59. package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
  60. package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
  61. package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
  62. package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
  63. package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
  64. package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
  65. package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
  66. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
  67. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
  68. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
  69. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
  70. package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
  71. package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
  72. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
  73. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
  74. package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
  75. package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
  76. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
  77. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
  78. package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
  79. package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
  80. package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
  81. package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
  82. package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
  83. package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
  84. package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
  85. package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
  86. package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
  87. package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
  88. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
  89. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
  90. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
  91. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
  92. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
  93. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
  94. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
  95. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
  96. package/dist/control-ui/favicon-32.png +0 -0
  97. package/dist/control-ui/favicon.ico +0 -0
  98. package/dist/control-ui/favicon.png +0 -0
  99. package/dist/control-ui/favicon.svg +22 -0
  100. package/dist/control-ui/index.html +73 -0
  101. package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
  102. package/package.json +1 -1
@@ -0,0 +1,928 @@
1
+ import{i as e,n as t}from"./lit-zdTgzAJI.js";import{i as n,l as r}from"./format-BahKhiOC.js";import{J as i,o as a,r as o,z as s}from"./index-XGDpaFxG.js";var c=e=>e??t;function l(){return[{value:`ok`,label:i(`cron.runs.runStatusOk`)},{value:`error`,label:i(`cron.runs.runStatusError`)},{value:`skipped`,label:i(`cron.runs.runStatusSkipped`)}]}function u(){return[{value:`delivered`,label:i(`cron.runs.deliveryDelivered`)},{value:`not-delivered`,label:i(`cron.runs.deliveryNotDelivered`)},{value:`unknown`,label:i(`cron.runs.deliveryUnknown`)},{value:`not-requested`,label:i(`cron.runs.deliveryNotRequested`)}]}function d(e,t,n){let r=new Set(e);return n?r.add(t):r.delete(t),Array.from(r)}function f(e,t){return e.length===0?t:e.length<=2?e.join(`, `):`${e[0]} +${e.length-1}`}function p(e){let t=[`last`,...e.channels.filter(Boolean)],n=e.form.deliveryChannel?.trim();n&&!t.includes(n)&&t.push(n);let r=new Set;return t.filter(e=>r.has(e)?!1:(r.add(e),!0))}function m(e,t){if(t===`last`)return`last`;let n=e.channelMeta?.find(e=>e.id===t);return n?.label?n.label:e.channelLabels?.[t]??t}function h(t){return e`
2
+ <div class="field cron-filter-dropdown" data-filter=${t.id}>
3
+ <span>${t.title}</span>
4
+ <details class="cron-filter-dropdown__details">
5
+ <summary class="btn cron-filter-dropdown__trigger">
6
+ <span>${t.summary}</span>
7
+ </summary>
8
+ <div class="cron-filter-dropdown__panel">
9
+ <div class="cron-filter-dropdown__list">
10
+ ${t.options.map(n=>e`
11
+ <label class="cron-filter-dropdown__option">
12
+ <input
13
+ type="checkbox"
14
+ value=${n.value}
15
+ .checked=${t.selected.includes(n.value)}
16
+ @change=${e=>{let r=e.target;t.onToggle(n.value,r.checked)}}
17
+ />
18
+ <span>${n.label}</span>
19
+ </label>
20
+ `)}
21
+ </div>
22
+ <div class="row">
23
+ <button class="btn" type="button" @click=${t.onClear}>
24
+ ${i(`cron.runs.clear`)}
25
+ </button>
26
+ </div>
27
+ </div>
28
+ </details>
29
+ </div>
30
+ `}function g(n,r){let i=Array.from(new Set(r.map(e=>e.trim()).filter(Boolean)));return i.length===0?t:e`<datalist id=${n}>
31
+ ${i.map(t=>e`<option value=${t}></option> `)}
32
+ </datalist>`}function _(e){return`cron-error-${e}`}function v(e){return e===`name`?`cron-name`:e===`scheduleAt`?`cron-schedule-at`:e===`everyAmount`?`cron-every-amount`:e===`cronExpr`?`cron-cron-expr`:e===`staggerAmount`?`cron-stagger-amount`:e===`payloadText`?`cron-payload-text`:e===`payloadModel`?`cron-payload-model`:e===`payloadThinking`?`cron-payload-thinking`:e===`timeoutSeconds`?`cron-timeout-seconds`:e===`failureAlertAfter`?`cron-failure-alert-after`:e===`failureAlertCooldownSeconds`?`cron-failure-alert-cooldown-seconds`:`cron-delivery-to`}function y(e,t,n){return e===`payloadText`?t.payloadKind===`systemEvent`?i(`cron.form.mainTimelineMessage`):i(`cron.form.assistantTaskPrompt`):e===`deliveryTo`?i(n===`webhook`?`cron.form.webhookUrl`:`cron.form.to`):{name:i(`cron.form.fieldName`),scheduleAt:i(`cron.form.runAt`),everyAmount:i(`cron.form.every`),cronExpr:i(`cron.form.expression`),staggerAmount:i(`cron.form.staggerWindow`),payloadText:i(`cron.form.assistantTaskPrompt`),payloadModel:i(`cron.form.model`),payloadThinking:i(`cron.form.thinking`),timeoutSeconds:i(`cron.form.timeoutSeconds`),deliveryTo:i(`cron.form.to`),failureAlertAfter:`Failure alert after`,failureAlertCooldownSeconds:`Failure alert cooldown`}[e]}function b(e,t,n){let r=[`name`,`scheduleAt`,`everyAmount`,`cronExpr`,`staggerAmount`,`payloadText`,`payloadModel`,`payloadThinking`,`timeoutSeconds`,`deliveryTo`,`failureAlertAfter`,`failureAlertCooldownSeconds`],i=[];for(let a of r){let r=e[a];r&&i.push({key:a,label:y(a,t,n),message:r,inputId:v(a)})}return i}function x(e){let t=document.getElementById(e);t instanceof HTMLElement&&(typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`center`,behavior:`smooth`}),t.focus())}function S(n,r=!1){return e`<span>
33
+ ${n}
34
+ ${r?e`
35
+ <span class="cron-required-marker" aria-hidden="true">*</span>
36
+ <span class="cron-required-sr">${i(`cron.form.requiredSr`)}</span>
37
+ `:t}
38
+ </span>`}function C(n){let r=!!n.editingJobId,o=n.form.payloadKind===`agentTurn`,s=n.form.scheduleKind===`cron`,v=p(n),y=n.runsJobId==null?void 0:n.jobs.find(e=>e.id===n.runsJobId),C=n.runsScope===`all`?i(`cron.jobList.allJobs`):y?.name??n.runsJobId??i(`cron.jobList.selectJob`),D=n.runs.toSorted((e,t)=>n.runsSortDir===`asc`?e.ts-t.ts:t.ts-e.ts),O=l(),k=u(),A=O.filter(e=>n.runsStatuses.includes(e.value)).map(e=>e.label),j=k.filter(e=>n.runsDeliveryStatuses.includes(e.value)).map(e=>e.label),M=f(A,i(`cron.runs.allStatuses`)),P=f(j,i(`cron.runs.allDelivery`)),F=n.form.sessionTarget!==`main`&&n.form.payloadKind===`agentTurn`,I=n.form.deliveryMode===`announce`&&!F?`none`:n.form.deliveryMode,L=b(n.fieldErrors,n.form,I),R=!n.busy&&L.length>0,z=n.jobsQuery.trim().length>0||n.jobsEnabledFilter!==`all`||n.jobsScheduleKindFilter!==`all`||n.jobsLastStatusFilter!==`all`||n.jobsSortBy!==`nextRunAtMs`||n.jobsSortDir!==`asc`,B=R&&!n.canSubmit?L.length===1?i(`cron.form.fixFields`,{count:String(L.length)}):i(`cron.form.fixFieldsPlural`,{count:String(L.length)}):``;return e`
39
+ <section class="card cron-summary-strip">
40
+ <div class="cron-summary-strip__left">
41
+ <div class="cron-summary-item">
42
+ <div class="cron-summary-label">${i(`cron.summary.enabled`)}</div>
43
+ <div class="cron-summary-value">
44
+ <span class=${`chip ${n.status?.enabled?`chip-ok`:`chip-danger`}`}>
45
+ ${n.status?n.status.enabled?i(`cron.summary.yes`):i(`cron.summary.no`):i(`common.na`)}
46
+ </span>
47
+ </div>
48
+ </div>
49
+ <div class="cron-summary-item">
50
+ <div class="cron-summary-label">${i(`cron.summary.jobs`)}</div>
51
+ <div class="cron-summary-value">${n.status?.jobs??i(`common.na`)}</div>
52
+ </div>
53
+ <div class="cron-summary-item cron-summary-item--wide">
54
+ <div class="cron-summary-label">${i(`cron.summary.nextWake`)}</div>
55
+ <div class="cron-summary-value">${a(n.status?.nextWakeAtMs??null)}</div>
56
+ </div>
57
+ </div>
58
+ <div class="cron-summary-strip__actions">
59
+ <button class="btn" ?disabled=${n.loading} @click=${n.onRefresh}>
60
+ ${n.loading?i(`cron.summary.refreshing`):i(`cron.summary.refresh`)}
61
+ </button>
62
+ ${n.error?e`<span class="muted">${n.error}</span>`:t}
63
+ </div>
64
+ </section>
65
+
66
+ <section class="cron-workspace">
67
+ <div class="cron-workspace-main">
68
+ <section class="card">
69
+ <div
70
+ class="row"
71
+ style="justify-content: space-between; align-items: flex-start; gap: 12px;"
72
+ >
73
+ <div>
74
+ <div class="card-title">${i(`cron.jobs.title`)}</div>
75
+ <div class="card-sub">${i(`cron.jobs.subtitle`)}</div>
76
+ </div>
77
+ <div class="muted">
78
+ ${i(`cron.jobs.shownOf`,{shown:String(n.jobs.length),total:String(n.jobsTotal)})}
79
+ </div>
80
+ </div>
81
+ <div class="filters" style="margin-top: 12px;">
82
+ <label class="field cron-filter-search">
83
+ <span>${i(`cron.jobs.searchJobs`)}</span>
84
+ <input
85
+ .value=${n.jobsQuery}
86
+ placeholder=${i(`cron.jobs.searchPlaceholder`)}
87
+ @input=${e=>n.onJobsFiltersChange({cronJobsQuery:e.target.value})}
88
+ />
89
+ </label>
90
+ <label class="field">
91
+ <span>${i(`cron.jobs.enabled`)}</span>
92
+ <select
93
+ .value=${n.jobsEnabledFilter}
94
+ @change=${e=>n.onJobsFiltersChange({cronJobsEnabledFilter:e.target.value})}
95
+ >
96
+ <option value="all">${i(`cron.jobs.all`)}</option>
97
+ <option value="enabled">${i(`common.enabled`)}</option>
98
+ <option value="disabled">${i(`common.disabled`)}</option>
99
+ </select>
100
+ </label>
101
+ <label class="field">
102
+ <span>${i(`cron.jobs.schedule`)}</span>
103
+ <select
104
+ data-test-id="cron-jobs-schedule-filter"
105
+ .value=${n.jobsScheduleKindFilter}
106
+ @change=${e=>n.onJobsFiltersChange({cronJobsScheduleKindFilter:e.target.value})}
107
+ >
108
+ <option value="all">${i(`cron.jobs.all`)}</option>
109
+ <option value="at">${i(`cron.form.at`)}</option>
110
+ <option value="every">${i(`cron.form.every`)}</option>
111
+ <option value="cron">${i(`cron.form.cronOption`)}</option>
112
+ </select>
113
+ </label>
114
+ <label class="field">
115
+ <span>${i(`cron.jobs.lastRun`)}</span>
116
+ <select
117
+ data-test-id="cron-jobs-last-status-filter"
118
+ .value=${n.jobsLastStatusFilter}
119
+ @change=${e=>n.onJobsFiltersChange({cronJobsLastStatusFilter:e.target.value})}
120
+ >
121
+ <option value="all">${i(`cron.jobs.all`)}</option>
122
+ <option value="ok">${i(`cron.runs.runStatusOk`)}</option>
123
+ <option value="error">${i(`cron.runs.runStatusError`)}</option>
124
+ <option value="skipped">${i(`cron.runs.runStatusSkipped`)}</option>
125
+ </select>
126
+ </label>
127
+ <label class="field">
128
+ <span>${i(`cron.jobs.sort`)}</span>
129
+ <select
130
+ .value=${n.jobsSortBy}
131
+ @change=${e=>n.onJobsFiltersChange({cronJobsSortBy:e.target.value})}
132
+ >
133
+ <option value="nextRunAtMs">${i(`cron.jobs.nextRun`)}</option>
134
+ <option value="updatedAtMs">${i(`cron.jobs.recentlyUpdated`)}</option>
135
+ <option value="name">${i(`cron.jobs.name`)}</option>
136
+ </select>
137
+ </label>
138
+ <label class="field">
139
+ <span>${i(`cron.jobs.direction`)}</span>
140
+ <select
141
+ .value=${n.jobsSortDir}
142
+ @change=${e=>n.onJobsFiltersChange({cronJobsSortDir:e.target.value})}
143
+ >
144
+ <option value="asc">${i(`cron.jobs.ascending`)}</option>
145
+ <option value="desc">${i(`cron.jobs.descending`)}</option>
146
+ </select>
147
+ </label>
148
+ <label class="field">
149
+ <span>${i(`cron.jobs.reset`)}</span>
150
+ <button
151
+ class="btn"
152
+ data-test-id="cron-jobs-filters-reset"
153
+ ?disabled=${!z}
154
+ @click=${n.onJobsFiltersReset}
155
+ >
156
+ ${i(`cron.jobs.reset`)}
157
+ </button>
158
+ </label>
159
+ </div>
160
+ ${n.jobs.length===0?e` <div class="muted" style="margin-top: 12px">${i(`cron.jobs.noMatching`)}</div> `:e`
161
+ <div class="list" style="margin-top: 12px;">
162
+ ${n.jobs.map(e=>E(e,n))}
163
+ </div>
164
+ `}
165
+ ${n.jobsHasMore?e`
166
+ <div class="row" style="margin-top: 12px">
167
+ <button
168
+ class="btn"
169
+ ?disabled=${n.loading||n.jobsLoadingMore}
170
+ @click=${n.onLoadMoreJobs}
171
+ >
172
+ ${n.jobsLoadingMore?i(`cron.jobs.loading`):i(`cron.jobs.loadMore`)}
173
+ </button>
174
+ </div>
175
+ `:t}
176
+ </section>
177
+
178
+ <section class="card">
179
+ <div
180
+ class="row"
181
+ style="justify-content: space-between; align-items: flex-start; gap: 12px;"
182
+ >
183
+ <div>
184
+ <div class="card-title">${i(`cron.runs.title`)}</div>
185
+ <div class="card-sub">
186
+ ${n.runsScope===`all`?i(`cron.runs.subtitleAll`):i(`cron.runs.subtitleJob`,{title:C})}
187
+ </div>
188
+ </div>
189
+ <div class="muted">
190
+ ${i(`cron.jobs.shownOf`,{shown:String(D.length),total:String(n.runsTotal)})}
191
+ </div>
192
+ </div>
193
+ <div class="cron-run-filters">
194
+ <div class="cron-run-filters__row cron-run-filters__row--primary">
195
+ <label class="field">
196
+ <span>${i(`cron.runs.scope`)}</span>
197
+ <select
198
+ .value=${n.runsScope}
199
+ @change=${e=>n.onRunsFiltersChange({cronRunsScope:e.target.value})}
200
+ >
201
+ <option value="all">${i(`cron.runs.allJobs`)}</option>
202
+ <option value="job" ?disabled=${n.runsJobId==null}>
203
+ ${i(`cron.runs.selectedJob`)}
204
+ </option>
205
+ </select>
206
+ </label>
207
+ <label class="field cron-run-filter-search">
208
+ <span>${i(`cron.runs.searchRuns`)}</span>
209
+ <input
210
+ .value=${n.runsQuery}
211
+ placeholder=${i(`cron.runs.searchPlaceholder`)}
212
+ @input=${e=>n.onRunsFiltersChange({cronRunsQuery:e.target.value})}
213
+ />
214
+ </label>
215
+ <label class="field">
216
+ <span>${i(`cron.jobs.sort`)}</span>
217
+ <select
218
+ .value=${n.runsSortDir}
219
+ @change=${e=>n.onRunsFiltersChange({cronRunsSortDir:e.target.value})}
220
+ >
221
+ <option value="desc">${i(`cron.runs.newestFirst`)}</option>
222
+ <option value="asc">${i(`cron.runs.oldestFirst`)}</option>
223
+ </select>
224
+ </label>
225
+ </div>
226
+ <div class="cron-run-filters__row cron-run-filters__row--secondary">
227
+ ${h({id:`status`,title:i(`cron.runs.status`),summary:M,options:O,selected:n.runsStatuses,onToggle:(e,t)=>{let r=d(n.runsStatuses,e,t);n.onRunsFiltersChange({cronRunsStatuses:r})},onClear:()=>{n.onRunsFiltersChange({cronRunsStatuses:[]})}})}
228
+ ${h({id:`delivery`,title:i(`cron.runs.delivery`),summary:P,options:k,selected:n.runsDeliveryStatuses,onToggle:(e,t)=>{let r=d(n.runsDeliveryStatuses,e,t);n.onRunsFiltersChange({cronRunsDeliveryStatuses:r})},onClear:()=>{n.onRunsFiltersChange({cronRunsDeliveryStatuses:[]})}})}
229
+ </div>
230
+ </div>
231
+ ${n.runsScope===`job`&&n.runsJobId==null?e`
232
+ <div class="muted" style="margin-top: 12px">${i(`cron.runs.selectJobHint`)}</div>
233
+ `:D.length===0?e`
234
+ <div class="muted" style="margin-top: 12px">${i(`cron.runs.noMatching`)}</div>
235
+ `:e`
236
+ <div class="list" style="margin-top: 12px;">
237
+ ${D.map(e=>N(e,n.basePath,n.onNavigateToChat))}
238
+ </div>
239
+ `}
240
+ ${(n.runsScope===`all`||n.runsJobId!=null)&&n.runsHasMore?e`
241
+ <div class="row" style="margin-top: 12px">
242
+ <button
243
+ class="btn"
244
+ ?disabled=${n.runsLoadingMore}
245
+ @click=${n.onLoadMoreRuns}
246
+ >
247
+ ${n.runsLoadingMore?i(`cron.jobs.loading`):i(`cron.runs.loadMore`)}
248
+ </button>
249
+ </div>
250
+ `:t}
251
+ </section>
252
+ </div>
253
+
254
+ <section class="card cron-workspace-form">
255
+ <div class="card-title">${i(r?`cron.form.editJob`:`cron.form.newJob`)}</div>
256
+ <div class="card-sub">
257
+ ${i(r?`cron.form.updateSubtitle`:`cron.form.createSubtitle`)}
258
+ </div>
259
+ <div class="cron-form">
260
+ <div class="cron-required-legend">
261
+ <span class="cron-required-marker" aria-hidden="true">*</span> ${i(`cron.form.required`)}
262
+ </div>
263
+ <section class="cron-form-section">
264
+ <div class="cron-form-section__title">${i(`cron.form.basics`)}</div>
265
+ <div class="cron-form-section__sub">${i(`cron.form.basicsSub`)}</div>
266
+ <div class="form-grid cron-form-grid">
267
+ <label class="field">
268
+ ${S(i(`cron.form.fieldName`),!0)}
269
+ <input
270
+ id="cron-name"
271
+ .value=${n.form.name}
272
+ placeholder=${i(`cron.form.namePlaceholder`)}
273
+ aria-invalid=${n.fieldErrors.name?`true`:`false`}
274
+ aria-describedby=${c(n.fieldErrors.name?_(`name`):void 0)}
275
+ @input=${e=>n.onFormChange({name:e.target.value})}
276
+ />
277
+ ${T(n.fieldErrors.name,_(`name`))}
278
+ </label>
279
+ <label class="field">
280
+ <span>${i(`cron.form.description`)}</span>
281
+ <input
282
+ .value=${n.form.description}
283
+ placeholder=${i(`cron.form.descriptionPlaceholder`)}
284
+ @input=${e=>n.onFormChange({description:e.target.value})}
285
+ />
286
+ </label>
287
+ <label class="field">
288
+ ${S(i(`cron.form.agentId`))}
289
+ <input
290
+ id="cron-agent-id"
291
+ .value=${n.form.agentId}
292
+ list="cron-agent-suggestions"
293
+ ?disabled=${n.form.clearAgent}
294
+ @input=${e=>n.onFormChange({agentId:e.target.value})}
295
+ placeholder=${i(`cron.form.agentPlaceholder`)}
296
+ />
297
+ <div class="cron-help">${i(`cron.form.agentHelp`)}</div>
298
+ </label>
299
+ <label class="field checkbox cron-checkbox cron-checkbox-inline">
300
+ <input
301
+ type="checkbox"
302
+ .checked=${n.form.enabled}
303
+ @change=${e=>n.onFormChange({enabled:e.target.checked})}
304
+ />
305
+ <span class="field-checkbox__label">${i(`cron.summary.enabled`)}</span>
306
+ </label>
307
+ </div>
308
+ </section>
309
+
310
+ <section class="cron-form-section">
311
+ <div class="cron-form-section__title">${i(`cron.form.schedule`)}</div>
312
+ <div class="cron-form-section__sub">${i(`cron.form.scheduleSub`)}</div>
313
+ <div class="form-grid cron-form-grid">
314
+ <label class="field cron-span-2">
315
+ ${S(i(`cron.form.schedule`))}
316
+ <select
317
+ id="cron-schedule-kind"
318
+ .value=${n.form.scheduleKind}
319
+ @change=${e=>n.onFormChange({scheduleKind:e.target.value})}
320
+ >
321
+ <option value="every">${i(`cron.form.every`)}</option>
322
+ <option value="at">${i(`cron.form.at`)}</option>
323
+ <option value="cron">${i(`cron.form.cronOption`)}</option>
324
+ </select>
325
+ </label>
326
+ </div>
327
+ ${w(n)}
328
+ </section>
329
+
330
+ <section class="cron-form-section">
331
+ <div class="cron-form-section__title">${i(`cron.form.execution`)}</div>
332
+ <div class="cron-form-section__sub">${i(`cron.form.executionSub`)}</div>
333
+ <div class="form-grid cron-form-grid">
334
+ <label class="field">
335
+ ${S(i(`cron.form.session`))}
336
+ <select
337
+ id="cron-session-target"
338
+ .value=${n.form.sessionTarget}
339
+ @change=${e=>n.onFormChange({sessionTarget:e.target.value})}
340
+ >
341
+ <option value="main">${i(`cron.form.main`)}</option>
342
+ <option value="isolated">${i(`cron.form.isolated`)}</option>
343
+ </select>
344
+ <div class="cron-help">${i(`cron.form.sessionHelp`)}</div>
345
+ </label>
346
+ <label class="field">
347
+ ${S(i(`cron.form.wakeMode`))}
348
+ <select
349
+ id="cron-wake-mode"
350
+ .value=${n.form.wakeMode}
351
+ @change=${e=>n.onFormChange({wakeMode:e.target.value})}
352
+ >
353
+ <option value="now">${i(`cron.form.now`)}</option>
354
+ <option value="next-heartbeat">${i(`cron.form.nextHeartbeat`)}</option>
355
+ </select>
356
+ <div class="cron-help">${i(`cron.form.wakeModeHelp`)}</div>
357
+ </label>
358
+ <label class="field ${o?``:`cron-span-2`}">
359
+ ${S(i(`cron.form.payloadKind`))}
360
+ <select
361
+ id="cron-payload-kind"
362
+ .value=${n.form.payloadKind}
363
+ @change=${e=>n.onFormChange({payloadKind:e.target.value})}
364
+ >
365
+ <option value="systemEvent">${i(`cron.form.systemEvent`)}</option>
366
+ <option value="agentTurn">${i(`cron.form.agentTurn`)}</option>
367
+ </select>
368
+ <div class="cron-help">
369
+ ${n.form.payloadKind===`systemEvent`?i(`cron.form.systemEventHelp`):i(`cron.form.agentTurnHelp`)}
370
+ </div>
371
+ </label>
372
+ ${o?e`
373
+ <label class="field">
374
+ ${S(i(`cron.form.timeoutSeconds`))}
375
+ <input
376
+ id="cron-timeout-seconds"
377
+ .value=${n.form.timeoutSeconds}
378
+ placeholder=${i(`cron.form.timeoutPlaceholder`)}
379
+ aria-invalid=${n.fieldErrors.timeoutSeconds?`true`:`false`}
380
+ aria-describedby=${c(n.fieldErrors.timeoutSeconds?_(`timeoutSeconds`):void 0)}
381
+ @input=${e=>n.onFormChange({timeoutSeconds:e.target.value})}
382
+ />
383
+ <div class="cron-help">${i(`cron.form.timeoutHelp`)}</div>
384
+ ${T(n.fieldErrors.timeoutSeconds,_(`timeoutSeconds`))}
385
+ </label>
386
+ `:t}
387
+ </div>
388
+ <label class="field cron-span-2">
389
+ ${S(n.form.payloadKind===`systemEvent`?i(`cron.form.mainTimelineMessage`):i(`cron.form.assistantTaskPrompt`),!0)}
390
+ <textarea
391
+ id="cron-payload-text"
392
+ .value=${n.form.payloadText}
393
+ aria-invalid=${n.fieldErrors.payloadText?`true`:`false`}
394
+ aria-describedby=${c(n.fieldErrors.payloadText?_(`payloadText`):void 0)}
395
+ @input=${e=>n.onFormChange({payloadText:e.target.value})}
396
+ rows="4"
397
+ ></textarea>
398
+ ${T(n.fieldErrors.payloadText,_(`payloadText`))}
399
+ </label>
400
+ </section>
401
+
402
+ <section class="cron-form-section">
403
+ <div class="cron-form-section__title">${i(`cron.form.deliverySection`)}</div>
404
+ <div class="cron-form-section__sub">${i(`cron.form.deliverySub`)}</div>
405
+ <div class="form-grid cron-form-grid">
406
+ <label class="field ${I===`none`?`cron-span-2`:``}">
407
+ ${S(i(`cron.form.resultDelivery`))}
408
+ <select
409
+ id="cron-delivery-mode"
410
+ .value=${I}
411
+ @change=${e=>n.onFormChange({deliveryMode:e.target.value})}
412
+ >
413
+ ${F?e` <option value="announce">${i(`cron.form.announceDefault`)}</option> `:t}
414
+ <option value="webhook">${i(`cron.form.webhookPost`)}</option>
415
+ <option value="none">${i(`cron.form.noneInternal`)}</option>
416
+ </select>
417
+ <div class="cron-help">${i(`cron.form.deliveryHelp`)}</div>
418
+ </label>
419
+ ${I===`none`?t:e`
420
+ <label class="field ${I===`webhook`?`cron-span-2`:``}">
421
+ ${S(i(I===`webhook`?`cron.form.webhookUrl`:`cron.form.channel`),I===`webhook`)}
422
+ ${I===`webhook`?e`
423
+ <input
424
+ id="cron-delivery-to"
425
+ .value=${n.form.deliveryTo}
426
+ list="cron-delivery-to-suggestions"
427
+ aria-invalid=${n.fieldErrors.deliveryTo?`true`:`false`}
428
+ aria-describedby=${c(n.fieldErrors.deliveryTo?_(`deliveryTo`):void 0)}
429
+ @input=${e=>n.onFormChange({deliveryTo:e.target.value})}
430
+ placeholder=${i(`cron.form.webhookPlaceholder`)}
431
+ />
432
+ `:e`
433
+ <select
434
+ id="cron-delivery-channel"
435
+ .value=${n.form.deliveryChannel||`last`}
436
+ @change=${e=>n.onFormChange({deliveryChannel:e.target.value})}
437
+ >
438
+ ${v.map(t=>e`<option value=${t}>
439
+ ${m(n,t)}
440
+ </option>`)}
441
+ </select>
442
+ `}
443
+ ${I===`announce`?e` <div class="cron-help">${i(`cron.form.channelHelp`)}</div> `:e` <div class="cron-help">${i(`cron.form.webhookHelp`)}</div> `}
444
+ </label>
445
+ ${I===`announce`?e`
446
+ <label class="field cron-span-2">
447
+ ${S(i(`cron.form.to`))}
448
+ <input
449
+ id="cron-delivery-to"
450
+ .value=${n.form.deliveryTo}
451
+ list="cron-delivery-to-suggestions"
452
+ @input=${e=>n.onFormChange({deliveryTo:e.target.value})}
453
+ placeholder=${i(`cron.form.toPlaceholder`)}
454
+ />
455
+ <div class="cron-help">${i(`cron.form.toHelp`)}</div>
456
+ </label>
457
+ `:t}
458
+ ${I===`webhook`?T(n.fieldErrors.deliveryTo,_(`deliveryTo`)):t}
459
+ `}
460
+ </div>
461
+ </section>
462
+
463
+ <details class="cron-advanced">
464
+ <summary class="cron-advanced__summary">${i(`cron.form.advanced`)}</summary>
465
+ <div class="cron-help">${i(`cron.form.advancedHelp`)}</div>
466
+ <div class="form-grid cron-form-grid">
467
+ <label class="field checkbox cron-checkbox">
468
+ <input
469
+ type="checkbox"
470
+ .checked=${n.form.deleteAfterRun}
471
+ @change=${e=>n.onFormChange({deleteAfterRun:e.target.checked})}
472
+ />
473
+ <span class="field-checkbox__label">${i(`cron.form.deleteAfterRun`)}</span>
474
+ <div class="cron-help">${i(`cron.form.deleteAfterRunHelp`)}</div>
475
+ </label>
476
+ <label class="field checkbox cron-checkbox">
477
+ <input
478
+ type="checkbox"
479
+ .checked=${n.form.clearAgent}
480
+ @change=${e=>n.onFormChange({clearAgent:e.target.checked})}
481
+ />
482
+ <span class="field-checkbox__label">${i(`cron.form.clearAgentOverride`)}</span>
483
+ <div class="cron-help">${i(`cron.form.clearAgentHelp`)}</div>
484
+ </label>
485
+ <label class="field cron-span-2">
486
+ ${S(`Session key`)}
487
+ <input
488
+ id="cron-session-key"
489
+ .value=${n.form.sessionKey}
490
+ @input=${e=>n.onFormChange({sessionKey:e.target.value})}
491
+ placeholder="agent:main:main"
492
+ />
493
+ <div class="cron-help">Optional routing key for job delivery and wake routing.</div>
494
+ </label>
495
+ ${s?e`
496
+ <label class="field checkbox cron-checkbox cron-span-2">
497
+ <input
498
+ type="checkbox"
499
+ .checked=${n.form.scheduleExact}
500
+ @change=${e=>n.onFormChange({scheduleExact:e.target.checked})}
501
+ />
502
+ <span class="field-checkbox__label">${i(`cron.form.exactTiming`)}</span>
503
+ <div class="cron-help">${i(`cron.form.exactTimingHelp`)}</div>
504
+ </label>
505
+ <div class="cron-stagger-group cron-span-2">
506
+ <label class="field">
507
+ ${S(i(`cron.form.staggerWindow`))}
508
+ <input
509
+ id="cron-stagger-amount"
510
+ .value=${n.form.staggerAmount}
511
+ ?disabled=${n.form.scheduleExact}
512
+ aria-invalid=${n.fieldErrors.staggerAmount?`true`:`false`}
513
+ aria-describedby=${c(n.fieldErrors.staggerAmount?_(`staggerAmount`):void 0)}
514
+ @input=${e=>n.onFormChange({staggerAmount:e.target.value})}
515
+ placeholder=${i(`cron.form.staggerPlaceholder`)}
516
+ />
517
+ ${T(n.fieldErrors.staggerAmount,_(`staggerAmount`))}
518
+ </label>
519
+ <label class="field">
520
+ <span>${i(`cron.form.staggerUnit`)}</span>
521
+ <select
522
+ .value=${n.form.staggerUnit}
523
+ ?disabled=${n.form.scheduleExact}
524
+ @change=${e=>n.onFormChange({staggerUnit:e.target.value})}
525
+ >
526
+ <option value="seconds">${i(`cron.form.seconds`)}</option>
527
+ <option value="minutes">${i(`cron.form.minutes`)}</option>
528
+ </select>
529
+ </label>
530
+ </div>
531
+ `:t}
532
+ ${o?e`
533
+ <label class="field cron-span-2">
534
+ ${S(`Account ID`)}
535
+ <input
536
+ id="cron-delivery-account-id"
537
+ .value=${n.form.deliveryAccountId}
538
+ list="cron-delivery-account-suggestions"
539
+ ?disabled=${I!==`announce`}
540
+ @input=${e=>n.onFormChange({deliveryAccountId:e.target.value})}
541
+ placeholder="default"
542
+ />
543
+ <div class="cron-help">
544
+ Optional channel account ID for multi-account setups.
545
+ </div>
546
+ </label>
547
+ <label class="field checkbox cron-checkbox cron-span-2">
548
+ <input
549
+ type="checkbox"
550
+ .checked=${n.form.payloadLightContext}
551
+ @change=${e=>n.onFormChange({payloadLightContext:e.target.checked})}
552
+ />
553
+ <span class="field-checkbox__label">Light context</span>
554
+ <div class="cron-help">
555
+ Use lightweight bootstrap context for this agent job.
556
+ </div>
557
+ </label>
558
+ <label class="field">
559
+ ${S(i(`cron.form.model`))}
560
+ <input
561
+ id="cron-payload-model"
562
+ .value=${n.form.payloadModel}
563
+ list="cron-model-suggestions"
564
+ @input=${e=>n.onFormChange({payloadModel:e.target.value})}
565
+ placeholder=${i(`cron.form.modelPlaceholder`)}
566
+ />
567
+ <div class="cron-help">${i(`cron.form.modelHelp`)}</div>
568
+ </label>
569
+ <label class="field">
570
+ ${S(i(`cron.form.thinking`))}
571
+ <input
572
+ id="cron-payload-thinking"
573
+ .value=${n.form.payloadThinking}
574
+ list="cron-thinking-suggestions"
575
+ @input=${e=>n.onFormChange({payloadThinking:e.target.value})}
576
+ placeholder=${i(`cron.form.thinkingPlaceholder`)}
577
+ />
578
+ <div class="cron-help">${i(`cron.form.thinkingHelp`)}</div>
579
+ </label>
580
+ `:t}
581
+ ${o?e`
582
+ <label class="field cron-span-2">
583
+ ${S(`Failure alerts`)}
584
+ <select
585
+ .value=${n.form.failureAlertMode}
586
+ @change=${e=>n.onFormChange({failureAlertMode:e.target.value})}
587
+ >
588
+ <option value="inherit">Inherit global setting</option>
589
+ <option value="disabled">Disable for this job</option>
590
+ <option value="custom">Custom per-job settings</option>
591
+ </select>
592
+ <div class="cron-help">
593
+ Control when this job sends repeated-failure alerts.
594
+ </div>
595
+ </label>
596
+ ${n.form.failureAlertMode===`custom`?e`
597
+ <label class="field">
598
+ ${S(`Alert after`)}
599
+ <input
600
+ id="cron-failure-alert-after"
601
+ .value=${n.form.failureAlertAfter}
602
+ aria-invalid=${n.fieldErrors.failureAlertAfter?`true`:`false`}
603
+ aria-describedby=${c(n.fieldErrors.failureAlertAfter?_(`failureAlertAfter`):void 0)}
604
+ @input=${e=>n.onFormChange({failureAlertAfter:e.target.value})}
605
+ placeholder="2"
606
+ />
607
+ <div class="cron-help">Consecutive errors before alerting.</div>
608
+ ${T(n.fieldErrors.failureAlertAfter,_(`failureAlertAfter`))}
609
+ </label>
610
+ <label class="field">
611
+ ${S(`Cooldown (seconds)`)}
612
+ <input
613
+ id="cron-failure-alert-cooldown-seconds"
614
+ .value=${n.form.failureAlertCooldownSeconds}
615
+ aria-invalid=${n.fieldErrors.failureAlertCooldownSeconds?`true`:`false`}
616
+ aria-describedby=${c(n.fieldErrors.failureAlertCooldownSeconds?_(`failureAlertCooldownSeconds`):void 0)}
617
+ @input=${e=>n.onFormChange({failureAlertCooldownSeconds:e.target.value})}
618
+ placeholder="3600"
619
+ />
620
+ <div class="cron-help">Minimum seconds between alerts.</div>
621
+ ${T(n.fieldErrors.failureAlertCooldownSeconds,_(`failureAlertCooldownSeconds`))}
622
+ </label>
623
+ <label class="field">
624
+ ${S(`Alert channel`)}
625
+ <select
626
+ .value=${n.form.failureAlertChannel||`last`}
627
+ @change=${e=>n.onFormChange({failureAlertChannel:e.target.value})}
628
+ >
629
+ ${v.map(t=>e`<option value=${t}>
630
+ ${m(n,t)}
631
+ </option>`)}
632
+ </select>
633
+ </label>
634
+ <label class="field">
635
+ ${S(`Alert to`)}
636
+ <input
637
+ .value=${n.form.failureAlertTo}
638
+ list="cron-delivery-to-suggestions"
639
+ @input=${e=>n.onFormChange({failureAlertTo:e.target.value})}
640
+ placeholder="+1555... or chat id"
641
+ />
642
+ <div class="cron-help">
643
+ Optional recipient override for failure alerts.
644
+ </div>
645
+ </label>
646
+ <label class="field">
647
+ ${S(`Alert mode`)}
648
+ <select
649
+ .value=${n.form.failureAlertDeliveryMode||`announce`}
650
+ @change=${e=>n.onFormChange({failureAlertDeliveryMode:e.target.value})}
651
+ >
652
+ <option value="announce">Announce (via channel)</option>
653
+ <option value="webhook">Webhook (HTTP POST)</option>
654
+ </select>
655
+ </label>
656
+ <label class="field">
657
+ ${S(`Alert account ID`)}
658
+ <input
659
+ .value=${n.form.failureAlertAccountId}
660
+ @input=${e=>n.onFormChange({failureAlertAccountId:e.target.value})}
661
+ placeholder="Account ID for multi-account setups"
662
+ />
663
+ </label>
664
+ `:t}
665
+ `:t}
666
+ ${I===`none`?t:e`
667
+ <label class="field checkbox cron-checkbox cron-span-2">
668
+ <input
669
+ type="checkbox"
670
+ .checked=${n.form.deliveryBestEffort}
671
+ @change=${e=>n.onFormChange({deliveryBestEffort:e.target.checked})}
672
+ />
673
+ <span class="field-checkbox__label"
674
+ >${i(`cron.form.bestEffortDelivery`)}</span
675
+ >
676
+ <div class="cron-help">${i(`cron.form.bestEffortHelp`)}</div>
677
+ </label>
678
+ `}
679
+ </div>
680
+ </details>
681
+ </div>
682
+ ${R?e`
683
+ <div class="cron-form-status" role="status" aria-live="polite">
684
+ <div class="cron-form-status__title">${i(`cron.form.cantAddYet`)}</div>
685
+ <div class="cron-help">${i(`cron.form.fillRequired`)}</div>
686
+ <ul class="cron-form-status__list">
687
+ ${L.map(t=>e`
688
+ <li>
689
+ <button
690
+ type="button"
691
+ class="cron-form-status__link"
692
+ @click=${()=>x(t.inputId)}
693
+ >
694
+ ${t.label}: ${i(t.message)}
695
+ </button>
696
+ </li>
697
+ `)}
698
+ </ul>
699
+ </div>
700
+ `:t}
701
+ <div class="row cron-form-actions">
702
+ <button
703
+ class="btn primary"
704
+ ?disabled=${n.busy||!n.canSubmit}
705
+ @click=${n.onAdd}
706
+ >
707
+ ${n.busy?i(`cron.form.saving`):i(r?`cron.form.saveChanges`:`cron.form.addJob`)}
708
+ </button>
709
+ ${B?e`<div class="cron-submit-reason" aria-live="polite">${B}</div>`:t}
710
+ ${r?e`
711
+ <button class="btn" ?disabled=${n.busy} @click=${n.onCancelEdit}>
712
+ ${i(`cron.form.cancel`)}
713
+ </button>
714
+ `:t}
715
+ </div>
716
+ </section>
717
+ </section>
718
+
719
+ ${g(`cron-agent-suggestions`,n.agentSuggestions)}
720
+ ${g(`cron-model-suggestions`,n.modelSuggestions)}
721
+ ${g(`cron-thinking-suggestions`,n.thinkingSuggestions)}
722
+ ${g(`cron-tz-suggestions`,n.timezoneSuggestions)}
723
+ ${g(`cron-delivery-to-suggestions`,n.deliveryToSuggestions)}
724
+ ${g(`cron-delivery-account-suggestions`,n.accountSuggestions)}
725
+ `}function w(t){let n=t.form;return n.scheduleKind===`at`?e`
726
+ <label class="field cron-span-2" style="margin-top: 12px;">
727
+ ${S(i(`cron.form.runAt`),!0)}
728
+ <input
729
+ id="cron-schedule-at"
730
+ type="datetime-local"
731
+ .value=${n.scheduleAt}
732
+ aria-invalid=${t.fieldErrors.scheduleAt?`true`:`false`}
733
+ aria-describedby=${c(t.fieldErrors.scheduleAt?_(`scheduleAt`):void 0)}
734
+ @input=${e=>t.onFormChange({scheduleAt:e.target.value})}
735
+ />
736
+ ${T(t.fieldErrors.scheduleAt,_(`scheduleAt`))}
737
+ </label>
738
+ `:n.scheduleKind===`every`?e`
739
+ <div class="form-grid cron-form-grid" style="margin-top: 12px;">
740
+ <label class="field">
741
+ ${S(i(`cron.form.every`),!0)}
742
+ <input
743
+ id="cron-every-amount"
744
+ .value=${n.everyAmount}
745
+ aria-invalid=${t.fieldErrors.everyAmount?`true`:`false`}
746
+ aria-describedby=${c(t.fieldErrors.everyAmount?_(`everyAmount`):void 0)}
747
+ @input=${e=>t.onFormChange({everyAmount:e.target.value})}
748
+ placeholder=${i(`cron.form.everyAmountPlaceholder`)}
749
+ />
750
+ ${T(t.fieldErrors.everyAmount,_(`everyAmount`))}
751
+ </label>
752
+ <label class="field">
753
+ <span>${i(`cron.form.unit`)}</span>
754
+ <select
755
+ .value=${n.everyUnit}
756
+ @change=${e=>t.onFormChange({everyUnit:e.target.value})}
757
+ >
758
+ <option value="minutes">${i(`cron.form.minutes`)}</option>
759
+ <option value="hours">${i(`cron.form.hours`)}</option>
760
+ <option value="days">${i(`cron.form.days`)}</option>
761
+ </select>
762
+ </label>
763
+ </div>
764
+ `:e`
765
+ <div class="form-grid cron-form-grid" style="margin-top: 12px;">
766
+ <label class="field">
767
+ ${S(i(`cron.form.expression`),!0)}
768
+ <input
769
+ id="cron-cron-expr"
770
+ .value=${n.cronExpr}
771
+ aria-invalid=${t.fieldErrors.cronExpr?`true`:`false`}
772
+ aria-describedby=${c(t.fieldErrors.cronExpr?_(`cronExpr`):void 0)}
773
+ @input=${e=>t.onFormChange({cronExpr:e.target.value})}
774
+ placeholder=${i(`cron.form.expressionPlaceholder`)}
775
+ />
776
+ ${T(t.fieldErrors.cronExpr,_(`cronExpr`))}
777
+ </label>
778
+ <label class="field">
779
+ <span>${i(`cron.form.timezoneOptional`)}</span>
780
+ <input
781
+ .value=${n.cronTz}
782
+ list="cron-tz-suggestions"
783
+ @input=${e=>t.onFormChange({cronTz:e.target.value})}
784
+ placeholder=${i(`cron.form.timezonePlaceholder`)}
785
+ />
786
+ <div class="cron-help">${i(`cron.form.timezoneHelp`)}</div>
787
+ </label>
788
+ <div class="cron-help cron-span-2">${i(`cron.form.jitterHelp`)}</div>
789
+ </div>
790
+ `}function T(n,r){return n?e`<div id=${c(r)} class="cron-help cron-error">${i(n)}</div>`:t}function E(n,r){let a=`list-item list-item-clickable cron-job${r.runsJobId===n.id?` list-item-selected`:``}`,s=e=>{r.onLoadRuns(n.id),e()};return e`
791
+ <div class=${a} @click=${()=>r.onLoadRuns(n.id)}>
792
+ <div class="list-main">
793
+ <div class="list-title">${n.name}</div>
794
+ <div class="list-sub">${o(n)}</div>
795
+ ${D(n)}
796
+ ${n.agentId?e`<div class="muted cron-job-agent">
797
+ ${i(`cron.jobDetail.agent`)}: ${n.agentId}
798
+ </div>`:t}
799
+ </div>
800
+ <div class="list-meta">${A(n)}</div>
801
+ <div class="cron-job-footer">
802
+ <div class="chip-row cron-job-chips">
803
+ <span class=${`chip ${n.enabled?`chip-ok`:`chip-danger`}`}>
804
+ ${n.enabled?i(`cron.jobList.enabled`):i(`cron.jobList.disabled`)}
805
+ </span>
806
+ <span class="chip">${n.sessionTarget}</span>
807
+ <span class="chip">${n.wakeMode}</span>
808
+ </div>
809
+ <div class="row cron-job-actions">
810
+ <button
811
+ class="btn"
812
+ ?disabled=${r.busy}
813
+ @click=${e=>{e.stopPropagation(),s(()=>r.onEdit(n))}}
814
+ >
815
+ ${i(`cron.jobList.edit`)}
816
+ </button>
817
+ <button
818
+ class="btn"
819
+ ?disabled=${r.busy}
820
+ @click=${e=>{e.stopPropagation(),s(()=>r.onClone(n))}}
821
+ >
822
+ ${i(`cron.jobList.clone`)}
823
+ </button>
824
+ <button
825
+ class="btn"
826
+ ?disabled=${r.busy}
827
+ @click=${e=>{e.stopPropagation(),s(()=>r.onToggle(n,!n.enabled))}}
828
+ >
829
+ ${n.enabled?i(`cron.jobList.disable`):i(`cron.jobList.enable`)}
830
+ </button>
831
+ <button
832
+ class="btn"
833
+ ?disabled=${r.busy}
834
+ @click=${e=>{e.stopPropagation(),s(()=>r.onRun(n,`force`))}}
835
+ >
836
+ ${i(`cron.jobList.run`)}
837
+ </button>
838
+ <button
839
+ class="btn"
840
+ ?disabled=${r.busy}
841
+ @click=${e=>{e.stopPropagation(),s(()=>r.onRun(n,`due`))}}
842
+ >
843
+ Run if due
844
+ </button>
845
+ <button
846
+ class="btn"
847
+ ?disabled=${r.busy}
848
+ @click=${e=>{e.stopPropagation(),r.onLoadRuns(n.id)}}
849
+ >
850
+ ${i(`cron.jobList.history`)}
851
+ </button>
852
+ <button
853
+ class="btn danger"
854
+ ?disabled=${r.busy}
855
+ @click=${e=>{e.stopPropagation(),s(()=>r.onRemove(n))}}
856
+ >
857
+ ${i(`cron.jobList.remove`)}
858
+ </button>
859
+ </div>
860
+ </div>
861
+ </div>
862
+ `}function D(n){if(n.payload.kind===`systemEvent`)return e`<div class="cron-job-detail">
863
+ <span class="cron-job-detail-label">${i(`cron.jobDetail.system`)}</span>
864
+ <span class="muted cron-job-detail-value">${n.payload.text}</span>
865
+ </div>`;let r=n.delivery,a=r?.mode===`webhook`?r.to?` (${r.to})`:``:r?.channel||r?.to?` (${r.channel??`last`}${r.to?` -> ${r.to}`:``})`:``;return e`
866
+ <div class="cron-job-detail">
867
+ <span class="cron-job-detail-label">${i(`cron.jobDetail.prompt`)}</span>
868
+ <span class="muted cron-job-detail-value">${n.payload.message}</span>
869
+ </div>
870
+ ${r?e`<div class="cron-job-detail">
871
+ <span class="cron-job-detail-label">${i(`cron.jobDetail.delivery`)}</span>
872
+ <span class="muted cron-job-detail-value">${r.mode}${a}</span>
873
+ </div>`:t}
874
+ `}function O(e){return typeof e!=`number`||!Number.isFinite(e)?i(`common.na`):r(e)}function k(e,t=Date.now()){let n=r(e);return i(e>t?`cron.runEntry.next`:`cron.runEntry.due`,{rel:n})}function A(t){let r=t.state?.lastStatus,a=r===`ok`?`cron-job-status-ok`:r===`error`?`cron-job-status-error`:r===`skipped`?`cron-job-status-skipped`:`cron-job-status-na`,o=i(r===`ok`?`cron.runs.runStatusOk`:r===`error`?`cron.runs.runStatusError`:r===`skipped`?`cron.runs.runStatusSkipped`:`common.na`),s=t.state?.nextRunAtMs,c=t.state?.lastRunAtMs;return e`
875
+ <div class="cron-job-state">
876
+ <div class="cron-job-state-row">
877
+ <span class="cron-job-state-key">${i(`cron.jobState.status`)}</span>
878
+ <span class=${`cron-job-status-pill ${a}`}>${o}</span>
879
+ </div>
880
+ <div class="cron-job-state-row">
881
+ <span class="cron-job-state-key">${i(`cron.jobState.next`)}</span>
882
+ <span class="cron-job-state-value" title=${n(s)}>
883
+ ${O(s)}
884
+ </span>
885
+ </div>
886
+ <div class="cron-job-state-row">
887
+ <span class="cron-job-state-key">${i(`cron.jobState.last`)}</span>
888
+ <span class="cron-job-state-value" title=${n(c)}>
889
+ ${O(c)}
890
+ </span>
891
+ </div>
892
+ </div>
893
+ `}function j(e){switch(e){case`ok`:return i(`cron.runs.runStatusOk`);case`error`:return i(`cron.runs.runStatusError`);case`skipped`:return i(`cron.runs.runStatusSkipped`);default:return i(`cron.runs.runStatusUnknown`)}}function M(e){switch(e){case`delivered`:return i(`cron.runs.deliveryDelivered`);case`not-delivered`:return i(`cron.runs.deliveryNotDelivered`);case`not-requested`:return i(`cron.runs.deliveryNotRequested`);case`unknown`:return i(`cron.runs.deliveryUnknown`);default:return i(`cron.runs.deliveryUnknown`)}}function N(r,a,o){let c=typeof r.sessionKey==`string`&&r.sessionKey.trim().length>0?`${s(`chat`,a)}?session=${encodeURIComponent(r.sessionKey)}`:null,l=j(r.status??`unknown`),u=M(r.deliveryStatus??`not-requested`),d=r.usage,f=d&&typeof d.total_tokens==`number`?`${d.total_tokens} tokens`:d&&typeof d.input_tokens==`number`&&typeof d.output_tokens==`number`?`${d.input_tokens} in / ${d.output_tokens} out`:null;return e`
894
+ <div class="list-item cron-run-entry">
895
+ <div class="list-main cron-run-entry__main">
896
+ <div class="list-title cron-run-entry__title">
897
+ ${r.jobName??r.jobId}
898
+ <span class="muted"> · ${l}</span>
899
+ </div>
900
+ <div class="list-sub cron-run-entry__summary">
901
+ ${r.summary??r.error??i(`cron.runEntry.noSummary`)}
902
+ </div>
903
+ <div class="chip-row" style="margin-top: 6px;">
904
+ <span class="chip">${u}</span>
905
+ ${r.model?e`<span class="chip">${r.model}</span>`:t}
906
+ ${r.provider?e`<span class="chip">${r.provider}</span>`:t}
907
+ ${f?e`<span class="chip">${f}</span>`:t}
908
+ </div>
909
+ </div>
910
+ <div class="list-meta cron-run-entry__meta">
911
+ <div>${n(r.ts)}</div>
912
+ ${typeof r.runAtMs==`number`?e`<div class="muted">${i(`cron.runEntry.runAt`)} ${n(r.runAtMs)}</div>`:t}
913
+ <div class="muted">${r.durationMs??0}ms</div>
914
+ ${typeof r.nextRunAtMs==`number`?e`<div class="muted">${k(r.nextRunAtMs)}</div>`:t}
915
+ ${c?e`<div>
916
+ <a
917
+ class="session-link"
918
+ href=${c}
919
+ @click=${e=>{e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||o&&r.sessionKey&&(e.preventDefault(),o(r.sessionKey))}}
920
+ >${i(`cron.runEntry.openRunChat`)}</a
921
+ >
922
+ </div>`:t}
923
+ ${r.error?e`<div class="muted">${r.error}</div>`:t}
924
+ ${r.deliveryError?e`<div class="muted">${r.deliveryError}</div>`:t}
925
+ </div>
926
+ </div>
927
+ `}export{C as renderCron};
928
+ //# sourceMappingURL=cron-C11m3yJi.js.map