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