@gaodefa/daocore 2026.5.90 → 2026.5.91

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