getkova 2026.4.21 → 2026.4.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/control-ui/apple-touch-icon.png +0 -0
  2. package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
  3. package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
  4. package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
  5. package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
  6. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
  7. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
  8. package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
  9. package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
  10. package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
  11. package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
  12. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
  13. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
  14. package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
  15. package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
  16. package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
  17. package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
  18. package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
  19. package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
  20. package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
  21. package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
  22. package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
  23. package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
  24. package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
  25. package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
  26. package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
  27. package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
  28. package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
  29. package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
  30. package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
  31. package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
  32. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
  33. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
  34. package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
  35. package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
  36. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
  37. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
  38. package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
  39. package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
  40. package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
  41. package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
  42. package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
  43. package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
  44. package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
  45. package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
  46. package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
  47. package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
  48. package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
  49. package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
  50. package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
  51. package/dist/control-ui/assets/kova-logo.png +0 -0
  52. package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
  53. package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
  54. package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
  55. package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
  56. package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
  57. package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
  58. package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
  59. package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
  60. package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
  61. package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
  62. package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
  63. package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
  64. package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
  65. package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
  66. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
  67. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
  68. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
  69. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
  70. package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
  71. package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
  72. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
  73. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
  74. package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
  75. package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
  76. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
  77. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
  78. package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
  79. package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
  80. package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
  81. package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
  82. package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
  83. package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
  84. package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
  85. package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
  86. package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
  87. package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
  88. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
  89. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
  90. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
  91. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
  92. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
  93. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
  94. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
  95. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
  96. package/dist/control-ui/favicon-32.png +0 -0
  97. package/dist/control-ui/favicon.ico +0 -0
  98. package/dist/control-ui/favicon.png +0 -0
  99. package/dist/control-ui/favicon.svg +22 -0
  100. package/dist/control-ui/index.html +73 -0
  101. package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
  102. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-C11m3yJi.js","names":["t"],"sources":["../../../node_modules/lit-html/directives/if-defined.js","../../../ui/src/ui/views/cron.ts"],"sourcesContent":["import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n","import { html, nothing } from \"lit\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { t } from \"../../i18n/index.ts\";\nimport type {\n CronFieldErrors,\n CronFieldKey,\n CronJobsLastStatusFilter,\n CronJobsScheduleKindFilter,\n} from \"../controllers/cron.ts\";\nimport { formatRelativeTimestamp, formatMs } from \"../format.ts\";\nimport { pathForTab } from \"../navigation.ts\";\nimport { formatCronSchedule, formatNextRun } from \"../presenter.ts\";\nimport type { ChannelUiMetaEntry, CronJob, CronRunLogEntry, CronStatus } from \"../types.ts\";\nimport type {\n CronDeliveryStatus,\n CronJobsEnabledFilter,\n CronRunScope,\n CronRunsStatusValue,\n CronJobsSortBy,\n CronRunsStatusFilter,\n CronSortDir,\n} from \"../types.ts\";\nimport type { CronFormState } from \"../ui-types.ts\";\n\nexport type CronProps = {\n basePath: string;\n loading: boolean;\n jobsLoadingMore: boolean;\n status: CronStatus | null;\n jobs: CronJob[];\n jobsTotal: number;\n jobsHasMore: boolean;\n jobsQuery: string;\n jobsEnabledFilter: CronJobsEnabledFilter;\n jobsScheduleKindFilter: CronJobsScheduleKindFilter;\n jobsLastStatusFilter: CronJobsLastStatusFilter;\n jobsSortBy: CronJobsSortBy;\n jobsSortDir: CronSortDir;\n error: string | null;\n busy: boolean;\n form: CronFormState;\n fieldErrors: CronFieldErrors;\n canSubmit: boolean;\n editingJobId: string | null;\n channels: string[];\n channelLabels?: Record<string, string>;\n channelMeta?: ChannelUiMetaEntry[];\n runsJobId: string | null;\n runs: CronRunLogEntry[];\n runsTotal: number;\n runsHasMore: boolean;\n runsLoadingMore: boolean;\n runsScope: CronRunScope;\n runsStatuses: CronRunsStatusValue[];\n runsDeliveryStatuses: CronDeliveryStatus[];\n runsStatusFilter: CronRunsStatusFilter;\n runsQuery: string;\n runsSortDir: CronSortDir;\n agentSuggestions: string[];\n modelSuggestions: string[];\n thinkingSuggestions: string[];\n timezoneSuggestions: string[];\n deliveryToSuggestions: string[];\n accountSuggestions: string[];\n onFormChange: (patch: Partial<CronFormState>) => void;\n onRefresh: () => void;\n onAdd: () => void;\n onEdit: (job: CronJob) => void;\n onClone: (job: CronJob) => void;\n onCancelEdit: () => void;\n onToggle: (job: CronJob, enabled: boolean) => void;\n onRun: (job: CronJob, mode?: \"force\" | \"due\") => void;\n onRemove: (job: CronJob) => void;\n onLoadRuns: (jobId: string) => void;\n onLoadMoreJobs: () => void;\n onJobsFiltersChange: (patch: {\n cronJobsQuery?: string;\n cronJobsEnabledFilter?: CronJobsEnabledFilter;\n cronJobsScheduleKindFilter?: CronJobsScheduleKindFilter;\n cronJobsLastStatusFilter?: CronJobsLastStatusFilter;\n cronJobsSortBy?: CronJobsSortBy;\n cronJobsSortDir?: CronSortDir;\n }) => void | Promise<void>;\n onJobsFiltersReset: () => void | Promise<void>;\n onLoadMoreRuns: () => void;\n onRunsFiltersChange: (patch: {\n cronRunsScope?: CronRunScope;\n cronRunsStatuses?: CronRunsStatusValue[];\n cronRunsDeliveryStatuses?: CronDeliveryStatus[];\n cronRunsStatusFilter?: CronRunsStatusFilter;\n cronRunsQuery?: string;\n cronRunsSortDir?: CronSortDir;\n }) => void | Promise<void>;\n onNavigateToChat?: (sessionKey: string) => void;\n};\n\nfunction getRunStatusOptions(): Array<{ value: CronRunsStatusValue; label: string }> {\n return [\n { value: \"ok\", label: t(\"cron.runs.runStatusOk\") },\n { value: \"error\", label: t(\"cron.runs.runStatusError\") },\n { value: \"skipped\", label: t(\"cron.runs.runStatusSkipped\") },\n ];\n}\n\nfunction getRunDeliveryOptions(): Array<{ value: CronDeliveryStatus; label: string }> {\n return [\n { value: \"delivered\", label: t(\"cron.runs.deliveryDelivered\") },\n { value: \"not-delivered\", label: t(\"cron.runs.deliveryNotDelivered\") },\n { value: \"unknown\", label: t(\"cron.runs.deliveryUnknown\") },\n { value: \"not-requested\", label: t(\"cron.runs.deliveryNotRequested\") },\n ];\n}\n\nfunction toggleSelection<T extends string>(selected: T[], value: T, checked: boolean): T[] {\n const set = new Set(selected);\n if (checked) {\n set.add(value);\n } else {\n set.delete(value);\n }\n return Array.from(set);\n}\n\nfunction summarizeSelection(selectedLabels: string[], allLabel: string) {\n if (selectedLabels.length === 0) {\n return allLabel;\n }\n if (selectedLabels.length <= 2) {\n return selectedLabels.join(\", \");\n }\n return `${selectedLabels[0]} +${selectedLabels.length - 1}`;\n}\n\nfunction buildChannelOptions(props: CronProps): string[] {\n const options = [\"last\", ...props.channels.filter(Boolean)];\n const current = props.form.deliveryChannel?.trim();\n if (current && !options.includes(current)) {\n options.push(current);\n }\n const seen = new Set<string>();\n return options.filter((value) => {\n if (seen.has(value)) {\n return false;\n }\n seen.add(value);\n return true;\n });\n}\n\nfunction resolveChannelLabel(props: CronProps, channel: string): string {\n if (channel === \"last\") {\n return \"last\";\n }\n const meta = props.channelMeta?.find((entry) => entry.id === channel);\n if (meta?.label) {\n return meta.label;\n }\n return props.channelLabels?.[channel] ?? channel;\n}\n\nfunction renderRunFilterDropdown(params: {\n id: string;\n title: string;\n summary: string;\n options: Array<{ value: string; label: string }>;\n selected: string[];\n onToggle: (value: string, checked: boolean) => void;\n onClear: () => void;\n}) {\n return html`\n <div class=\"field cron-filter-dropdown\" data-filter=${params.id}>\n <span>${params.title}</span>\n <details class=\"cron-filter-dropdown__details\">\n <summary class=\"btn cron-filter-dropdown__trigger\">\n <span>${params.summary}</span>\n </summary>\n <div class=\"cron-filter-dropdown__panel\">\n <div class=\"cron-filter-dropdown__list\">\n ${params.options.map(\n (option) => html`\n <label class=\"cron-filter-dropdown__option\">\n <input\n type=\"checkbox\"\n value=${option.value}\n .checked=${params.selected.includes(option.value)}\n @change=${(event: Event) => {\n const target = event.target as HTMLInputElement;\n params.onToggle(option.value, target.checked);\n }}\n />\n <span>${option.label}</span>\n </label>\n `,\n )}\n </div>\n <div class=\"row\">\n <button class=\"btn\" type=\"button\" @click=${params.onClear}>\n ${t(\"cron.runs.clear\")}\n </button>\n </div>\n </div>\n </details>\n </div>\n `;\n}\n\nfunction renderSuggestionList(id: string, options: string[]) {\n const clean = Array.from(new Set(options.map((option) => option.trim()).filter(Boolean)));\n if (clean.length === 0) {\n return nothing;\n }\n return html`<datalist id=${id}>\n ${clean.map((value) => html`<option value=${value}></option> `)}\n </datalist>`;\n}\n\ntype BlockingField = {\n key: CronFieldKey;\n label: string;\n message: string;\n inputId: string;\n};\n\nfunction errorIdForField(key: CronFieldKey) {\n return `cron-error-${key}`;\n}\n\nfunction inputIdForField(key: CronFieldKey) {\n if (key === \"name\") {\n return \"cron-name\";\n }\n if (key === \"scheduleAt\") {\n return \"cron-schedule-at\";\n }\n if (key === \"everyAmount\") {\n return \"cron-every-amount\";\n }\n if (key === \"cronExpr\") {\n return \"cron-cron-expr\";\n }\n if (key === \"staggerAmount\") {\n return \"cron-stagger-amount\";\n }\n if (key === \"payloadText\") {\n return \"cron-payload-text\";\n }\n if (key === \"payloadModel\") {\n return \"cron-payload-model\";\n }\n if (key === \"payloadThinking\") {\n return \"cron-payload-thinking\";\n }\n if (key === \"timeoutSeconds\") {\n return \"cron-timeout-seconds\";\n }\n if (key === \"failureAlertAfter\") {\n return \"cron-failure-alert-after\";\n }\n if (key === \"failureAlertCooldownSeconds\") {\n return \"cron-failure-alert-cooldown-seconds\";\n }\n return \"cron-delivery-to\";\n}\n\nfunction fieldLabelForKey(\n key: CronFieldKey,\n form: CronFormState,\n deliveryMode: CronFormState[\"deliveryMode\"],\n) {\n if (key === \"payloadText\") {\n return form.payloadKind === \"systemEvent\"\n ? t(\"cron.form.mainTimelineMessage\")\n : t(\"cron.form.assistantTaskPrompt\");\n }\n if (key === \"deliveryTo\") {\n return deliveryMode === \"webhook\" ? t(\"cron.form.webhookUrl\") : t(\"cron.form.to\");\n }\n const labels: Record<CronFieldKey, string> = {\n name: t(\"cron.form.fieldName\"),\n scheduleAt: t(\"cron.form.runAt\"),\n everyAmount: t(\"cron.form.every\"),\n cronExpr: t(\"cron.form.expression\"),\n staggerAmount: t(\"cron.form.staggerWindow\"),\n payloadText: t(\"cron.form.assistantTaskPrompt\"),\n payloadModel: t(\"cron.form.model\"),\n payloadThinking: t(\"cron.form.thinking\"),\n timeoutSeconds: t(\"cron.form.timeoutSeconds\"),\n deliveryTo: t(\"cron.form.to\"),\n failureAlertAfter: \"Failure alert after\",\n failureAlertCooldownSeconds: \"Failure alert cooldown\",\n };\n return labels[key];\n}\n\nfunction collectBlockingFields(\n errors: CronFieldErrors,\n form: CronFormState,\n deliveryMode: CronFormState[\"deliveryMode\"],\n): BlockingField[] {\n const orderedKeys: CronFieldKey[] = [\n \"name\",\n \"scheduleAt\",\n \"everyAmount\",\n \"cronExpr\",\n \"staggerAmount\",\n \"payloadText\",\n \"payloadModel\",\n \"payloadThinking\",\n \"timeoutSeconds\",\n \"deliveryTo\",\n \"failureAlertAfter\",\n \"failureAlertCooldownSeconds\",\n ];\n const fields: BlockingField[] = [];\n for (const key of orderedKeys) {\n const message = errors[key];\n if (!message) {\n continue;\n }\n fields.push({\n key,\n label: fieldLabelForKey(key, form, deliveryMode),\n message,\n inputId: inputIdForField(key),\n });\n }\n return fields;\n}\n\nfunction focusFormField(id: string) {\n const el = document.getElementById(id);\n if (!(el instanceof HTMLElement)) {\n return;\n }\n if (typeof el.scrollIntoView === \"function\") {\n el.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n }\n el.focus();\n}\n\nfunction renderFieldLabel(text: string, required = false) {\n return html`<span>\n ${text}\n ${required\n ? html`\n <span class=\"cron-required-marker\" aria-hidden=\"true\">*</span>\n <span class=\"cron-required-sr\">${t(\"cron.form.requiredSr\")}</span>\n `\n : nothing}\n </span>`;\n}\n\nexport function renderCron(props: CronProps) {\n const isEditing = Boolean(props.editingJobId);\n const isAgentTurn = props.form.payloadKind === \"agentTurn\";\n const isCronSchedule = props.form.scheduleKind === \"cron\";\n const channelOptions = buildChannelOptions(props);\n const selectedJob =\n props.runsJobId == null ? undefined : props.jobs.find((job) => job.id === props.runsJobId);\n const selectedRunTitle =\n props.runsScope === \"all\"\n ? t(\"cron.jobList.allJobs\")\n : (selectedJob?.name ?? props.runsJobId ?? t(\"cron.jobList.selectJob\"));\n const runs = props.runs.toSorted((a, b) =>\n props.runsSortDir === \"asc\" ? a.ts - b.ts : b.ts - a.ts,\n );\n const runStatusOptions = getRunStatusOptions();\n const runDeliveryOptions = getRunDeliveryOptions();\n const selectedStatusLabels = runStatusOptions\n .filter((option) => props.runsStatuses.includes(option.value))\n .map((option) => option.label);\n const selectedDeliveryLabels = runDeliveryOptions\n .filter((option) => props.runsDeliveryStatuses.includes(option.value))\n .map((option) => option.label);\n const statusSummary = summarizeSelection(selectedStatusLabels, t(\"cron.runs.allStatuses\"));\n const deliverySummary = summarizeSelection(selectedDeliveryLabels, t(\"cron.runs.allDelivery\"));\n const supportsAnnounce =\n props.form.sessionTarget !== \"main\" && props.form.payloadKind === \"agentTurn\";\n const selectedDeliveryMode =\n props.form.deliveryMode === \"announce\" && !supportsAnnounce ? \"none\" : props.form.deliveryMode;\n const blockingFields = collectBlockingFields(props.fieldErrors, props.form, selectedDeliveryMode);\n const blockedByValidation = !props.busy && blockingFields.length > 0;\n const hasActiveJobsFilters =\n props.jobsQuery.trim().length > 0 ||\n props.jobsEnabledFilter !== \"all\" ||\n props.jobsScheduleKindFilter !== \"all\" ||\n props.jobsLastStatusFilter !== \"all\" ||\n props.jobsSortBy !== \"nextRunAtMs\" ||\n props.jobsSortDir !== \"asc\";\n const submitDisabledReason =\n blockedByValidation && !props.canSubmit\n ? blockingFields.length === 1\n ? t(\"cron.form.fixFields\", { count: String(blockingFields.length) })\n : t(\"cron.form.fixFieldsPlural\", { count: String(blockingFields.length) })\n : \"\";\n return html`\n <section class=\"card cron-summary-strip\">\n <div class=\"cron-summary-strip__left\">\n <div class=\"cron-summary-item\">\n <div class=\"cron-summary-label\">${t(\"cron.summary.enabled\")}</div>\n <div class=\"cron-summary-value\">\n <span class=${`chip ${props.status?.enabled ? \"chip-ok\" : \"chip-danger\"}`}>\n ${props.status\n ? props.status.enabled\n ? t(\"cron.summary.yes\")\n : t(\"cron.summary.no\")\n : t(\"common.na\")}\n </span>\n </div>\n </div>\n <div class=\"cron-summary-item\">\n <div class=\"cron-summary-label\">${t(\"cron.summary.jobs\")}</div>\n <div class=\"cron-summary-value\">${props.status?.jobs ?? t(\"common.na\")}</div>\n </div>\n <div class=\"cron-summary-item cron-summary-item--wide\">\n <div class=\"cron-summary-label\">${t(\"cron.summary.nextWake\")}</div>\n <div class=\"cron-summary-value\">${formatNextRun(props.status?.nextWakeAtMs ?? null)}</div>\n </div>\n </div>\n <div class=\"cron-summary-strip__actions\">\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? t(\"cron.summary.refreshing\") : t(\"cron.summary.refresh\")}\n </button>\n ${props.error ? html`<span class=\"muted\">${props.error}</span>` : nothing}\n </div>\n </section>\n\n <section class=\"cron-workspace\">\n <div class=\"cron-workspace-main\">\n <section class=\"card\">\n <div\n class=\"row\"\n style=\"justify-content: space-between; align-items: flex-start; gap: 12px;\"\n >\n <div>\n <div class=\"card-title\">${t(\"cron.jobs.title\")}</div>\n <div class=\"card-sub\">${t(\"cron.jobs.subtitle\")}</div>\n </div>\n <div class=\"muted\">\n ${t(\"cron.jobs.shownOf\", {\n shown: String(props.jobs.length),\n total: String(props.jobsTotal),\n })}\n </div>\n </div>\n <div class=\"filters\" style=\"margin-top: 12px;\">\n <label class=\"field cron-filter-search\">\n <span>${t(\"cron.jobs.searchJobs\")}</span>\n <input\n .value=${props.jobsQuery}\n placeholder=${t(\"cron.jobs.searchPlaceholder\")}\n @input=${(e: Event) =>\n props.onJobsFiltersChange({\n cronJobsQuery: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>${t(\"cron.jobs.enabled\")}</span>\n <select\n .value=${props.jobsEnabledFilter}\n @change=${(e: Event) =>\n props.onJobsFiltersChange({\n cronJobsEnabledFilter: (e.target as HTMLSelectElement)\n .value as CronJobsEnabledFilter,\n })}\n >\n <option value=\"all\">${t(\"cron.jobs.all\")}</option>\n <option value=\"enabled\">${t(\"common.enabled\")}</option>\n <option value=\"disabled\">${t(\"common.disabled\")}</option>\n </select>\n </label>\n <label class=\"field\">\n <span>${t(\"cron.jobs.schedule\")}</span>\n <select\n data-test-id=\"cron-jobs-schedule-filter\"\n .value=${props.jobsScheduleKindFilter}\n @change=${(e: Event) =>\n props.onJobsFiltersChange({\n cronJobsScheduleKindFilter: (e.target as HTMLSelectElement)\n .value as CronJobsScheduleKindFilter,\n })}\n >\n <option value=\"all\">${t(\"cron.jobs.all\")}</option>\n <option value=\"at\">${t(\"cron.form.at\")}</option>\n <option value=\"every\">${t(\"cron.form.every\")}</option>\n <option value=\"cron\">${t(\"cron.form.cronOption\")}</option>\n </select>\n </label>\n <label class=\"field\">\n <span>${t(\"cron.jobs.lastRun\")}</span>\n <select\n data-test-id=\"cron-jobs-last-status-filter\"\n .value=${props.jobsLastStatusFilter}\n @change=${(e: Event) =>\n props.onJobsFiltersChange({\n cronJobsLastStatusFilter: (e.target as HTMLSelectElement)\n .value as CronJobsLastStatusFilter,\n })}\n >\n <option value=\"all\">${t(\"cron.jobs.all\")}</option>\n <option value=\"ok\">${t(\"cron.runs.runStatusOk\")}</option>\n <option value=\"error\">${t(\"cron.runs.runStatusError\")}</option>\n <option value=\"skipped\">${t(\"cron.runs.runStatusSkipped\")}</option>\n </select>\n </label>\n <label class=\"field\">\n <span>${t(\"cron.jobs.sort\")}</span>\n <select\n .value=${props.jobsSortBy}\n @change=${(e: Event) =>\n props.onJobsFiltersChange({\n cronJobsSortBy: (e.target as HTMLSelectElement).value as CronJobsSortBy,\n })}\n >\n <option value=\"nextRunAtMs\">${t(\"cron.jobs.nextRun\")}</option>\n <option value=\"updatedAtMs\">${t(\"cron.jobs.recentlyUpdated\")}</option>\n <option value=\"name\">${t(\"cron.jobs.name\")}</option>\n </select>\n </label>\n <label class=\"field\">\n <span>${t(\"cron.jobs.direction\")}</span>\n <select\n .value=${props.jobsSortDir}\n @change=${(e: Event) =>\n props.onJobsFiltersChange({\n cronJobsSortDir: (e.target as HTMLSelectElement).value as CronSortDir,\n })}\n >\n <option value=\"asc\">${t(\"cron.jobs.ascending\")}</option>\n <option value=\"desc\">${t(\"cron.jobs.descending\")}</option>\n </select>\n </label>\n <label class=\"field\">\n <span>${t(\"cron.jobs.reset\")}</span>\n <button\n class=\"btn\"\n data-test-id=\"cron-jobs-filters-reset\"\n ?disabled=${!hasActiveJobsFilters}\n @click=${props.onJobsFiltersReset}\n >\n ${t(\"cron.jobs.reset\")}\n </button>\n </label>\n </div>\n ${props.jobs.length === 0\n ? html` <div class=\"muted\" style=\"margin-top: 12px\">${t(\"cron.jobs.noMatching\")}</div> `\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.jobs.map((job) => renderJob(job, props))}\n </div>\n `}\n ${props.jobsHasMore\n ? html`\n <div class=\"row\" style=\"margin-top: 12px\">\n <button\n class=\"btn\"\n ?disabled=${props.loading || props.jobsLoadingMore}\n @click=${props.onLoadMoreJobs}\n >\n ${props.jobsLoadingMore ? t(\"cron.jobs.loading\") : t(\"cron.jobs.loadMore\")}\n </button>\n </div>\n `\n : nothing}\n </section>\n\n <section class=\"card\">\n <div\n class=\"row\"\n style=\"justify-content: space-between; align-items: flex-start; gap: 12px;\"\n >\n <div>\n <div class=\"card-title\">${t(\"cron.runs.title\")}</div>\n <div class=\"card-sub\">\n ${props.runsScope === \"all\"\n ? t(\"cron.runs.subtitleAll\")\n : t(\"cron.runs.subtitleJob\", { title: selectedRunTitle })}\n </div>\n </div>\n <div class=\"muted\">\n ${t(\"cron.jobs.shownOf\", {\n shown: String(runs.length),\n total: String(props.runsTotal),\n })}\n </div>\n </div>\n <div class=\"cron-run-filters\">\n <div class=\"cron-run-filters__row cron-run-filters__row--primary\">\n <label class=\"field\">\n <span>${t(\"cron.runs.scope\")}</span>\n <select\n .value=${props.runsScope}\n @change=${(e: Event) =>\n props.onRunsFiltersChange({\n cronRunsScope: (e.target as HTMLSelectElement).value as CronRunScope,\n })}\n >\n <option value=\"all\">${t(\"cron.runs.allJobs\")}</option>\n <option value=\"job\" ?disabled=${props.runsJobId == null}>\n ${t(\"cron.runs.selectedJob\")}\n </option>\n </select>\n </label>\n <label class=\"field cron-run-filter-search\">\n <span>${t(\"cron.runs.searchRuns\")}</span>\n <input\n .value=${props.runsQuery}\n placeholder=${t(\"cron.runs.searchPlaceholder\")}\n @input=${(e: Event) =>\n props.onRunsFiltersChange({\n cronRunsQuery: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>${t(\"cron.jobs.sort\")}</span>\n <select\n .value=${props.runsSortDir}\n @change=${(e: Event) =>\n props.onRunsFiltersChange({\n cronRunsSortDir: (e.target as HTMLSelectElement).value as CronSortDir,\n })}\n >\n <option value=\"desc\">${t(\"cron.runs.newestFirst\")}</option>\n <option value=\"asc\">${t(\"cron.runs.oldestFirst\")}</option>\n </select>\n </label>\n </div>\n <div class=\"cron-run-filters__row cron-run-filters__row--secondary\">\n ${renderRunFilterDropdown({\n id: \"status\",\n title: t(\"cron.runs.status\"),\n summary: statusSummary,\n options: runStatusOptions,\n selected: props.runsStatuses,\n onToggle: (value, checked) => {\n const next = toggleSelection(\n props.runsStatuses,\n value as CronRunsStatusValue,\n checked,\n );\n void props.onRunsFiltersChange({ cronRunsStatuses: next });\n },\n onClear: () => {\n void props.onRunsFiltersChange({ cronRunsStatuses: [] });\n },\n })}\n ${renderRunFilterDropdown({\n id: \"delivery\",\n title: t(\"cron.runs.delivery\"),\n summary: deliverySummary,\n options: runDeliveryOptions,\n selected: props.runsDeliveryStatuses,\n onToggle: (value, checked) => {\n const next = toggleSelection(\n props.runsDeliveryStatuses,\n value as CronDeliveryStatus,\n checked,\n );\n void props.onRunsFiltersChange({ cronRunsDeliveryStatuses: next });\n },\n onClear: () => {\n void props.onRunsFiltersChange({ cronRunsDeliveryStatuses: [] });\n },\n })}\n </div>\n </div>\n ${props.runsScope === \"job\" && props.runsJobId == null\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px\">${t(\"cron.runs.selectJobHint\")}</div>\n `\n : runs.length === 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px\">${t(\"cron.runs.noMatching\")}</div>\n `\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${runs.map((entry) => renderRun(entry, props.basePath, props.onNavigateToChat))}\n </div>\n `}\n ${(props.runsScope === \"all\" || props.runsJobId != null) && props.runsHasMore\n ? html`\n <div class=\"row\" style=\"margin-top: 12px\">\n <button\n class=\"btn\"\n ?disabled=${props.runsLoadingMore}\n @click=${props.onLoadMoreRuns}\n >\n ${props.runsLoadingMore ? t(\"cron.jobs.loading\") : t(\"cron.runs.loadMore\")}\n </button>\n </div>\n `\n : nothing}\n </section>\n </div>\n\n <section class=\"card cron-workspace-form\">\n <div class=\"card-title\">${isEditing ? t(\"cron.form.editJob\") : t(\"cron.form.newJob\")}</div>\n <div class=\"card-sub\">\n ${isEditing ? t(\"cron.form.updateSubtitle\") : t(\"cron.form.createSubtitle\")}\n </div>\n <div class=\"cron-form\">\n <div class=\"cron-required-legend\">\n <span class=\"cron-required-marker\" aria-hidden=\"true\">*</span> ${t(\n \"cron.form.required\",\n )}\n </div>\n <section class=\"cron-form-section\">\n <div class=\"cron-form-section__title\">${t(\"cron.form.basics\")}</div>\n <div class=\"cron-form-section__sub\">${t(\"cron.form.basicsSub\")}</div>\n <div class=\"form-grid cron-form-grid\">\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.fieldName\"), true)}\n <input\n id=\"cron-name\"\n .value=${props.form.name}\n placeholder=${t(\"cron.form.namePlaceholder\")}\n aria-invalid=${props.fieldErrors.name ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.name ? errorIdForField(\"name\") : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({ name: (e.target as HTMLInputElement).value })}\n />\n ${renderFieldError(props.fieldErrors.name, errorIdForField(\"name\"))}\n </label>\n <label class=\"field\">\n <span>${t(\"cron.form.description\")}</span>\n <input\n .value=${props.form.description}\n placeholder=${t(\"cron.form.descriptionPlaceholder\")}\n @input=${(e: Event) =>\n props.onFormChange({ description: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.agentId\"))}\n <input\n id=\"cron-agent-id\"\n .value=${props.form.agentId}\n list=\"cron-agent-suggestions\"\n ?disabled=${props.form.clearAgent}\n @input=${(e: Event) =>\n props.onFormChange({ agentId: (e.target as HTMLInputElement).value })}\n placeholder=${t(\"cron.form.agentPlaceholder\")}\n />\n <div class=\"cron-help\">${t(\"cron.form.agentHelp\")}</div>\n </label>\n <label class=\"field checkbox cron-checkbox cron-checkbox-inline\">\n <input\n type=\"checkbox\"\n .checked=${props.form.enabled}\n @change=${(e: Event) =>\n props.onFormChange({ enabled: (e.target as HTMLInputElement).checked })}\n />\n <span class=\"field-checkbox__label\">${t(\"cron.summary.enabled\")}</span>\n </label>\n </div>\n </section>\n\n <section class=\"cron-form-section\">\n <div class=\"cron-form-section__title\">${t(\"cron.form.schedule\")}</div>\n <div class=\"cron-form-section__sub\">${t(\"cron.form.scheduleSub\")}</div>\n <div class=\"form-grid cron-form-grid\">\n <label class=\"field cron-span-2\">\n ${renderFieldLabel(t(\"cron.form.schedule\"))}\n <select\n id=\"cron-schedule-kind\"\n .value=${props.form.scheduleKind}\n @change=${(e: Event) =>\n props.onFormChange({\n scheduleKind: (e.target as HTMLSelectElement)\n .value as CronFormState[\"scheduleKind\"],\n })}\n >\n <option value=\"every\">${t(\"cron.form.every\")}</option>\n <option value=\"at\">${t(\"cron.form.at\")}</option>\n <option value=\"cron\">${t(\"cron.form.cronOption\")}</option>\n </select>\n </label>\n </div>\n ${renderScheduleFields(props)}\n </section>\n\n <section class=\"cron-form-section\">\n <div class=\"cron-form-section__title\">${t(\"cron.form.execution\")}</div>\n <div class=\"cron-form-section__sub\">${t(\"cron.form.executionSub\")}</div>\n <div class=\"form-grid cron-form-grid\">\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.session\"))}\n <select\n id=\"cron-session-target\"\n .value=${props.form.sessionTarget}\n @change=${(e: Event) =>\n props.onFormChange({\n sessionTarget: (e.target as HTMLSelectElement)\n .value as CronFormState[\"sessionTarget\"],\n })}\n >\n <option value=\"main\">${t(\"cron.form.main\")}</option>\n <option value=\"isolated\">${t(\"cron.form.isolated\")}</option>\n </select>\n <div class=\"cron-help\">${t(\"cron.form.sessionHelp\")}</div>\n </label>\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.wakeMode\"))}\n <select\n id=\"cron-wake-mode\"\n .value=${props.form.wakeMode}\n @change=${(e: Event) =>\n props.onFormChange({\n wakeMode: (e.target as HTMLSelectElement).value as CronFormState[\"wakeMode\"],\n })}\n >\n <option value=\"now\">${t(\"cron.form.now\")}</option>\n <option value=\"next-heartbeat\">${t(\"cron.form.nextHeartbeat\")}</option>\n </select>\n <div class=\"cron-help\">${t(\"cron.form.wakeModeHelp\")}</div>\n </label>\n <label class=\"field ${isAgentTurn ? \"\" : \"cron-span-2\"}\">\n ${renderFieldLabel(t(\"cron.form.payloadKind\"))}\n <select\n id=\"cron-payload-kind\"\n .value=${props.form.payloadKind}\n @change=${(e: Event) =>\n props.onFormChange({\n payloadKind: (e.target as HTMLSelectElement)\n .value as CronFormState[\"payloadKind\"],\n })}\n >\n <option value=\"systemEvent\">${t(\"cron.form.systemEvent\")}</option>\n <option value=\"agentTurn\">${t(\"cron.form.agentTurn\")}</option>\n </select>\n <div class=\"cron-help\">\n ${props.form.payloadKind === \"systemEvent\"\n ? t(\"cron.form.systemEventHelp\")\n : t(\"cron.form.agentTurnHelp\")}\n </div>\n </label>\n ${isAgentTurn\n ? html`\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.timeoutSeconds\"))}\n <input\n id=\"cron-timeout-seconds\"\n .value=${props.form.timeoutSeconds}\n placeholder=${t(\"cron.form.timeoutPlaceholder\")}\n aria-invalid=${props.fieldErrors.timeoutSeconds ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.timeoutSeconds\n ? errorIdForField(\"timeoutSeconds\")\n : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n timeoutSeconds: (e.target as HTMLInputElement).value,\n })}\n />\n <div class=\"cron-help\">${t(\"cron.form.timeoutHelp\")}</div>\n ${renderFieldError(\n props.fieldErrors.timeoutSeconds,\n errorIdForField(\"timeoutSeconds\"),\n )}\n </label>\n `\n : nothing}\n </div>\n <label class=\"field cron-span-2\">\n ${renderFieldLabel(\n props.form.payloadKind === \"systemEvent\"\n ? t(\"cron.form.mainTimelineMessage\")\n : t(\"cron.form.assistantTaskPrompt\"),\n true,\n )}\n <textarea\n id=\"cron-payload-text\"\n .value=${props.form.payloadText}\n aria-invalid=${props.fieldErrors.payloadText ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.payloadText ? errorIdForField(\"payloadText\") : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n payloadText: (e.target as HTMLTextAreaElement).value,\n })}\n rows=\"4\"\n ></textarea>\n ${renderFieldError(props.fieldErrors.payloadText, errorIdForField(\"payloadText\"))}\n </label>\n </section>\n\n <section class=\"cron-form-section\">\n <div class=\"cron-form-section__title\">${t(\"cron.form.deliverySection\")}</div>\n <div class=\"cron-form-section__sub\">${t(\"cron.form.deliverySub\")}</div>\n <div class=\"form-grid cron-form-grid\">\n <label class=\"field ${selectedDeliveryMode === \"none\" ? \"cron-span-2\" : \"\"}\">\n ${renderFieldLabel(t(\"cron.form.resultDelivery\"))}\n <select\n id=\"cron-delivery-mode\"\n .value=${selectedDeliveryMode}\n @change=${(e: Event) =>\n props.onFormChange({\n deliveryMode: (e.target as HTMLSelectElement)\n .value as CronFormState[\"deliveryMode\"],\n })}\n >\n ${supportsAnnounce\n ? html` <option value=\"announce\">${t(\"cron.form.announceDefault\")}</option> `\n : nothing}\n <option value=\"webhook\">${t(\"cron.form.webhookPost\")}</option>\n <option value=\"none\">${t(\"cron.form.noneInternal\")}</option>\n </select>\n <div class=\"cron-help\">${t(\"cron.form.deliveryHelp\")}</div>\n </label>\n ${selectedDeliveryMode !== \"none\"\n ? html`\n <label class=\"field ${selectedDeliveryMode === \"webhook\" ? \"cron-span-2\" : \"\"}\">\n ${renderFieldLabel(\n selectedDeliveryMode === \"webhook\"\n ? t(\"cron.form.webhookUrl\")\n : t(\"cron.form.channel\"),\n selectedDeliveryMode === \"webhook\",\n )}\n ${selectedDeliveryMode === \"webhook\"\n ? html`\n <input\n id=\"cron-delivery-to\"\n .value=${props.form.deliveryTo}\n list=\"cron-delivery-to-suggestions\"\n aria-invalid=${props.fieldErrors.deliveryTo ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.deliveryTo\n ? errorIdForField(\"deliveryTo\")\n : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n deliveryTo: (e.target as HTMLInputElement).value,\n })}\n placeholder=${t(\"cron.form.webhookPlaceholder\")}\n />\n `\n : html`\n <select\n id=\"cron-delivery-channel\"\n .value=${props.form.deliveryChannel || \"last\"}\n @change=${(e: Event) =>\n props.onFormChange({\n deliveryChannel: (e.target as HTMLSelectElement).value,\n })}\n >\n ${channelOptions.map(\n (channel) =>\n html`<option value=${channel}>\n ${resolveChannelLabel(props, channel)}\n </option>`,\n )}\n </select>\n `}\n ${selectedDeliveryMode === \"announce\"\n ? html` <div class=\"cron-help\">${t(\"cron.form.channelHelp\")}</div> `\n : html` <div class=\"cron-help\">${t(\"cron.form.webhookHelp\")}</div> `}\n </label>\n ${selectedDeliveryMode === \"announce\"\n ? html`\n <label class=\"field cron-span-2\">\n ${renderFieldLabel(t(\"cron.form.to\"))}\n <input\n id=\"cron-delivery-to\"\n .value=${props.form.deliveryTo}\n list=\"cron-delivery-to-suggestions\"\n @input=${(e: Event) =>\n props.onFormChange({\n deliveryTo: (e.target as HTMLInputElement).value,\n })}\n placeholder=${t(\"cron.form.toPlaceholder\")}\n />\n <div class=\"cron-help\">${t(\"cron.form.toHelp\")}</div>\n </label>\n `\n : nothing}\n ${selectedDeliveryMode === \"webhook\"\n ? renderFieldError(\n props.fieldErrors.deliveryTo,\n errorIdForField(\"deliveryTo\"),\n )\n : nothing}\n `\n : nothing}\n </div>\n </section>\n\n <details class=\"cron-advanced\">\n <summary class=\"cron-advanced__summary\">${t(\"cron.form.advanced\")}</summary>\n <div class=\"cron-help\">${t(\"cron.form.advancedHelp\")}</div>\n <div class=\"form-grid cron-form-grid\">\n <label class=\"field checkbox cron-checkbox\">\n <input\n type=\"checkbox\"\n .checked=${props.form.deleteAfterRun}\n @change=${(e: Event) =>\n props.onFormChange({\n deleteAfterRun: (e.target as HTMLInputElement).checked,\n })}\n />\n <span class=\"field-checkbox__label\">${t(\"cron.form.deleteAfterRun\")}</span>\n <div class=\"cron-help\">${t(\"cron.form.deleteAfterRunHelp\")}</div>\n </label>\n <label class=\"field checkbox cron-checkbox\">\n <input\n type=\"checkbox\"\n .checked=${props.form.clearAgent}\n @change=${(e: Event) =>\n props.onFormChange({\n clearAgent: (e.target as HTMLInputElement).checked,\n })}\n />\n <span class=\"field-checkbox__label\">${t(\"cron.form.clearAgentOverride\")}</span>\n <div class=\"cron-help\">${t(\"cron.form.clearAgentHelp\")}</div>\n </label>\n <label class=\"field cron-span-2\">\n ${renderFieldLabel(\"Session key\")}\n <input\n id=\"cron-session-key\"\n .value=${props.form.sessionKey}\n @input=${(e: Event) =>\n props.onFormChange({\n sessionKey: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"agent:main:main\"\n />\n <div class=\"cron-help\">Optional routing key for job delivery and wake routing.</div>\n </label>\n ${isCronSchedule\n ? html`\n <label class=\"field checkbox cron-checkbox cron-span-2\">\n <input\n type=\"checkbox\"\n .checked=${props.form.scheduleExact}\n @change=${(e: Event) =>\n props.onFormChange({\n scheduleExact: (e.target as HTMLInputElement).checked,\n })}\n />\n <span class=\"field-checkbox__label\">${t(\"cron.form.exactTiming\")}</span>\n <div class=\"cron-help\">${t(\"cron.form.exactTimingHelp\")}</div>\n </label>\n <div class=\"cron-stagger-group cron-span-2\">\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.staggerWindow\"))}\n <input\n id=\"cron-stagger-amount\"\n .value=${props.form.staggerAmount}\n ?disabled=${props.form.scheduleExact}\n aria-invalid=${props.fieldErrors.staggerAmount ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.staggerAmount\n ? errorIdForField(\"staggerAmount\")\n : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n staggerAmount: (e.target as HTMLInputElement).value,\n })}\n placeholder=${t(\"cron.form.staggerPlaceholder\")}\n />\n ${renderFieldError(\n props.fieldErrors.staggerAmount,\n errorIdForField(\"staggerAmount\"),\n )}\n </label>\n <label class=\"field\">\n <span>${t(\"cron.form.staggerUnit\")}</span>\n <select\n .value=${props.form.staggerUnit}\n ?disabled=${props.form.scheduleExact}\n @change=${(e: Event) =>\n props.onFormChange({\n staggerUnit: (e.target as HTMLSelectElement)\n .value as CronFormState[\"staggerUnit\"],\n })}\n >\n <option value=\"seconds\">${t(\"cron.form.seconds\")}</option>\n <option value=\"minutes\">${t(\"cron.form.minutes\")}</option>\n </select>\n </label>\n </div>\n `\n : nothing}\n ${isAgentTurn\n ? html`\n <label class=\"field cron-span-2\">\n ${renderFieldLabel(\"Account ID\")}\n <input\n id=\"cron-delivery-account-id\"\n .value=${props.form.deliveryAccountId}\n list=\"cron-delivery-account-suggestions\"\n ?disabled=${selectedDeliveryMode !== \"announce\"}\n @input=${(e: Event) =>\n props.onFormChange({\n deliveryAccountId: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"default\"\n />\n <div class=\"cron-help\">\n Optional channel account ID for multi-account setups.\n </div>\n </label>\n <label class=\"field checkbox cron-checkbox cron-span-2\">\n <input\n type=\"checkbox\"\n .checked=${props.form.payloadLightContext}\n @change=${(e: Event) =>\n props.onFormChange({\n payloadLightContext: (e.target as HTMLInputElement).checked,\n })}\n />\n <span class=\"field-checkbox__label\">Light context</span>\n <div class=\"cron-help\">\n Use lightweight bootstrap context for this agent job.\n </div>\n </label>\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.model\"))}\n <input\n id=\"cron-payload-model\"\n .value=${props.form.payloadModel}\n list=\"cron-model-suggestions\"\n @input=${(e: Event) =>\n props.onFormChange({\n payloadModel: (e.target as HTMLInputElement).value,\n })}\n placeholder=${t(\"cron.form.modelPlaceholder\")}\n />\n <div class=\"cron-help\">${t(\"cron.form.modelHelp\")}</div>\n </label>\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.thinking\"))}\n <input\n id=\"cron-payload-thinking\"\n .value=${props.form.payloadThinking}\n list=\"cron-thinking-suggestions\"\n @input=${(e: Event) =>\n props.onFormChange({\n payloadThinking: (e.target as HTMLInputElement).value,\n })}\n placeholder=${t(\"cron.form.thinkingPlaceholder\")}\n />\n <div class=\"cron-help\">${t(\"cron.form.thinkingHelp\")}</div>\n </label>\n `\n : nothing}\n ${isAgentTurn\n ? html`\n <label class=\"field cron-span-2\">\n ${renderFieldLabel(\"Failure alerts\")}\n <select\n .value=${props.form.failureAlertMode}\n @change=${(e: Event) =>\n props.onFormChange({\n failureAlertMode: (e.target as HTMLSelectElement)\n .value as CronFormState[\"failureAlertMode\"],\n })}\n >\n <option value=\"inherit\">Inherit global setting</option>\n <option value=\"disabled\">Disable for this job</option>\n <option value=\"custom\">Custom per-job settings</option>\n </select>\n <div class=\"cron-help\">\n Control when this job sends repeated-failure alerts.\n </div>\n </label>\n ${props.form.failureAlertMode === \"custom\"\n ? html`\n <label class=\"field\">\n ${renderFieldLabel(\"Alert after\")}\n <input\n id=\"cron-failure-alert-after\"\n .value=${props.form.failureAlertAfter}\n aria-invalid=${props.fieldErrors.failureAlertAfter ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.failureAlertAfter\n ? errorIdForField(\"failureAlertAfter\")\n : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n failureAlertAfter: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"2\"\n />\n <div class=\"cron-help\">Consecutive errors before alerting.</div>\n ${renderFieldError(\n props.fieldErrors.failureAlertAfter,\n errorIdForField(\"failureAlertAfter\"),\n )}\n </label>\n <label class=\"field\">\n ${renderFieldLabel(\"Cooldown (seconds)\")}\n <input\n id=\"cron-failure-alert-cooldown-seconds\"\n .value=${props.form.failureAlertCooldownSeconds}\n aria-invalid=${props.fieldErrors.failureAlertCooldownSeconds\n ? \"true\"\n : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.failureAlertCooldownSeconds\n ? errorIdForField(\"failureAlertCooldownSeconds\")\n : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n failureAlertCooldownSeconds: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"3600\"\n />\n <div class=\"cron-help\">Minimum seconds between alerts.</div>\n ${renderFieldError(\n props.fieldErrors.failureAlertCooldownSeconds,\n errorIdForField(\"failureAlertCooldownSeconds\"),\n )}\n </label>\n <label class=\"field\">\n ${renderFieldLabel(\"Alert channel\")}\n <select\n .value=${props.form.failureAlertChannel || \"last\"}\n @change=${(e: Event) =>\n props.onFormChange({\n failureAlertChannel: (e.target as HTMLSelectElement).value,\n })}\n >\n ${channelOptions.map(\n (channel) =>\n html`<option value=${channel}>\n ${resolveChannelLabel(props, channel)}\n </option>`,\n )}\n </select>\n </label>\n <label class=\"field\">\n ${renderFieldLabel(\"Alert to\")}\n <input\n .value=${props.form.failureAlertTo}\n list=\"cron-delivery-to-suggestions\"\n @input=${(e: Event) =>\n props.onFormChange({\n failureAlertTo: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"+1555... or chat id\"\n />\n <div class=\"cron-help\">\n Optional recipient override for failure alerts.\n </div>\n </label>\n <label class=\"field\">\n ${renderFieldLabel(\"Alert mode\")}\n <select\n .value=${props.form.failureAlertDeliveryMode || \"announce\"}\n @change=${(e: Event) =>\n props.onFormChange({\n failureAlertDeliveryMode: (e.target as HTMLSelectElement)\n .value as CronFormState[\"failureAlertDeliveryMode\"],\n })}\n >\n <option value=\"announce\">Announce (via channel)</option>\n <option value=\"webhook\">Webhook (HTTP POST)</option>\n </select>\n </label>\n <label class=\"field\">\n ${renderFieldLabel(\"Alert account ID\")}\n <input\n .value=${props.form.failureAlertAccountId}\n @input=${(e: Event) =>\n props.onFormChange({\n failureAlertAccountId: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"Account ID for multi-account setups\"\n />\n </label>\n `\n : nothing}\n `\n : nothing}\n ${selectedDeliveryMode !== \"none\"\n ? html`\n <label class=\"field checkbox cron-checkbox cron-span-2\">\n <input\n type=\"checkbox\"\n .checked=${props.form.deliveryBestEffort}\n @change=${(e: Event) =>\n props.onFormChange({\n deliveryBestEffort: (e.target as HTMLInputElement).checked,\n })}\n />\n <span class=\"field-checkbox__label\"\n >${t(\"cron.form.bestEffortDelivery\")}</span\n >\n <div class=\"cron-help\">${t(\"cron.form.bestEffortHelp\")}</div>\n </label>\n `\n : nothing}\n </div>\n </details>\n </div>\n ${blockedByValidation\n ? html`\n <div class=\"cron-form-status\" role=\"status\" aria-live=\"polite\">\n <div class=\"cron-form-status__title\">${t(\"cron.form.cantAddYet\")}</div>\n <div class=\"cron-help\">${t(\"cron.form.fillRequired\")}</div>\n <ul class=\"cron-form-status__list\">\n ${blockingFields.map(\n (field) => html`\n <li>\n <button\n type=\"button\"\n class=\"cron-form-status__link\"\n @click=${() => focusFormField(field.inputId)}\n >\n ${field.label}: ${t(field.message)}\n </button>\n </li>\n `,\n )}\n </ul>\n </div>\n `\n : nothing}\n <div class=\"row cron-form-actions\">\n <button\n class=\"btn primary\"\n ?disabled=${props.busy || !props.canSubmit}\n @click=${props.onAdd}\n >\n ${props.busy\n ? t(\"cron.form.saving\")\n : isEditing\n ? t(\"cron.form.saveChanges\")\n : t(\"cron.form.addJob\")}\n </button>\n ${submitDisabledReason\n ? html`<div class=\"cron-submit-reason\" aria-live=\"polite\">${submitDisabledReason}</div>`\n : nothing}\n ${isEditing\n ? html`\n <button class=\"btn\" ?disabled=${props.busy} @click=${props.onCancelEdit}>\n ${t(\"cron.form.cancel\")}\n </button>\n `\n : nothing}\n </div>\n </section>\n </section>\n\n ${renderSuggestionList(\"cron-agent-suggestions\", props.agentSuggestions)}\n ${renderSuggestionList(\"cron-model-suggestions\", props.modelSuggestions)}\n ${renderSuggestionList(\"cron-thinking-suggestions\", props.thinkingSuggestions)}\n ${renderSuggestionList(\"cron-tz-suggestions\", props.timezoneSuggestions)}\n ${renderSuggestionList(\"cron-delivery-to-suggestions\", props.deliveryToSuggestions)}\n ${renderSuggestionList(\"cron-delivery-account-suggestions\", props.accountSuggestions)}\n `;\n}\n\nfunction renderScheduleFields(props: CronProps) {\n const form = props.form;\n if (form.scheduleKind === \"at\") {\n return html`\n <label class=\"field cron-span-2\" style=\"margin-top: 12px;\">\n ${renderFieldLabel(t(\"cron.form.runAt\"), true)}\n <input\n id=\"cron-schedule-at\"\n type=\"datetime-local\"\n .value=${form.scheduleAt}\n aria-invalid=${props.fieldErrors.scheduleAt ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.scheduleAt ? errorIdForField(\"scheduleAt\") : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n scheduleAt: (e.target as HTMLInputElement).value,\n })}\n />\n ${renderFieldError(props.fieldErrors.scheduleAt, errorIdForField(\"scheduleAt\"))}\n </label>\n `;\n }\n if (form.scheduleKind === \"every\") {\n return html`\n <div class=\"form-grid cron-form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.every\"), true)}\n <input\n id=\"cron-every-amount\"\n .value=${form.everyAmount}\n aria-invalid=${props.fieldErrors.everyAmount ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.everyAmount ? errorIdForField(\"everyAmount\") : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({\n everyAmount: (e.target as HTMLInputElement).value,\n })}\n placeholder=${t(\"cron.form.everyAmountPlaceholder\")}\n />\n ${renderFieldError(props.fieldErrors.everyAmount, errorIdForField(\"everyAmount\"))}\n </label>\n <label class=\"field\">\n <span>${t(\"cron.form.unit\")}</span>\n <select\n .value=${form.everyUnit}\n @change=${(e: Event) =>\n props.onFormChange({\n everyUnit: (e.target as HTMLSelectElement).value as CronFormState[\"everyUnit\"],\n })}\n >\n <option value=\"minutes\">${t(\"cron.form.minutes\")}</option>\n <option value=\"hours\">${t(\"cron.form.hours\")}</option>\n <option value=\"days\">${t(\"cron.form.days\")}</option>\n </select>\n </label>\n </div>\n `;\n }\n return html`\n <div class=\"form-grid cron-form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n ${renderFieldLabel(t(\"cron.form.expression\"), true)}\n <input\n id=\"cron-cron-expr\"\n .value=${form.cronExpr}\n aria-invalid=${props.fieldErrors.cronExpr ? \"true\" : \"false\"}\n aria-describedby=${ifDefined(\n props.fieldErrors.cronExpr ? errorIdForField(\"cronExpr\") : undefined,\n )}\n @input=${(e: Event) =>\n props.onFormChange({ cronExpr: (e.target as HTMLInputElement).value })}\n placeholder=${t(\"cron.form.expressionPlaceholder\")}\n />\n ${renderFieldError(props.fieldErrors.cronExpr, errorIdForField(\"cronExpr\"))}\n </label>\n <label class=\"field\">\n <span>${t(\"cron.form.timezoneOptional\")}</span>\n <input\n .value=${form.cronTz}\n list=\"cron-tz-suggestions\"\n @input=${(e: Event) =>\n props.onFormChange({ cronTz: (e.target as HTMLInputElement).value })}\n placeholder=${t(\"cron.form.timezonePlaceholder\")}\n />\n <div class=\"cron-help\">${t(\"cron.form.timezoneHelp\")}</div>\n </label>\n <div class=\"cron-help cron-span-2\">${t(\"cron.form.jitterHelp\")}</div>\n </div>\n `;\n}\n\nfunction renderFieldError(message?: string, id?: string) {\n if (!message) {\n return nothing;\n }\n return html`<div id=${ifDefined(id)} class=\"cron-help cron-error\">${t(message)}</div>`;\n}\n\nfunction renderJob(job: CronJob, props: CronProps) {\n const isSelected = props.runsJobId === job.id;\n const itemClass = `list-item list-item-clickable cron-job${isSelected ? \" list-item-selected\" : \"\"}`;\n const selectAnd = (action: () => void) => {\n props.onLoadRuns(job.id);\n action();\n };\n return html`\n <div class=${itemClass} @click=${() => props.onLoadRuns(job.id)}>\n <div class=\"list-main\">\n <div class=\"list-title\">${job.name}</div>\n <div class=\"list-sub\">${formatCronSchedule(job)}</div>\n ${renderJobPayload(job)}\n ${job.agentId\n ? html`<div class=\"muted cron-job-agent\">\n ${t(\"cron.jobDetail.agent\")}: ${job.agentId}\n </div>`\n : nothing}\n </div>\n <div class=\"list-meta\">${renderJobState(job)}</div>\n <div class=\"cron-job-footer\">\n <div class=\"chip-row cron-job-chips\">\n <span class=${`chip ${job.enabled ? \"chip-ok\" : \"chip-danger\"}`}>\n ${job.enabled ? t(\"cron.jobList.enabled\") : t(\"cron.jobList.disabled\")}\n </span>\n <span class=\"chip\">${job.sessionTarget}</span>\n <span class=\"chip\">${job.wakeMode}</span>\n </div>\n <div class=\"row cron-job-actions\">\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n selectAnd(() => props.onEdit(job));\n }}\n >\n ${t(\"cron.jobList.edit\")}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n selectAnd(() => props.onClone(job));\n }}\n >\n ${t(\"cron.jobList.clone\")}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n selectAnd(() => props.onToggle(job, !job.enabled));\n }}\n >\n ${job.enabled ? t(\"cron.jobList.disable\") : t(\"cron.jobList.enable\")}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n selectAnd(() => props.onRun(job, \"force\"));\n }}\n >\n ${t(\"cron.jobList.run\")}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n selectAnd(() => props.onRun(job, \"due\"));\n }}\n >\n Run if due\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onLoadRuns(job.id);\n }}\n >\n ${t(\"cron.jobList.history\")}\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n selectAnd(() => props.onRemove(job));\n }}\n >\n ${t(\"cron.jobList.remove\")}\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderJobPayload(job: CronJob) {\n if (job.payload.kind === \"systemEvent\") {\n return html`<div class=\"cron-job-detail\">\n <span class=\"cron-job-detail-label\">${t(\"cron.jobDetail.system\")}</span>\n <span class=\"muted cron-job-detail-value\">${job.payload.text}</span>\n </div>`;\n }\n\n const delivery = job.delivery;\n const deliveryTarget =\n delivery?.mode === \"webhook\"\n ? delivery.to\n ? ` (${delivery.to})`\n : \"\"\n : delivery?.channel || delivery?.to\n ? ` (${delivery.channel ?? \"last\"}${delivery.to ? ` -> ${delivery.to}` : \"\"})`\n : \"\";\n\n return html`\n <div class=\"cron-job-detail\">\n <span class=\"cron-job-detail-label\">${t(\"cron.jobDetail.prompt\")}</span>\n <span class=\"muted cron-job-detail-value\">${job.payload.message}</span>\n </div>\n ${delivery\n ? html`<div class=\"cron-job-detail\">\n <span class=\"cron-job-detail-label\">${t(\"cron.jobDetail.delivery\")}</span>\n <span class=\"muted cron-job-detail-value\">${delivery.mode}${deliveryTarget}</span>\n </div>`\n : nothing}\n `;\n}\n\nfunction formatStateRelative(ms?: number) {\n if (typeof ms !== \"number\" || !Number.isFinite(ms)) {\n return t(\"common.na\");\n }\n return formatRelativeTimestamp(ms);\n}\n\nfunction formatRunNextLabel(nextRunAtMs: number, nowMs = Date.now()) {\n const rel = formatRelativeTimestamp(nextRunAtMs);\n return nextRunAtMs > nowMs ? t(\"cron.runEntry.next\", { rel }) : t(\"cron.runEntry.due\", { rel });\n}\n\nfunction renderJobState(job: CronJob) {\n const rawStatus = job.state?.lastStatus;\n const statusClass =\n rawStatus === \"ok\"\n ? \"cron-job-status-ok\"\n : rawStatus === \"error\"\n ? \"cron-job-status-error\"\n : rawStatus === \"skipped\"\n ? \"cron-job-status-skipped\"\n : \"cron-job-status-na\";\n const statusLabel =\n rawStatus === \"ok\"\n ? t(\"cron.runs.runStatusOk\")\n : rawStatus === \"error\"\n ? t(\"cron.runs.runStatusError\")\n : rawStatus === \"skipped\"\n ? t(\"cron.runs.runStatusSkipped\")\n : t(\"common.na\");\n const nextRunAtMs = job.state?.nextRunAtMs;\n const lastRunAtMs = job.state?.lastRunAtMs;\n\n return html`\n <div class=\"cron-job-state\">\n <div class=\"cron-job-state-row\">\n <span class=\"cron-job-state-key\">${t(\"cron.jobState.status\")}</span>\n <span class=${`cron-job-status-pill ${statusClass}`}>${statusLabel}</span>\n </div>\n <div class=\"cron-job-state-row\">\n <span class=\"cron-job-state-key\">${t(\"cron.jobState.next\")}</span>\n <span class=\"cron-job-state-value\" title=${formatMs(nextRunAtMs)}>\n ${formatStateRelative(nextRunAtMs)}\n </span>\n </div>\n <div class=\"cron-job-state-row\">\n <span class=\"cron-job-state-key\">${t(\"cron.jobState.last\")}</span>\n <span class=\"cron-job-state-value\" title=${formatMs(lastRunAtMs)}>\n ${formatStateRelative(lastRunAtMs)}\n </span>\n </div>\n </div>\n `;\n}\n\nfunction runStatusLabel(value: string): string {\n switch (value) {\n case \"ok\":\n return t(\"cron.runs.runStatusOk\");\n case \"error\":\n return t(\"cron.runs.runStatusError\");\n case \"skipped\":\n return t(\"cron.runs.runStatusSkipped\");\n default:\n return t(\"cron.runs.runStatusUnknown\");\n }\n}\n\nfunction runDeliveryLabel(value: string): string {\n switch (value) {\n case \"delivered\":\n return t(\"cron.runs.deliveryDelivered\");\n case \"not-delivered\":\n return t(\"cron.runs.deliveryNotDelivered\");\n case \"not-requested\":\n return t(\"cron.runs.deliveryNotRequested\");\n case \"unknown\":\n return t(\"cron.runs.deliveryUnknown\");\n default:\n return t(\"cron.runs.deliveryUnknown\");\n }\n}\n\nfunction renderRun(\n entry: CronRunLogEntry,\n basePath: string,\n onNavigateToChat?: (sessionKey: string) => void,\n) {\n const chatUrl =\n typeof entry.sessionKey === \"string\" && entry.sessionKey.trim().length > 0\n ? `${pathForTab(\"chat\", basePath)}?session=${encodeURIComponent(entry.sessionKey)}`\n : null;\n const status = runStatusLabel(entry.status ?? \"unknown\");\n const delivery = runDeliveryLabel(entry.deliveryStatus ?? \"not-requested\");\n const usage = entry.usage;\n const usageSummary =\n usage && typeof usage.total_tokens === \"number\"\n ? `${usage.total_tokens} tokens`\n : usage && typeof usage.input_tokens === \"number\" && typeof usage.output_tokens === \"number\"\n ? `${usage.input_tokens} in / ${usage.output_tokens} out`\n : null;\n return html`\n <div class=\"list-item cron-run-entry\">\n <div class=\"list-main cron-run-entry__main\">\n <div class=\"list-title cron-run-entry__title\">\n ${entry.jobName ?? entry.jobId}\n <span class=\"muted\"> · ${status}</span>\n </div>\n <div class=\"list-sub cron-run-entry__summary\">\n ${entry.summary ?? entry.error ?? t(\"cron.runEntry.noSummary\")}\n </div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${delivery}</span>\n ${entry.model ? html`<span class=\"chip\">${entry.model}</span>` : nothing}\n ${entry.provider ? html`<span class=\"chip\">${entry.provider}</span>` : nothing}\n ${usageSummary ? html`<span class=\"chip\">${usageSummary}</span>` : nothing}\n </div>\n </div>\n <div class=\"list-meta cron-run-entry__meta\">\n <div>${formatMs(entry.ts)}</div>\n ${typeof entry.runAtMs === \"number\"\n ? html`<div class=\"muted\">${t(\"cron.runEntry.runAt\")} ${formatMs(entry.runAtMs)}</div>`\n : nothing}\n <div class=\"muted\">${entry.durationMs ?? 0}ms</div>\n ${typeof entry.nextRunAtMs === \"number\"\n ? html`<div class=\"muted\">${formatRunNextLabel(entry.nextRunAtMs)}</div>`\n : nothing}\n ${chatUrl\n ? html`<div>\n <a\n class=\"session-link\"\n href=${chatUrl}\n @click=${(e: MouseEvent) => {\n if (\n e.defaultPrevented ||\n e.button !== 0 ||\n e.metaKey ||\n e.ctrlKey ||\n e.shiftKey ||\n e.altKey\n ) {\n return;\n }\n if (onNavigateToChat && entry.sessionKey) {\n e.preventDefault();\n onNavigateToChat(entry.sessionKey);\n }\n }}\n >${t(\"cron.runEntry.openRunChat\")}</a\n >\n </div>`\n : nothing}\n ${entry.error ? html`<div class=\"muted\">${entry.error}</div>` : nothing}\n ${entry.deliveryError ? html`<div class=\"muted\">${entry.deliveryError}</div>` : nothing}\n </div>\n </div>\n `;\n}\n"],"x_google_ignoreList":[0],"mappings":"0JAKG,IAAM,EAAE,GAAG,GAAGA,EC2FjB,SAAS,GAA4E,CACnF,MAAO,CACL,CAAE,MAAO,KAAM,MAAO,EAAE,wBAAwB,CAAE,CAClD,CAAE,MAAO,QAAS,MAAO,EAAE,2BAA2B,CAAE,CACxD,CAAE,MAAO,UAAW,MAAO,EAAE,6BAA6B,CAAE,CAC7D,CAGH,SAAS,GAA6E,CACpF,MAAO,CACL,CAAE,MAAO,YAAa,MAAO,EAAE,8BAA8B,CAAE,CAC/D,CAAE,MAAO,gBAAiB,MAAO,EAAE,iCAAiC,CAAE,CACtE,CAAE,MAAO,UAAW,MAAO,EAAE,4BAA4B,CAAE,CAC3D,CAAE,MAAO,gBAAiB,MAAO,EAAE,iCAAiC,CAAE,CACvE,CAGH,SAAS,EAAkC,EAAe,EAAU,EAAuB,CACzF,IAAM,EAAM,IAAI,IAAI,EAAS,CAM7B,OALI,EACF,EAAI,IAAI,EAAM,CAEd,EAAI,OAAO,EAAM,CAEZ,MAAM,KAAK,EAAI,CAGxB,SAAS,EAAmB,EAA0B,EAAkB,CAOtE,OANI,EAAe,SAAW,EACrB,EAEL,EAAe,QAAU,EACpB,EAAe,KAAK,KAAK,CAE3B,GAAG,EAAe,GAAG,IAAI,EAAe,OAAS,IAG1D,SAAS,EAAoB,EAA4B,CACvD,IAAM,EAAU,CAAC,OAAQ,GAAG,EAAM,SAAS,OAAO,QAAQ,CAAC,CACrD,EAAU,EAAM,KAAK,iBAAiB,MAAM,CAC9C,GAAW,CAAC,EAAQ,SAAS,EAAQ,EACvC,EAAQ,KAAK,EAAQ,CAEvB,IAAM,EAAO,IAAI,IACjB,OAAO,EAAQ,OAAQ,GACjB,EAAK,IAAI,EAAM,CACV,IAET,EAAK,IAAI,EAAM,CACR,IACP,CAGJ,SAAS,EAAoB,EAAkB,EAAyB,CACtE,GAAI,IAAY,OACd,MAAO,OAET,IAAM,EAAO,EAAM,aAAa,KAAM,GAAU,EAAM,KAAO,EAAQ,CAIrE,OAHI,GAAM,MACD,EAAK,MAEP,EAAM,gBAAgB,IAAY,EAG3C,SAAS,EAAwB,EAQ9B,CACD,MAAO,EAAI;0DAC6C,EAAO,GAAG;cACtD,EAAO,MAAM;;;kBAGT,EAAO,QAAQ;;;;cAInB,EAAO,QAAQ,IACd,GAAW,CAAI;;;;4BAIF,EAAO,MAAM;+BACV,EAAO,SAAS,SAAS,EAAO,MAAM,CAAC;8BACvC,GAAiB,CAC1B,IAAM,EAAS,EAAM,OACrB,EAAO,SAAS,EAAO,MAAO,EAAO,QAAQ,EAC7C;;0BAEI,EAAO,MAAM;;gBAG1B,CAAC;;;uDAGyC,EAAO,QAAQ;gBACtD,EAAE,kBAAkB,CAAC;;;;;;IASrC,SAAS,EAAqB,EAAY,EAAmB,CAC3D,IAAM,EAAQ,MAAM,KAAK,IAAI,IAAI,EAAQ,IAAK,GAAW,EAAO,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAIzF,OAHI,EAAM,SAAW,EACZ,EAEF,CAAI,gBAAgB,EAAG;MAC1B,EAAM,IAAK,GAAU,CAAI,iBAAiB,EAAM,aAAa,CAAC;eAWpE,SAAS,EAAgB,EAAmB,CAC1C,MAAO,cAAc,IAGvB,SAAS,EAAgB,EAAmB,CAkC1C,OAjCI,IAAQ,OACH,YAEL,IAAQ,aACH,mBAEL,IAAQ,cACH,oBAEL,IAAQ,WACH,iBAEL,IAAQ,gBACH,sBAEL,IAAQ,cACH,oBAEL,IAAQ,eACH,qBAEL,IAAQ,kBACH,wBAEL,IAAQ,iBACH,uBAEL,IAAQ,oBACH,2BAEL,IAAQ,8BACH,sCAEF,mBAGT,SAAS,EACP,EACA,EACA,EACA,CAuBA,OAtBI,IAAQ,cACH,EAAK,cAAgB,cACxB,EAAE,gCAAgC,CAClC,EAAE,gCAAgC,CAEpC,IAAQ,aAC0B,EAA7B,IAAiB,UAAc,uBAA4B,eAAe,CAEtC,CAC3C,KAAM,EAAE,sBAAsB,CAC9B,WAAY,EAAE,kBAAkB,CAChC,YAAa,EAAE,kBAAkB,CACjC,SAAU,EAAE,uBAAuB,CACnC,cAAe,EAAE,0BAA0B,CAC3C,YAAa,EAAE,gCAAgC,CAC/C,aAAc,EAAE,kBAAkB,CAClC,gBAAiB,EAAE,qBAAqB,CACxC,eAAgB,EAAE,2BAA2B,CAC7C,WAAY,EAAE,eAAe,CAC7B,kBAAmB,sBACnB,4BAA6B,yBAC9B,CACa,GAGhB,SAAS,EACP,EACA,EACA,EACiB,CACjB,IAAM,EAA8B,CAClC,OACA,aACA,cACA,WACA,gBACA,cACA,eACA,kBACA,iBACA,aACA,oBACA,8BACD,CACK,EAA0B,EAAE,CAClC,IAAK,IAAM,KAAO,EAAa,CAC7B,IAAM,EAAU,EAAO,GAClB,GAGL,EAAO,KAAK,CACV,MACA,MAAO,EAAiB,EAAK,EAAM,EAAa,CAChD,UACA,QAAS,EAAgB,EAAI,CAC9B,CAAC,CAEJ,OAAO,EAGT,SAAS,EAAe,EAAY,CAClC,IAAM,EAAK,SAAS,eAAe,EAAG,CAChC,aAAc,cAGhB,OAAO,EAAG,gBAAmB,YAC/B,EAAG,eAAe,CAAE,MAAO,SAAU,SAAU,SAAU,CAAC,CAE5D,EAAG,OAAO,EAGZ,SAAS,EAAiB,EAAc,EAAW,GAAO,CACxD,MAAO,EAAI;MACP,EAAK;MACL,EACE,CAAI;;2CAE+B,EAAE,uBAAuB,CAAC;UAE7D,EAAQ;WAIhB,SAAgB,EAAW,EAAkB,CAC3C,IAAM,EAAY,EAAQ,EAAM,aAC1B,EAAc,EAAM,KAAK,cAAgB,YACzC,EAAiB,EAAM,KAAK,eAAiB,OAC7C,EAAiB,EAAoB,EAAM,CAC3C,EACJ,EAAM,WAAa,KAAO,IAAA,GAAY,EAAM,KAAK,KAAM,GAAQ,EAAI,KAAO,EAAM,UAAU,CACtF,EACJ,EAAM,YAAc,MAChB,EAAE,uBAAuB,CACxB,GAAa,MAAQ,EAAM,WAAa,EAAE,yBAAyB,CACpE,EAAO,EAAM,KAAK,UAAU,EAAG,IACnC,EAAM,cAAgB,MAAQ,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GACtD,CACK,EAAmB,GAAqB,CACxC,EAAqB,GAAuB,CAC5C,EAAuB,EAC1B,OAAQ,GAAW,EAAM,aAAa,SAAS,EAAO,MAAM,CAAC,CAC7D,IAAK,GAAW,EAAO,MAAM,CAC1B,EAAyB,EAC5B,OAAQ,GAAW,EAAM,qBAAqB,SAAS,EAAO,MAAM,CAAC,CACrE,IAAK,GAAW,EAAO,MAAM,CAC1B,EAAgB,EAAmB,EAAsB,EAAE,wBAAwB,CAAC,CACpF,EAAkB,EAAmB,EAAwB,EAAE,wBAAwB,CAAC,CACxF,EACJ,EAAM,KAAK,gBAAkB,QAAU,EAAM,KAAK,cAAgB,YAC9D,EACJ,EAAM,KAAK,eAAiB,YAAc,CAAC,EAAmB,OAAS,EAAM,KAAK,aAC9E,EAAiB,EAAsB,EAAM,YAAa,EAAM,KAAM,EAAqB,CAC3F,EAAsB,CAAC,EAAM,MAAQ,EAAe,OAAS,EAC7D,EACJ,EAAM,UAAU,MAAM,CAAC,OAAS,GAChC,EAAM,oBAAsB,OAC5B,EAAM,yBAA2B,OACjC,EAAM,uBAAyB,OAC/B,EAAM,aAAe,eACrB,EAAM,cAAgB,MAClB,EACJ,GAAuB,CAAC,EAAM,UAC1B,EAAe,SAAW,EACxB,EAAE,sBAAuB,CAAE,MAAO,OAAO,EAAe,OAAO,CAAE,CAAC,CAClE,EAAE,4BAA6B,CAAE,MAAO,OAAO,EAAe,OAAO,CAAE,CAAC,CAC1E,GACN,MAAO,EAAI;;;;4CAI+B,EAAE,uBAAuB,CAAC;;0BAE5C,QAAQ,EAAM,QAAQ,QAAU,UAAY,gBAAgB;gBACtE,EAAM,OACJ,EAAM,OAAO,QACX,EAAE,mBAAmB,CACrB,EAAE,kBAAkB,CACtB,EAAE,YAAY,CAAC;;;;;4CAKW,EAAE,oBAAoB,CAAC;4CACvB,EAAM,QAAQ,MAAQ,EAAE,YAAY,CAAC;;;4CAGrC,EAAE,wBAAwB,CAAC;4CAC3B,EAAc,EAAM,QAAQ,cAAgB,KAAK,CAAC;;;;wCAItD,EAAM,QAAQ,UAAU,EAAM,UAAU;YACpE,EAAM,QAAU,EAAE,0BAA0B,CAAG,EAAE,uBAAuB,CAAC;;UAE3E,EAAM,MAAQ,CAAI,uBAAuB,EAAM,MAAM,SAAW,EAAQ;;;;;;;;;;;;wCAY1C,EAAE,kBAAkB,CAAC;sCACvB,EAAE,qBAAqB,CAAC;;;gBAG9C,EAAE,oBAAqB,CACvB,MAAO,OAAO,EAAM,KAAK,OAAO,CAChC,MAAO,OAAO,EAAM,UAAU,CAC/B,CAAC,CAAC;;;;;sBAKK,EAAE,uBAAuB,CAAC;;yBAEvB,EAAM,UAAU;8BACX,EAAE,8BAA8B,CAAC;yBACrC,GACR,EAAM,oBAAoB,CACxB,cAAgB,EAAE,OAA4B,MAC/C,CAAC,CAAC;;;;sBAIC,EAAE,oBAAoB,CAAC;;yBAEpB,EAAM,kBAAkB;0BACtB,GACT,EAAM,oBAAoB,CACxB,sBAAwB,EAAE,OACvB,MACJ,CAAC,CAAC;;sCAEiB,EAAE,gBAAgB,CAAC;0CACf,EAAE,iBAAiB,CAAC;2CACnB,EAAE,kBAAkB,CAAC;;;;sBAI1C,EAAE,qBAAqB,CAAC;;;yBAGrB,EAAM,uBAAuB;0BAC3B,GACT,EAAM,oBAAoB,CACxB,2BAA6B,EAAE,OAC5B,MACJ,CAAC,CAAC;;sCAEiB,EAAE,gBAAgB,CAAC;qCACpB,EAAE,eAAe,CAAC;wCACf,EAAE,kBAAkB,CAAC;uCACtB,EAAE,uBAAuB,CAAC;;;;sBAI3C,EAAE,oBAAoB,CAAC;;;yBAGpB,EAAM,qBAAqB;0BACzB,GACT,EAAM,oBAAoB,CACxB,yBAA2B,EAAE,OAC1B,MACJ,CAAC,CAAC;;sCAEiB,EAAE,gBAAgB,CAAC;qCACpB,EAAE,wBAAwB,CAAC;wCACxB,EAAE,2BAA2B,CAAC;0CAC5B,EAAE,6BAA6B,CAAC;;;;sBAIpD,EAAE,iBAAiB,CAAC;;yBAEjB,EAAM,WAAW;0BACf,GACT,EAAM,oBAAoB,CACxB,eAAiB,EAAE,OAA6B,MACjD,CAAC,CAAC;;8CAEyB,EAAE,oBAAoB,CAAC;8CACvB,EAAE,4BAA4B,CAAC;uCACtC,EAAE,iBAAiB,CAAC;;;;sBAIrC,EAAE,sBAAsB,CAAC;;yBAEtB,EAAM,YAAY;0BAChB,GACT,EAAM,oBAAoB,CACxB,gBAAkB,EAAE,OAA6B,MAClD,CAAC,CAAC;;sCAEiB,EAAE,sBAAsB,CAAC;uCACxB,EAAE,uBAAuB,CAAC;;;;sBAI3C,EAAE,kBAAkB,CAAC;;;;4BAIf,CAAC,EAAqB;yBACzB,EAAM,mBAAmB;;kBAEhC,EAAE,kBAAkB,CAAC;;;;YAI3B,EAAM,KAAK,SAAW,EACpB,CAAI,gDAAgD,EAAE,uBAAuB,CAAC,SAC9E,CAAI;;oBAEE,EAAM,KAAK,IAAK,GAAQ,EAAU,EAAK,EAAM,CAAC,CAAC;;gBAEnD;YACJ,EAAM,YACJ,CAAI;;;;gCAIc,EAAM,SAAW,EAAM,gBAAgB;6BAC1C,EAAM,eAAe;;sBAE5B,EAAM,gBAAkB,EAAE,oBAAoB,CAAG,EAAE,qBAAqB,CAAC;;;gBAIjF,EAAQ;;;;;;;;;wCASkB,EAAE,kBAAkB,CAAC;;kBAE3C,EAAM,YAAc,MAClB,EAAE,wBAAwB,CAC1B,EAAE,wBAAyB,CAAE,MAAO,EAAkB,CAAC,CAAC;;;;gBAI5D,EAAE,oBAAqB,CACvB,MAAO,OAAO,EAAK,OAAO,CAC1B,MAAO,OAAO,EAAM,UAAU,CAC/B,CAAC,CAAC;;;;;;wBAMO,EAAE,kBAAkB,CAAC;;2BAElB,EAAM,UAAU;4BACd,GACT,EAAM,oBAAoB,CACxB,cAAgB,EAAE,OAA6B,MAChD,CAAC,CAAC;;wCAEiB,EAAE,oBAAoB,CAAC;kDACb,EAAM,WAAa,KAAK;sBACpD,EAAE,wBAAwB,CAAC;;;;;wBAKzB,EAAE,uBAAuB,CAAC;;2BAEvB,EAAM,UAAU;gCACX,EAAE,8BAA8B,CAAC;2BACrC,GACR,EAAM,oBAAoB,CACxB,cAAgB,EAAE,OAA4B,MAC/C,CAAC,CAAC;;;;wBAIC,EAAE,iBAAiB,CAAC;;2BAEjB,EAAM,YAAY;4BAChB,GACT,EAAM,oBAAoB,CACxB,gBAAkB,EAAE,OAA6B,MAClD,CAAC,CAAC;;yCAEkB,EAAE,wBAAwB,CAAC;wCAC5B,EAAE,wBAAwB,CAAC;;;;;gBAKnD,EAAwB,CACxB,GAAI,SACJ,MAAO,EAAE,mBAAmB,CAC5B,QAAS,EACT,QAAS,EACT,SAAU,EAAM,aAChB,UAAW,EAAO,IAAY,CAC5B,IAAM,EAAO,EACX,EAAM,aACN,EACA,EACD,CACI,EAAM,oBAAoB,CAAE,iBAAkB,EAAM,CAAC,EAE5D,YAAe,CACR,EAAM,oBAAoB,CAAE,iBAAkB,EAAE,CAAE,CAAC,EAE3D,CAAC,CAAC;gBACD,EAAwB,CACxB,GAAI,WACJ,MAAO,EAAE,qBAAqB,CAC9B,QAAS,EACT,QAAS,EACT,SAAU,EAAM,qBAChB,UAAW,EAAO,IAAY,CAC5B,IAAM,EAAO,EACX,EAAM,qBACN,EACA,EACD,CACI,EAAM,oBAAoB,CAAE,yBAA0B,EAAM,CAAC,EAEpE,YAAe,CACR,EAAM,oBAAoB,CAAE,yBAA0B,EAAE,CAAE,CAAC,EAEnE,CAAC,CAAC;;;YAGL,EAAM,YAAc,OAAS,EAAM,WAAa,KAC9C,CAAI;8DAC4C,EAAE,0BAA0B,CAAC;gBAE7E,EAAK,SAAW,EACd,CAAI;gEAC4C,EAAE,uBAAuB,CAAC;kBAE1E,CAAI;;sBAEE,EAAK,IAAK,GAAU,EAAU,EAAO,EAAM,SAAU,EAAM,iBAAiB,CAAC,CAAC;;kBAElF;aACL,EAAM,YAAc,OAAS,EAAM,WAAa,OAAS,EAAM,YAC9D,CAAI;;;;gCAIc,EAAM,gBAAgB;6BACzB,EAAM,eAAe;;sBAE5B,EAAM,gBAAkB,EAAE,oBAAoB,CAAG,EAAE,qBAAqB,CAAC;;;gBAIjF,EAAQ;;;;;kCAKwB,EAAZ,EAAc,oBAAyB,mBAAmB,CAAC;;YAErE,EAAZ,EAAc,2BAAgC,2BAA2B,CAAC;;;;6EAIT,EAC/D,qBACD,CAAC;;;oDAGsC,EAAE,mBAAmB,CAAC;kDACxB,EAAE,sBAAsB,CAAC;;;kBAGzD,EAAiB,EAAE,sBAAsB,CAAE,GAAK,CAAC;;;2BAGxC,EAAM,KAAK,KAAK;gCACX,EAAE,4BAA4B,CAAC;iCAC9B,EAAM,YAAY,KAAO,OAAS,QAAQ;qCACtC,EACjB,EAAM,YAAY,KAAO,EAAgB,OAAO,CAAG,IAAA,GACpD,CAAC;2BACQ,GACR,EAAM,aAAa,CAAE,KAAO,EAAE,OAA4B,MAAO,CAAC,CAAC;;kBAErE,EAAiB,EAAM,YAAY,KAAM,EAAgB,OAAO,CAAC,CAAC;;;wBAG5D,EAAE,wBAAwB,CAAC;;2BAExB,EAAM,KAAK,YAAY;gCAClB,EAAE,mCAAmC,CAAC;2BAC1C,GACR,EAAM,aAAa,CAAE,YAAc,EAAE,OAA4B,MAAO,CAAC,CAAC;;;;kBAI5E,EAAiB,EAAE,oBAAoB,CAAC,CAAC;;;2BAGhC,EAAM,KAAK,QAAQ;;8BAEhB,EAAM,KAAK,WAAW;2BACxB,GACR,EAAM,aAAa,CAAE,QAAU,EAAE,OAA4B,MAAO,CAAC,CAAC;gCAC1D,EAAE,6BAA6B,CAAC;;yCAEvB,EAAE,sBAAsB,CAAC;;;;;6BAKrC,EAAM,KAAK,QAAQ;4BACnB,GACT,EAAM,aAAa,CAAE,QAAU,EAAE,OAA4B,QAAS,CAAC,CAAC;;sDAEtC,EAAE,uBAAuB,CAAC;;;;;;oDAM5B,EAAE,qBAAqB,CAAC;kDAC1B,EAAE,wBAAwB,CAAC;;;kBAG3D,EAAiB,EAAE,qBAAqB,CAAC,CAAC;;;2BAGjC,EAAM,KAAK,aAAa;4BACtB,GACT,EAAM,aAAa,CACjB,aAAe,EAAE,OACd,MACJ,CAAC,CAAC;;0CAEmB,EAAE,kBAAkB,CAAC;uCACxB,EAAE,eAAe,CAAC;yCAChB,EAAE,uBAAuB,CAAC;;;;cAIrD,EAAqB,EAAM,CAAC;;;;oDAIU,EAAE,sBAAsB,CAAC;kDAC3B,EAAE,yBAAyB,CAAC;;;kBAG5D,EAAiB,EAAE,oBAAoB,CAAC,CAAC;;;2BAGhC,EAAM,KAAK,cAAc;4BACvB,GACT,EAAM,aAAa,CACjB,cAAgB,EAAE,OACf,MACJ,CAAC,CAAC;;yCAEkB,EAAE,iBAAiB,CAAC;6CAChB,EAAE,qBAAqB,CAAC;;yCAE5B,EAAE,wBAAwB,CAAC;;;kBAGlD,EAAiB,EAAE,qBAAqB,CAAC,CAAC;;;2BAGjC,EAAM,KAAK,SAAS;4BAClB,GACT,EAAM,aAAa,CACjB,SAAW,EAAE,OAA6B,MAC3C,CAAC,CAAC;;wCAEiB,EAAE,gBAAgB,CAAC;mDACR,EAAE,0BAA0B,CAAC;;yCAEvC,EAAE,yBAAyB,CAAC;;oCAEjC,EAAc,GAAK,cAAc;kBACnD,EAAiB,EAAE,wBAAwB,CAAC,CAAC;;;2BAGpC,EAAM,KAAK,YAAY;4BACrB,GACT,EAAM,aAAa,CACjB,YAAc,EAAE,OACb,MACJ,CAAC,CAAC;;gDAEyB,EAAE,wBAAwB,CAAC;8CAC7B,EAAE,sBAAsB,CAAC;;;oBAGnD,EAAM,KAAK,cAAgB,cACzB,EAAE,4BAA4B,CAC9B,EAAE,0BAA0B,CAAC;;;gBAGnC,EACE,CAAI;;wBAEE,EAAiB,EAAE,2BAA2B,CAAC,CAAC;;;iCAGvC,EAAM,KAAK,eAAe;sCACrB,EAAE,+BAA+B,CAAC;uCACjC,EAAM,YAAY,eAAiB,OAAS,QAAQ;2CAChD,EACjB,EAAM,YAAY,eACd,EAAgB,iBAAiB,CACjC,IAAA,GACL,CAAC;iCACQ,GACR,EAAM,aAAa,CACjB,eAAiB,EAAE,OAA4B,MAChD,CAAC,CAAC;;+CAEkB,EAAE,wBAAwB,CAAC;wBAClD,EACA,EAAM,YAAY,eAClB,EAAgB,iBAAiB,CAClC,CAAC;;oBAGN,EAAQ;;;gBAGV,EACA,EAAM,KAAK,cAAgB,cACvB,EAAE,gCAAgC,CAClC,EAAE,gCAAgC,CACtC,GACD,CAAC;;;yBAGS,EAAM,KAAK,YAAY;+BACjB,EAAM,YAAY,YAAc,OAAS,QAAQ;mCAC7C,EACjB,EAAM,YAAY,YAAc,EAAgB,cAAc,CAAG,IAAA,GAClE,CAAC;yBACQ,GACR,EAAM,aAAa,CACjB,YAAc,EAAE,OAA+B,MAChD,CAAC,CAAC;;;gBAGL,EAAiB,EAAM,YAAY,YAAa,EAAgB,cAAc,CAAC,CAAC;;;;;oDAK5C,EAAE,4BAA4B,CAAC;kDACjC,EAAE,wBAAwB,CAAC;;oCAEzC,IAAyB,OAAS,cAAgB,GAAG;kBACvE,EAAiB,EAAE,2BAA2B,CAAC,CAAC;;;2BAGvC,EAAqB;4BACnB,GACT,EAAM,aAAa,CACjB,aAAe,EAAE,OACd,MACJ,CAAC,CAAC;;oBAEH,EACE,CAAI,6BAA6B,EAAE,4BAA4B,CAAC,YAChE,EAAQ;4CACc,EAAE,wBAAwB,CAAC;yCAC9B,EAAE,yBAAyB,CAAC;;yCAE5B,EAAE,yBAAyB,CAAC;;gBAErD,IAAyB,OA0EvB,EAzEA,CAAI;0CACoB,IAAyB,UAAY,cAAgB,GAAG;wBAC1E,EAEI,EADJ,IAAyB,UACnB,uBACA,oBAAoB,CAC1B,IAAyB,UAC1B,CAAC;wBACA,IAAyB,UACvB,CAAI;;;uCAGS,EAAM,KAAK,WAAW;;6CAEhB,EAAM,YAAY,WAAa,OAAS,QAAQ;iDAC5C,EACjB,EAAM,YAAY,WACd,EAAgB,aAAa,CAC7B,IAAA,GACL,CAAC;uCACQ,GACR,EAAM,aAAa,CACjB,WAAa,EAAE,OAA4B,MAC5C,CAAC,CAAC;4CACS,EAAE,+BAA+B,CAAC;;4BAGpD,CAAI;;;uCAGS,EAAM,KAAK,iBAAmB,OAAO;wCACnC,GACT,EAAM,aAAa,CACjB,gBAAkB,EAAE,OAA6B,MAClD,CAAC,CAAC;;gCAEH,EAAe,IACd,GACC,CAAI,iBAAiB,EAAQ;sCACzB,EAAoB,EAAO,EAAQ,CAAC;6CAE3C,CAAC;;4BAEJ;wBACJ,IAAyB,WACvB,CAAI,2BAA2B,EAAE,wBAAwB,CAAC,SAC1D,CAAI,2BAA2B,EAAE,wBAAwB,CAAC,SAAS;;sBAEvE,IAAyB,WACvB,CAAI;;8BAEE,EAAiB,EAAE,eAAe,CAAC,CAAC;;;uCAG3B,EAAM,KAAK,WAAW;;uCAErB,GACR,EAAM,aAAa,CACjB,WAAa,EAAE,OAA4B,MAC5C,CAAC,CAAC;4CACS,EAAE,0BAA0B,CAAC;;qDAEpB,EAAE,mBAAmB,CAAC;;0BAGnD,EAAQ;sBACV,IAAyB,UACvB,EACE,EAAM,YAAY,WAClB,EAAgB,aAAa,CAC9B,CACD,EAAQ;oBAEN;;;;;sDAK4B,EAAE,qBAAqB,CAAC;qCACzC,EAAE,yBAAyB,CAAC;;;;;6BAKpC,EAAM,KAAK,eAAe;4BAC1B,GACT,EAAM,aAAa,CACjB,eAAiB,EAAE,OAA4B,QAChD,CAAC,CAAC;;sDAE+B,EAAE,2BAA2B,CAAC;yCAC3C,EAAE,+BAA+B,CAAC;;;;;6BAK9C,EAAM,KAAK,WAAW;4BACtB,GACT,EAAM,aAAa,CACjB,WAAa,EAAE,OAA4B,QAC5C,CAAC,CAAC;;sDAE+B,EAAE,+BAA+B,CAAC;yCAC/C,EAAE,2BAA2B,CAAC;;;kBAGrD,EAAiB,cAAc,CAAC;;;2BAGvB,EAAM,KAAK,WAAW;2BACrB,GACR,EAAM,aAAa,CACjB,WAAa,EAAE,OAA4B,MAC5C,CAAC,CAAC;;;;;gBAKP,EACE,CAAI;;;;mCAIa,EAAM,KAAK,cAAc;kCACzB,GACT,EAAM,aAAa,CACjB,cAAgB,EAAE,OAA4B,QAC/C,CAAC,CAAC;;4DAE+B,EAAE,wBAAwB,CAAC;+CACxC,EAAE,4BAA4B,CAAC;;;;0BAIpD,EAAiB,EAAE,0BAA0B,CAAC,CAAC;;;mCAGtC,EAAM,KAAK,cAAc;sCACtB,EAAM,KAAK,cAAc;yCACtB,EAAM,YAAY,cAAgB,OAAS,QAAQ;6CAC/C,EACjB,EAAM,YAAY,cACd,EAAgB,gBAAgB,CAChC,IAAA,GACL,CAAC;mCACQ,GACR,EAAM,aAAa,CACjB,cAAgB,EAAE,OAA4B,MAC/C,CAAC,CAAC;wCACS,EAAE,+BAA+B,CAAC;;0BAEhD,EACA,EAAM,YAAY,cAClB,EAAgB,gBAAgB,CACjC,CAAC;;;gCAGM,EAAE,wBAAwB,CAAC;;mCAExB,EAAM,KAAK,YAAY;sCACpB,EAAM,KAAK,cAAc;oCAC1B,GACT,EAAM,aAAa,CACjB,YAAc,EAAE,OACb,MACJ,CAAC,CAAC;;oDAEqB,EAAE,oBAAoB,CAAC;oDACvB,EAAE,oBAAoB,CAAC;;;;oBAKzD,EAAQ;gBACV,EACE,CAAI;;wBAEE,EAAiB,aAAa,CAAC;;;iCAGtB,EAAM,KAAK,kBAAkB;;oCAE1B,IAAyB,WAAW;iCACtC,GACR,EAAM,aAAa,CACjB,kBAAoB,EAAE,OAA4B,MACnD,CAAC,CAAC;;;;;;;;;;mCAUM,EAAM,KAAK,oBAAoB;kCAC/B,GACT,EAAM,aAAa,CACjB,oBAAsB,EAAE,OAA4B,QACrD,CAAC,CAAC;;;;;;;;wBAQL,EAAiB,EAAE,kBAAkB,CAAC,CAAC;;;iCAG9B,EAAM,KAAK,aAAa;;iCAEvB,GACR,EAAM,aAAa,CACjB,aAAe,EAAE,OAA4B,MAC9C,CAAC,CAAC;sCACS,EAAE,6BAA6B,CAAC;;+CAEvB,EAAE,sBAAsB,CAAC;;;wBAGhD,EAAiB,EAAE,qBAAqB,CAAC,CAAC;;;iCAGjC,EAAM,KAAK,gBAAgB;;iCAE1B,GACR,EAAM,aAAa,CACjB,gBAAkB,EAAE,OAA4B,MACjD,CAAC,CAAC;sCACS,EAAE,gCAAgC,CAAC;;+CAE1B,EAAE,yBAAyB,CAAC;;oBAGzD,EAAQ;gBACV,EACE,CAAI;;wBAEE,EAAiB,iBAAiB,CAAC;;iCAE1B,EAAM,KAAK,iBAAiB;kCAC1B,GACT,EAAM,aAAa,CACjB,iBAAmB,EAAE,OAClB,MACJ,CAAC,CAAC;;;;;;;;;;sBAUP,EAAM,KAAK,mBAAqB,SAC9B,CAAI;;8BAEE,EAAiB,cAAc,CAAC;;;uCAGvB,EAAM,KAAK,kBAAkB;6CACvB,EAAM,YAAY,kBAAoB,OAAS,QAAQ;iDACnD,EACjB,EAAM,YAAY,kBACd,EAAgB,oBAAoB,CACpC,IAAA,GACL,CAAC;uCACQ,GACR,EAAM,aAAa,CACjB,kBAAoB,EAAE,OAA4B,MACnD,CAAC,CAAC;;;;8BAIL,EACA,EAAM,YAAY,kBAClB,EAAgB,oBAAoB,CACrC,CAAC;;;8BAGA,EAAiB,qBAAqB,CAAC;;;uCAG9B,EAAM,KAAK,4BAA4B;6CACjC,EAAM,YAAY,4BAC7B,OACA,QAAQ;iDACO,EACjB,EAAM,YAAY,4BACd,EAAgB,8BAA8B,CAC9C,IAAA,GACL,CAAC;uCACQ,GACR,EAAM,aAAa,CACjB,4BAA8B,EAAE,OAA4B,MAC7D,CAAC,CAAC;;;;8BAIL,EACA,EAAM,YAAY,4BAClB,EAAgB,8BAA8B,CAC/C,CAAC;;;8BAGA,EAAiB,gBAAgB,CAAC;;uCAEzB,EAAM,KAAK,qBAAuB,OAAO;wCACvC,GACT,EAAM,aAAa,CACjB,oBAAsB,EAAE,OAA6B,MACtD,CAAC,CAAC;;gCAEH,EAAe,IACd,GACC,CAAI,iBAAiB,EAAQ;sCACzB,EAAoB,EAAO,EAAQ,CAAC;6CAE3C,CAAC;;;;8BAIF,EAAiB,WAAW,CAAC;;uCAEpB,EAAM,KAAK,eAAe;;uCAEzB,GACR,EAAM,aAAa,CACjB,eAAiB,EAAE,OAA4B,MAChD,CAAC,CAAC;;;;;;;;8BAQL,EAAiB,aAAa,CAAC;;uCAEtB,EAAM,KAAK,0BAA4B,WAAW;wCAChD,GACT,EAAM,aAAa,CACjB,yBAA2B,EAAE,OAC1B,MACJ,CAAC,CAAC;;;;;;;8BAOL,EAAiB,mBAAmB,CAAC;;uCAE5B,EAAM,KAAK,sBAAsB;uCAChC,GACR,EAAM,aAAa,CACjB,sBAAwB,EAAE,OAA4B,MACvD,CAAC,CAAC;;;;0BAKX,EAAQ;oBAEd,EAAQ;gBACV,IAAyB,OAiBvB,EAhBA,CAAI;;;;mCAIa,EAAM,KAAK,mBAAmB;kCAC9B,GACT,EAAM,aAAa,CACjB,mBAAqB,EAAE,OAA4B,QACpD,CAAC,CAAC;;;2BAGF,EAAE,+BAA+B,CAAC;;+CAEd,EAAE,2BAA2B,CAAC;;oBAGnD;;;;UAIhB,EACE,CAAI;;uDAEuC,EAAE,uBAAuB,CAAC;yCACxC,EAAE,yBAAyB,CAAC;;oBAEjD,EAAe,IACd,GAAU,CAAI;;;;;uCAKM,EAAe,EAAM,QAAQ,CAAC;;4BAE3C,EAAM,MAAM,IAAI,EAAE,EAAM,QAAQ,CAAC;;;sBAI1C,CAAC;;;cAIR,EAAQ;;;;wBAII,EAAM,MAAQ,CAAC,EAAM,UAAU;qBAClC,EAAM,MAAM;;cAEnB,EAAM,KACJ,EAAE,mBAAmB,CAEnB,EADF,EACI,wBACA,mBAAmB,CAAC;;YAE5B,EACE,CAAI,sDAAsD,EAAqB,QAC/E,EAAQ;YACV,EACE,CAAI;gDAC8B,EAAM,KAAK,UAAU,EAAM,aAAa;oBACpE,EAAE,mBAAmB,CAAC;;gBAG5B,EAAQ;;;;;MAKhB,EAAqB,yBAA0B,EAAM,iBAAiB,CAAC;MACvE,EAAqB,yBAA0B,EAAM,iBAAiB,CAAC;MACvE,EAAqB,4BAA6B,EAAM,oBAAoB,CAAC;MAC7E,EAAqB,sBAAuB,EAAM,oBAAoB,CAAC;MACvE,EAAqB,+BAAgC,EAAM,sBAAsB,CAAC;MAClF,EAAqB,oCAAqC,EAAM,mBAAmB,CAAC;IAI1F,SAAS,EAAqB,EAAkB,CAC9C,IAAM,EAAO,EAAM,KA2DnB,OA1DI,EAAK,eAAiB,KACjB,CAAI;;UAEL,EAAiB,EAAE,kBAAkB,CAAE,GAAK,CAAC;;;;mBAIpC,EAAK,WAAW;yBACV,EAAM,YAAY,WAAa,OAAS,QAAQ;6BAC5C,EACjB,EAAM,YAAY,WAAa,EAAgB,aAAa,CAAG,IAAA,GAChE,CAAC;mBACQ,GACR,EAAM,aAAa,CACjB,WAAa,EAAE,OAA4B,MAC5C,CAAC,CAAC;;UAEL,EAAiB,EAAM,YAAY,WAAY,EAAgB,aAAa,CAAC,CAAC;;MAIlF,EAAK,eAAiB,QACjB,CAAI;;;YAGH,EAAiB,EAAE,kBAAkB,CAAE,GAAK,CAAC;;;qBAGpC,EAAK,YAAY;2BACX,EAAM,YAAY,YAAc,OAAS,QAAQ;+BAC7C,EACjB,EAAM,YAAY,YAAc,EAAgB,cAAc,CAAG,IAAA,GAClE,CAAC;qBACQ,GACR,EAAM,aAAa,CACjB,YAAc,EAAE,OAA4B,MAC7C,CAAC,CAAC;0BACS,EAAE,mCAAmC,CAAC;;YAEpD,EAAiB,EAAM,YAAY,YAAa,EAAgB,cAAc,CAAC,CAAC;;;kBAG1E,EAAE,iBAAiB,CAAC;;qBAEjB,EAAK,UAAU;sBACb,GACT,EAAM,aAAa,CACjB,UAAY,EAAE,OAA6B,MAC5C,CAAC,CAAC;;sCAEqB,EAAE,oBAAoB,CAAC;oCACzB,EAAE,kBAAkB,CAAC;mCACtB,EAAE,iBAAiB,CAAC;;;;MAM9C,CAAI;;;UAGH,EAAiB,EAAE,uBAAuB,CAAE,GAAK,CAAC;;;mBAGzC,EAAK,SAAS;yBACR,EAAM,YAAY,SAAW,OAAS,QAAQ;6BAC1C,EACjB,EAAM,YAAY,SAAW,EAAgB,WAAW,CAAG,IAAA,GAC5D,CAAC;mBACQ,GACR,EAAM,aAAa,CAAE,SAAW,EAAE,OAA4B,MAAO,CAAC,CAAC;wBAC3D,EAAE,kCAAkC,CAAC;;UAEnD,EAAiB,EAAM,YAAY,SAAU,EAAgB,WAAW,CAAC,CAAC;;;gBAGpE,EAAE,6BAA6B,CAAC;;mBAE7B,EAAK,OAAO;;mBAEX,GACR,EAAM,aAAa,CAAE,OAAS,EAAE,OAA4B,MAAO,CAAC,CAAC;wBACzD,EAAE,gCAAgC,CAAC;;iCAE1B,EAAE,yBAAyB,CAAC;;2CAElB,EAAE,uBAAuB,CAAC;;IAKrE,SAAS,EAAiB,EAAkB,EAAa,CAIvD,OAHK,EAGE,CAAI,WAAW,EAAU,EAAG,CAAC,gCAAgC,EAAE,EAAQ,CAAC,QAFtE,EAKX,SAAS,EAAU,EAAc,EAAkB,CAEjD,IAAM,EAAY,yCADC,EAAM,YAAc,EAAI,GAC6B,sBAAwB,KAC1F,EAAa,GAAuB,CACxC,EAAM,WAAW,EAAI,GAAG,CACxB,GAAQ,EAEV,MAAO,EAAI;iBACI,EAAU,cAAgB,EAAM,WAAW,EAAI,GAAG,CAAC;;kCAElC,EAAI,KAAK;gCACX,EAAmB,EAAI,CAAC;UAC9C,EAAiB,EAAI,CAAC;UACtB,EAAI,QACF,CAAI;gBACA,EAAE,uBAAuB,CAAC,IAAI,EAAI,QAAQ;oBAE9C,EAAQ;;+BAEW,EAAe,EAAI,CAAC;;;wBAG3B,QAAQ,EAAI,QAAU,UAAY,gBAAgB;cAC5D,EAAI,QAAU,EAAE,uBAAuB,CAAG,EAAE,wBAAwB,CAAC;;+BAEpD,EAAI,cAAc;+BAClB,EAAI,SAAS;;;;;wBAKpB,EAAM,KAAK;qBACb,GAAiB,CACzB,EAAM,iBAAiB,CACvB,MAAgB,EAAM,OAAO,EAAI,CAAC,EAClC;;cAEA,EAAE,oBAAoB,CAAC;;;;wBAIb,EAAM,KAAK;qBACb,GAAiB,CACzB,EAAM,iBAAiB,CACvB,MAAgB,EAAM,QAAQ,EAAI,CAAC,EACnC;;cAEA,EAAE,qBAAqB,CAAC;;;;wBAId,EAAM,KAAK;qBACb,GAAiB,CACzB,EAAM,iBAAiB,CACvB,MAAgB,EAAM,SAAS,EAAK,CAAC,EAAI,QAAQ,CAAC,EAClD;;cAEA,EAAI,QAAU,EAAE,uBAAuB,CAAG,EAAE,sBAAsB,CAAC;;;;wBAIzD,EAAM,KAAK;qBACb,GAAiB,CACzB,EAAM,iBAAiB,CACvB,MAAgB,EAAM,MAAM,EAAK,QAAQ,CAAC,EAC1C;;cAEA,EAAE,mBAAmB,CAAC;;;;wBAIZ,EAAM,KAAK;qBACb,GAAiB,CACzB,EAAM,iBAAiB,CACvB,MAAgB,EAAM,MAAM,EAAK,MAAM,CAAC,EACxC;;;;;;wBAMU,EAAM,KAAK;qBACb,GAAiB,CACzB,EAAM,iBAAiB,CACvB,EAAM,WAAW,EAAI,GAAG,EACxB;;cAEA,EAAE,uBAAuB,CAAC;;;;wBAIhB,EAAM,KAAK;qBACb,GAAiB,CACzB,EAAM,iBAAiB,CACvB,MAAgB,EAAM,SAAS,EAAI,CAAC,EACpC;;cAEA,EAAE,sBAAsB,CAAC;;;;;IAQvC,SAAS,EAAiB,EAAc,CACtC,GAAI,EAAI,QAAQ,OAAS,cACvB,MAAO,EAAI;4CAC6B,EAAE,wBAAwB,CAAC;kDACrB,EAAI,QAAQ,KAAK;YAIjE,IAAM,EAAW,EAAI,SACf,EACJ,GAAU,OAAS,UACf,EAAS,GACP,KAAK,EAAS,GAAG,GACjB,GACF,GAAU,SAAW,GAAU,GAC7B,KAAK,EAAS,SAAW,SAAS,EAAS,GAAK,OAAO,EAAS,KAAO,GAAG,GAC1E,GAER,MAAO,EAAI;;4CAE+B,EAAE,wBAAwB,CAAC;kDACrB,EAAI,QAAQ,QAAQ;;MAEhE,EACE,CAAI;gDACoC,EAAE,0BAA0B,CAAC;sDACvB,EAAS,OAAO,EAAe;gBAE7E,EAAQ;IAIhB,SAAS,EAAoB,EAAa,CAIxC,OAHI,OAAO,GAAO,UAAY,CAAC,OAAO,SAAS,EAAG,CACzC,EAAE,YAAY,CAEhB,EAAwB,EAAG,CAGpC,SAAS,EAAmB,EAAqB,EAAQ,KAAK,KAAK,CAAE,CACnE,IAAM,EAAM,EAAwB,EAAY,CAChD,OAA6B,EAAtB,EAAc,EAAU,qBAAmC,oBAAb,CAAE,MAAK,CAAmC,CAGjG,SAAS,EAAe,EAAc,CACpC,IAAM,EAAY,EAAI,OAAO,WACvB,EACJ,IAAc,KACV,qBACA,IAAc,QACZ,wBACA,IAAc,UACZ,0BACA,qBACJ,EAEA,EADJ,IAAc,KACR,wBACF,IAAc,QACV,2BACF,IAAc,UACV,6BACA,YAAY,CAClB,EAAc,EAAI,OAAO,YACzB,EAAc,EAAI,OAAO,YAE/B,MAAO,EAAI;;;2CAG8B,EAAE,uBAAuB,CAAC;sBAC/C,wBAAwB,IAAc,GAAG,EAAY;;;2CAGhC,EAAE,qBAAqB,CAAC;mDAChB,EAAS,EAAY,CAAC;YAC7D,EAAoB,EAAY,CAAC;;;;2CAIF,EAAE,qBAAqB,CAAC;mDAChB,EAAS,EAAY,CAAC;YAC7D,EAAoB,EAAY,CAAC;;;;IAO7C,SAAS,EAAe,EAAuB,CAC7C,OAAQ,EAAR,CACE,IAAK,KACH,OAAO,EAAE,wBAAwB,CACnC,IAAK,QACH,OAAO,EAAE,2BAA2B,CACtC,IAAK,UACH,OAAO,EAAE,6BAA6B,CACxC,QACE,OAAO,EAAE,6BAA6B,EAI5C,SAAS,EAAiB,EAAuB,CAC/C,OAAQ,EAAR,CACE,IAAK,YACH,OAAO,EAAE,8BAA8B,CACzC,IAAK,gBACH,OAAO,EAAE,iCAAiC,CAC5C,IAAK,gBACH,OAAO,EAAE,iCAAiC,CAC5C,IAAK,UACH,OAAO,EAAE,4BAA4B,CACvC,QACE,OAAO,EAAE,4BAA4B,EAI3C,SAAS,EACP,EACA,EACA,EACA,CACA,IAAM,EACJ,OAAO,EAAM,YAAe,UAAY,EAAM,WAAW,MAAM,CAAC,OAAS,EACrE,GAAG,EAAW,OAAQ,EAAS,CAAC,WAAW,mBAAmB,EAAM,WAAW,GAC/E,KACA,EAAS,EAAe,EAAM,QAAU,UAAU,CAClD,EAAW,EAAiB,EAAM,gBAAkB,gBAAgB,CACpE,EAAQ,EAAM,MACd,EACJ,GAAS,OAAO,EAAM,cAAiB,SACnC,GAAG,EAAM,aAAa,SACtB,GAAS,OAAO,EAAM,cAAiB,UAAY,OAAO,EAAM,eAAkB,SAChF,GAAG,EAAM,aAAa,QAAQ,EAAM,cAAc,MAClD,KACR,MAAO,EAAI;;;;YAID,EAAM,SAAW,EAAM,MAAM;mCACN,EAAO;;;YAG9B,EAAM,SAAW,EAAM,OAAS,EAAE,0BAA0B,CAAC;;;+BAG1C,EAAS;YAC5B,EAAM,MAAQ,CAAI,sBAAsB,EAAM,MAAM,SAAW,EAAQ;YACvE,EAAM,SAAW,CAAI,sBAAsB,EAAM,SAAS,SAAW,EAAQ;YAC7E,EAAe,CAAI,sBAAsB,EAAa,SAAW,EAAQ;;;;eAItE,EAAS,EAAM,GAAG,CAAC;UACxB,OAAO,EAAM,SAAY,SACvB,CAAI,sBAAsB,EAAE,sBAAsB,CAAC,GAAG,EAAS,EAAM,QAAQ,CAAC,QAC9E,EAAQ;6BACS,EAAM,YAAc,EAAE;UACzC,OAAO,EAAM,aAAgB,SAC3B,CAAI,sBAAsB,EAAmB,EAAM,YAAY,CAAC,QAChE,EAAQ;UACV,EACE,CAAI;;;uBAGO,EAAQ;yBACL,GAAkB,CAExB,EAAE,kBACF,EAAE,SAAW,GACb,EAAE,SACF,EAAE,SACF,EAAE,UACF,EAAE,QAIA,GAAoB,EAAM,aAC5B,EAAE,gBAAgB,CAClB,EAAiB,EAAM,WAAW,GAEpC;mBACC,EAAE,4BAA4B,CAAC;;oBAGtC,EAAQ;UACV,EAAM,MAAQ,CAAI,sBAAsB,EAAM,MAAM,QAAU,EAAQ;UACtE,EAAM,cAAgB,CAAI,sBAAsB,EAAM,cAAc,QAAU,EAAQ"}
@@ -0,0 +1,2 @@
1
+ var e={common:{version:`Version`,health:`Status`,ok:`OK`,online:`Online`,offline:`Offline`,connect:`Verbinden`,refresh:`Aktualisieren`,enabled:`Aktiviert`,disabled:`Deaktiviert`,na:`k. A.`,docs:`Dokumentation`,resources:`Ressourcen`},nav:{chat:`Chat`,control:`Steuerung`,agent:`Agent`,settings:`Einstellungen`,expand:`Seitenleiste ausklappen`,collapse:`Seitenleiste einklappen`},tabs:{employees:`Team`,agents:`Agenten`,overview:`Übersicht`,channels:`Kanäle`,instances:`Instanzen`,sessions:`Sitzungen`,usage:`Nutzung`,cron:`Cron-Aufgaben`,skills:`Fähigkeiten`,nodes:`Geräte`,chat:`Chat`,config:`Konfiguration`,apiKeys:`API Keys`,debug:`Debug`,logs:`Protokolle`},subtitles:{employees:`AI-Team und letzte Aktivitaet.`,agents:`Agent-Arbeitsbereiche, Tools und Identitäten verwalten.`,overview:`Gateway-Status, Einstiegspunkte und eine schnelle Zustandsprüfung.`,channels:`Kanäle und Einstellungen verwalten.`,instances:`Präsenzsignale von verbundenen Clients und Geräten.`,sessions:`Aktive Sitzungen inspizieren und Standardeinstellungen pro Sitzung anpassen.`,usage:`API-Nutzung und Kosten überwachen.`,cron:`Aufweckzeiten und wiederkehrende Agent-Läufe planen.`,skills:`Skill-Verfügbarkeit und API-Schlüsselinjektion verwalten.`,nodes:`Gekoppelte Geräte, Fähigkeiten und Befehlsfreigabe.`,chat:`Direkte Gateway-Chat-Sitzung für schnelle Eingriffe.`,config:`~/.openclaw/openclaw.json sicher bearbeiten.`,apiKeys:`OpenRouter key and model defaults.`,debug:`Gateway-Snapshots, Ereignisse und manuelle RPC-Aufrufe.`,logs:`Live-Verfolgung der Gateway-Protokolldateien.`},overview:{access:{title:`Gateway-Zugang`,subtitle:`Wo sich das Dashboard verbindet und wie es sich authentifiziert.`,wsUrl:`WebSocket-URL`,token:`Gateway-Token`,password:`Passwort (nicht gespeichert)`,sessionKey:`Standard-Sitzungsschlüssel`,language:`Sprache`,connectHint:`Klicken Sie auf Verbinden, um Verbindungsänderungen anzuwenden.`,trustedProxy:`Authentifiziert über vertrauenswürdigen Proxy.`},snapshot:{title:`Snapshot`,subtitle:`Neueste Gateway-Handshake-Informationen.`,status:`Status`,uptime:`Betriebszeit`,tickInterval:`Tick-Intervall`,lastChannelsRefresh:`Letzte Kanalaktualisierung`,channelsHint:`Verwenden Sie Kanäle, um WhatsApp, Telegram, Discord, Signal oder iMessage zu verknüpfen.`},stats:{instances:`Instanzen`,instancesHint:`Präsenzsignale in den letzten 5 Minuten.`,sessions:`Sitzungen`,sessionsHint:`Letzte vom Gateway verfolgte Sitzungsschlüssel.`,cron:`Cron`,cronNext:`Nächste Ausführung {time}`},notes:{title:`Notizen`,subtitle:`Kurze Hinweise für Remote-Steuerung.`,tailscaleTitle:`Tailscale Serve`,tailscaleText:`Bevorzugen Sie den Serve-Modus, um das Gateway auf Loopback mit Tailnet-Auth zu halten.`,sessionTitle:`Sitzungshygiene`,sessionText:`Verwenden Sie /new oder sessions.patch, um den Kontext zurückzusetzen.`,cronTitle:`Cron-Erinnerungen`,cronText:`Verwenden Sie isolierte Sitzungen für wiederkehrende Läufe.`},auth:{required:`Dieses Gateway erfordert Authentifizierung. Fügen Sie ein Token oder Passwort hinzu und klicken Sie auf Verbinden.`,failed:`Authentifizierung fehlgeschlagen. Kopieren Sie erneut eine URL mit Token über {command}, oder aktualisieren Sie das Token und klicken Sie auf Verbinden.`},pairing:{hint:`Dieses Gerät benötigt eine Pairing-Freigabe vom Gateway-Host.`,mobileHint:`Auf dem Mobilgerät? Kopieren Sie die vollständige URL (einschließlich #token=...) von kova dashboard --no-open auf Ihrem Desktop.`},insecure:{hint:`Diese Seite ist HTTP, daher blockiert der Browser die Geräteidentifikation. Verwenden Sie HTTPS (Tailscale Serve) oder öffnen Sie {url} auf dem Gateway-Host.`,stayHttp:`Wenn Sie bei HTTP bleiben müssen, setzen Sie {config} (nur Token).`}},chat:{disconnected:`Verbindung zum Gateway getrennt.`,refreshTitle:`Chat-Daten aktualisieren`,thinkingToggle:`Ausgabe des Assistenten ein-/ausblenden`,focusToggle:`Fokusmodus ein-/ausschalten (Seitenleiste + Kopfzeile ausblenden)`,hideCronSessions:`Cron-Sitzungen ausblenden`,showCronSessions:`Cron-Sitzungen anzeigen`,showCronSessionsHidden:`Cron-Sitzungen anzeigen ({count} ausgeblendet)`,onboardingDisabled:`Während der Einrichtung deaktiviert`},languages:{en:`English`,zhCN:`简体中文 (Vereinfachtes Chinesisch)`,zhTW:`繁體中文 (Traditionelles Chinesisch)`,ptBR:`Português (Brasilianisches Portugiesisch)`,de:`Deutsch`,es:`Spanisch (Español)`}};export{e as de};
2
+ //# sourceMappingURL=de-rLAkQOBc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"de-rLAkQOBc.js","names":[],"sources":["../../../ui/src/i18n/locales/de.ts"],"sourcesContent":["import type { TranslationMap } from \"../lib/types.ts\";\n\nexport const de: TranslationMap = {\n common: {\n version: \"Version\",\n health: \"Status\",\n ok: \"OK\",\n online: \"Online\",\n offline: \"Offline\",\n connect: \"Verbinden\",\n refresh: \"Aktualisieren\",\n enabled: \"Aktiviert\",\n disabled: \"Deaktiviert\",\n na: \"k. A.\",\n docs: \"Dokumentation\",\n resources: \"Ressourcen\",\n },\n nav: {\n chat: \"Chat\",\n control: \"Steuerung\",\n agent: \"Agent\",\n settings: \"Einstellungen\",\n expand: \"Seitenleiste ausklappen\",\n collapse: \"Seitenleiste einklappen\",\n },\n tabs: {\n employees: \"Team\",\n agents: \"Agenten\",\n overview: \"Übersicht\",\n channels: \"Kanäle\",\n instances: \"Instanzen\",\n sessions: \"Sitzungen\",\n usage: \"Nutzung\",\n cron: \"Cron-Aufgaben\",\n skills: \"Fähigkeiten\",\n nodes: \"Geräte\",\n chat: \"Chat\",\n config: \"Konfiguration\",\n apiKeys: \"API Keys\",\n debug: \"Debug\",\n logs: \"Protokolle\",\n },\n subtitles: {\n employees: \"AI-Team und letzte Aktivitaet.\",\n agents: \"Agent-Arbeitsbereiche, Tools und Identitäten verwalten.\",\n overview: \"Gateway-Status, Einstiegspunkte und eine schnelle Zustandsprüfung.\",\n channels: \"Kanäle und Einstellungen verwalten.\",\n instances: \"Präsenzsignale von verbundenen Clients und Geräten.\",\n sessions: \"Aktive Sitzungen inspizieren und Standardeinstellungen pro Sitzung anpassen.\",\n usage: \"API-Nutzung und Kosten überwachen.\",\n cron: \"Aufweckzeiten und wiederkehrende Agent-Läufe planen.\",\n skills: \"Skill-Verfügbarkeit und API-Schlüsselinjektion verwalten.\",\n nodes: \"Gekoppelte Geräte, Fähigkeiten und Befehlsfreigabe.\",\n chat: \"Direkte Gateway-Chat-Sitzung für schnelle Eingriffe.\",\n config: \"~/.openclaw/openclaw.json sicher bearbeiten.\",\n apiKeys: \"OpenRouter key and model defaults.\",\n debug: \"Gateway-Snapshots, Ereignisse und manuelle RPC-Aufrufe.\",\n logs: \"Live-Verfolgung der Gateway-Protokolldateien.\",\n },\n overview: {\n access: {\n title: \"Gateway-Zugang\",\n subtitle: \"Wo sich das Dashboard verbindet und wie es sich authentifiziert.\",\n wsUrl: \"WebSocket-URL\",\n token: \"Gateway-Token\",\n password: \"Passwort (nicht gespeichert)\", // pragma: allowlist secret\n sessionKey: \"Standard-Sitzungsschlüssel\",\n language: \"Sprache\",\n connectHint: \"Klicken Sie auf Verbinden, um Verbindungsänderungen anzuwenden.\",\n trustedProxy: \"Authentifiziert über vertrauenswürdigen Proxy.\",\n },\n snapshot: {\n title: \"Snapshot\",\n subtitle: \"Neueste Gateway-Handshake-Informationen.\",\n status: \"Status\",\n uptime: \"Betriebszeit\",\n tickInterval: \"Tick-Intervall\",\n lastChannelsRefresh: \"Letzte Kanalaktualisierung\",\n channelsHint:\n \"Verwenden Sie Kanäle, um WhatsApp, Telegram, Discord, Signal oder iMessage zu verknüpfen.\",\n },\n stats: {\n instances: \"Instanzen\",\n instancesHint: \"Präsenzsignale in den letzten 5 Minuten.\",\n sessions: \"Sitzungen\",\n sessionsHint: \"Letzte vom Gateway verfolgte Sitzungsschlüssel.\",\n cron: \"Cron\",\n cronNext: \"Nächste Ausführung {time}\",\n },\n notes: {\n title: \"Notizen\",\n subtitle: \"Kurze Hinweise für Remote-Steuerung.\",\n tailscaleTitle: \"Tailscale Serve\",\n tailscaleText:\n \"Bevorzugen Sie den Serve-Modus, um das Gateway auf Loopback mit Tailnet-Auth zu halten.\",\n sessionTitle: \"Sitzungshygiene\",\n sessionText: \"Verwenden Sie /new oder sessions.patch, um den Kontext zurückzusetzen.\",\n cronTitle: \"Cron-Erinnerungen\",\n cronText: \"Verwenden Sie isolierte Sitzungen für wiederkehrende Läufe.\",\n },\n auth: {\n required:\n \"Dieses Gateway erfordert Authentifizierung. Fügen Sie ein Token oder Passwort hinzu und klicken Sie auf Verbinden.\",\n failed:\n \"Authentifizierung fehlgeschlagen. Kopieren Sie erneut eine URL mit Token über {command}, oder aktualisieren Sie das Token und klicken Sie auf Verbinden.\",\n },\n pairing: {\n hint: \"Dieses Gerät benötigt eine Pairing-Freigabe vom Gateway-Host.\",\n mobileHint:\n \"Auf dem Mobilgerät? Kopieren Sie die vollständige URL (einschließlich #token=...) von kova dashboard --no-open auf Ihrem Desktop.\",\n },\n insecure: {\n hint: \"Diese Seite ist HTTP, daher blockiert der Browser die Geräteidentifikation. Verwenden Sie HTTPS (Tailscale Serve) oder öffnen Sie {url} auf dem Gateway-Host.\",\n stayHttp: \"Wenn Sie bei HTTP bleiben müssen, setzen Sie {config} (nur Token).\",\n },\n },\n chat: {\n disconnected: \"Verbindung zum Gateway getrennt.\",\n refreshTitle: \"Chat-Daten aktualisieren\",\n thinkingToggle: \"Ausgabe des Assistenten ein-/ausblenden\",\n focusToggle: \"Fokusmodus ein-/ausschalten (Seitenleiste + Kopfzeile ausblenden)\",\n hideCronSessions: \"Cron-Sitzungen ausblenden\",\n showCronSessions: \"Cron-Sitzungen anzeigen\",\n showCronSessionsHidden: \"Cron-Sitzungen anzeigen ({count} ausgeblendet)\",\n onboardingDisabled: \"Während der Einrichtung deaktiviert\",\n },\n languages: {\n en: \"English\",\n zhCN: \"简体中文 (Vereinfachtes Chinesisch)\",\n zhTW: \"繁體中文 (Traditionelles Chinesisch)\",\n ptBR: \"Português (Brasilianisches Portugiesisch)\",\n de: \"Deutsch\",\n es: \"Spanisch (Español)\",\n },\n};\n"],"mappings":"AAEA,IAAa,EAAqB,CAChC,OAAQ,CACN,QAAS,UACT,OAAQ,SACR,GAAI,KACJ,OAAQ,SACR,QAAS,UACT,QAAS,YACT,QAAS,gBACT,QAAS,YACT,SAAU,cACV,GAAI,QACJ,KAAM,gBACN,UAAW,aACZ,CACD,IAAK,CACH,KAAM,OACN,QAAS,YACT,MAAO,QACP,SAAU,gBACV,OAAQ,0BACR,SAAU,0BACX,CACD,KAAM,CACJ,UAAW,OACX,OAAQ,UACR,SAAU,YACV,SAAU,SACV,UAAW,YACX,SAAU,YACV,MAAO,UACP,KAAM,gBACN,OAAQ,cACR,MAAO,SACP,KAAM,OACN,OAAQ,gBACR,QAAS,WACT,MAAO,QACP,KAAM,aACP,CACD,UAAW,CACT,UAAW,iCACX,OAAQ,0DACR,SAAU,qEACV,SAAU,sCACV,UAAW,sDACX,SAAU,+EACV,MAAO,qCACP,KAAM,uDACN,OAAQ,4DACR,MAAO,sDACP,KAAM,uDACN,OAAQ,+CACR,QAAS,qCACT,MAAO,0DACP,KAAM,gDACP,CACD,SAAU,CACR,OAAQ,CACN,MAAO,iBACP,SAAU,mEACV,MAAO,gBACP,MAAO,gBACP,SAAU,+BACV,WAAY,6BACZ,SAAU,UACV,YAAa,kEACb,aAAc,iDACf,CACD,SAAU,CACR,MAAO,WACP,SAAU,2CACV,OAAQ,SACR,OAAQ,eACR,aAAc,iBACd,oBAAqB,6BACrB,aACE,4FACH,CACD,MAAO,CACL,UAAW,YACX,cAAe,2CACf,SAAU,YACV,aAAc,kDACd,KAAM,OACN,SAAU,4BACX,CACD,MAAO,CACL,MAAO,UACP,SAAU,uCACV,eAAgB,kBAChB,cACE,0FACF,aAAc,kBACd,YAAa,yEACb,UAAW,oBACX,SAAU,8DACX,CACD,KAAM,CACJ,SACE,qHACF,OACE,2JACH,CACD,QAAS,CACP,KAAM,gEACN,WACE,oIACH,CACD,SAAU,CACR,KAAM,gKACN,SAAU,qEACX,CACF,CACD,KAAM,CACJ,aAAc,mCACd,aAAc,2BACd,eAAgB,0CAChB,YAAa,oEACb,iBAAkB,4BAClB,iBAAkB,0BAClB,uBAAwB,iDACxB,mBAAoB,sCACrB,CACD,UAAW,CACT,GAAI,UACJ,KAAM,kCACN,KAAM,mCACN,KAAM,4CACN,GAAI,UACJ,GAAI,qBACL,CACF"}
@@ -0,0 +1,94 @@
1
+ import{i as e,n as t}from"./lit-zdTgzAJI.js";import{a as n}from"./index-XGDpaFxG.js";function r(r){let i=(r.status&&typeof r.status==`object`?r.status.securityAudit:null)?.summary??null,a=i?.critical??0,o=i?.warn??0,s=i?.info??0,c=a>0?`danger`:o>0?`warn`:`success`,l=a>0?`${a} critical`:o>0?`${o} warnings`:`No critical issues`;return e`
2
+ <section class="grid">
3
+ <div class="card">
4
+ <div class="row" style="justify-content: space-between;">
5
+ <div>
6
+ <div class="card-title">Snapshots</div>
7
+ <div class="card-sub">Status, health, and heartbeat data.</div>
8
+ </div>
9
+ <button class="btn" ?disabled=${r.loading} @click=${r.onRefresh}>
10
+ ${r.loading?`Refreshing…`:`Refresh`}
11
+ </button>
12
+ </div>
13
+ <div class="stack" style="margin-top: 12px;">
14
+ <div>
15
+ <div class="muted">Status</div>
16
+ ${i?e`<div class="callout ${c}" style="margin-top: 8px;">
17
+ Security audit: ${l}${s>0?` · ${s} info`:``}. Run
18
+ <span class="mono">kova security audit --deep</span> for details.
19
+ </div>`:t}
20
+ <pre class="code-block">${JSON.stringify(r.status??{},null,2)}</pre>
21
+ </div>
22
+ <div>
23
+ <div class="muted">Health</div>
24
+ <pre class="code-block">${JSON.stringify(r.health??{},null,2)}</pre>
25
+ </div>
26
+ <div>
27
+ <div class="muted">Last heartbeat</div>
28
+ <pre class="code-block">${JSON.stringify(r.heartbeat??{},null,2)}</pre>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="card">
34
+ <div class="card-title">Manual RPC</div>
35
+ <div class="card-sub">Send a raw gateway method with JSON params.</div>
36
+ <div class="stack" style="margin-top: 16px;">
37
+ <label class="field">
38
+ <span>Method</span>
39
+ <select
40
+ .value=${r.callMethod}
41
+ @change=${e=>r.onCallMethodChange(e.target.value)}
42
+ >
43
+ ${r.callMethod?t:e` <option value="" disabled>Select a method…</option> `}
44
+ ${r.methods.map(t=>e`<option value=${t}>${t}</option>`)}
45
+ </select>
46
+ </label>
47
+ <label class="field">
48
+ <span>Params (JSON)</span>
49
+ <textarea
50
+ .value=${r.callParams}
51
+ @input=${e=>r.onCallParamsChange(e.target.value)}
52
+ rows="6"
53
+ ></textarea>
54
+ </label>
55
+ </div>
56
+ <div class="row" style="margin-top: 12px;">
57
+ <button class="btn primary" @click=${r.onCall}>Call</button>
58
+ </div>
59
+ ${r.callError?e`<div class="callout danger" style="margin-top: 12px;">${r.callError}</div>`:t}
60
+ ${r.callResult?e`<pre class="code-block" style="margin-top: 12px;">${r.callResult}</pre>`:t}
61
+ </div>
62
+ </section>
63
+
64
+ <section class="card" style="margin-top: 18px;">
65
+ <div class="card-title">Models</div>
66
+ <div class="card-sub">Catalog from models.list.</div>
67
+ <pre class="code-block" style="margin-top: 12px;">
68
+ ${JSON.stringify(r.models??[],null,2)}</pre
69
+ >
70
+ </section>
71
+
72
+ <section class="card" style="margin-top: 18px;">
73
+ <div class="card-title">Event Log</div>
74
+ <div class="card-sub">Latest gateway events.</div>
75
+ ${r.eventLog.length===0?e` <div class="muted" style="margin-top: 12px">No events yet.</div> `:e`
76
+ <div class="list debug-event-log" style="margin-top: 12px;">
77
+ ${r.eventLog.map(t=>e`
78
+ <div class="list-item debug-event-log__item">
79
+ <div class="list-main">
80
+ <div class="list-title">${t.event}</div>
81
+ <div class="list-sub">${new Date(t.ts).toLocaleTimeString()}</div>
82
+ </div>
83
+ <div class="list-meta debug-event-log__meta">
84
+ <pre class="code-block debug-event-log__payload">
85
+ ${n(t.payload)}</pre
86
+ >
87
+ </div>
88
+ </div>
89
+ `)}
90
+ </div>
91
+ `}
92
+ </section>
93
+ `}export{r as renderDebug};
94
+ //# sourceMappingURL=debug-DFf2qCcM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-DFf2qCcM.js","names":[],"sources":["../../../ui/src/ui/views/debug.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport type { EventLogEntry } from \"../app-events.ts\";\nimport { formatEventPayload } from \"../presenter.ts\";\n\nexport type DebugProps = {\n loading: boolean;\n status: Record<string, unknown> | null;\n health: Record<string, unknown> | null;\n models: unknown[];\n heartbeat: unknown;\n eventLog: EventLogEntry[];\n methods: string[];\n callMethod: string;\n callParams: string;\n callResult: string | null;\n callError: string | null;\n onCallMethodChange: (next: string) => void;\n onCallParamsChange: (next: string) => void;\n onRefresh: () => void;\n onCall: () => void;\n};\n\nexport function renderDebug(props: DebugProps) {\n const securityAudit =\n props.status && typeof props.status === \"object\"\n ? (props.status as { securityAudit?: { summary?: Record<string, number> } }).securityAudit\n : null;\n const securitySummary = securityAudit?.summary ?? null;\n const critical = securitySummary?.critical ?? 0;\n const warn = securitySummary?.warn ?? 0;\n const info = securitySummary?.info ?? 0;\n const securityTone = critical > 0 ? \"danger\" : warn > 0 ? \"warn\" : \"success\";\n const securityLabel =\n critical > 0 ? `${critical} critical` : warn > 0 ? `${warn} warnings` : \"No critical issues\";\n\n return html`\n <section class=\"grid\">\n <div class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Snapshots</div>\n <div class=\"card-sub\">Status, health, and heartbeat data.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"stack\" style=\"margin-top: 12px;\">\n <div>\n <div class=\"muted\">Status</div>\n ${securitySummary\n ? html`<div class=\"callout ${securityTone}\" style=\"margin-top: 8px;\">\n Security audit: ${securityLabel}${info > 0 ? ` · ${info} info` : \"\"}. Run\n <span class=\"mono\">kova security audit --deep</span> for details.\n </div>`\n : nothing}\n <pre class=\"code-block\">${JSON.stringify(props.status ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Health</div>\n <pre class=\"code-block\">${JSON.stringify(props.health ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Last heartbeat</div>\n <pre class=\"code-block\">${JSON.stringify(props.heartbeat ?? {}, null, 2)}</pre>\n </div>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">Manual RPC</div>\n <div class=\"card-sub\">Send a raw gateway method with JSON params.</div>\n <div class=\"stack\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Method</span>\n <select\n .value=${props.callMethod}\n @change=${(e: Event) =>\n props.onCallMethodChange((e.target as HTMLSelectElement).value)}\n >\n ${!props.callMethod\n ? html` <option value=\"\" disabled>Select a method…</option> `\n : nothing}\n ${props.methods.map((m) => html`<option value=${m}>${m}</option>`)}\n </select>\n </label>\n <label class=\"field\">\n <span>Params (JSON)</span>\n <textarea\n .value=${props.callParams}\n @input=${(e: Event) =>\n props.onCallParamsChange((e.target as HTMLTextAreaElement).value)}\n rows=\"6\"\n ></textarea>\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn primary\" @click=${props.onCall}>Call</button>\n </div>\n ${props.callError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.callError}</div>`\n : nothing}\n ${props.callResult\n ? html`<pre class=\"code-block\" style=\"margin-top: 12px;\">${props.callResult}</pre>`\n : nothing}\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Models</div>\n <div class=\"card-sub\">Catalog from models.list.</div>\n <pre class=\"code-block\" style=\"margin-top: 12px;\">\n${JSON.stringify(props.models ?? [], null, 2)}</pre\n >\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Event Log</div>\n <div class=\"card-sub\">Latest gateway events.</div>\n ${props.eventLog.length === 0\n ? html` <div class=\"muted\" style=\"margin-top: 12px\">No events yet.</div> `\n : html`\n <div class=\"list debug-event-log\" style=\"margin-top: 12px;\">\n ${props.eventLog.map(\n (evt) => html`\n <div class=\"list-item debug-event-log__item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${evt.event}</div>\n <div class=\"list-sub\">${new Date(evt.ts).toLocaleTimeString()}</div>\n </div>\n <div class=\"list-meta debug-event-log__meta\">\n <pre class=\"code-block debug-event-log__payload\">\n${formatEventPayload(evt.payload)}</pre\n >\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </section>\n `;\n}\n"],"mappings":"qFAsBA,SAAgB,EAAY,EAAmB,CAK7C,IAAM,GAHJ,EAAM,QAAU,OAAO,EAAM,QAAW,SACnC,EAAM,OAAoE,cAC3E,OACiC,SAAW,KAC5C,EAAW,GAAiB,UAAY,EACxC,EAAO,GAAiB,MAAQ,EAChC,EAAO,GAAiB,MAAQ,EAChC,EAAe,EAAW,EAAI,SAAW,EAAO,EAAI,OAAS,UAC7D,EACJ,EAAW,EAAI,GAAG,EAAS,WAAa,EAAO,EAAI,GAAG,EAAK,WAAa,qBAE1E,MAAO,EAAI;;;;;;;;0CAQ6B,EAAM,QAAQ,UAAU,EAAM,UAAU;cACpE,EAAM,QAAU,cAAgB,UAAU;;;;;;cAM1C,EACE,CAAI,uBAAuB,EAAa;oCACpB,IAAgB,EAAO,EAAI,MAAM,EAAK,OAAS,GAAG;;wBAGtE,EAAQ;sCACc,KAAK,UAAU,EAAM,QAAU,EAAE,CAAE,KAAM,EAAE,CAAC;;;;sCAI5C,KAAK,UAAU,EAAM,QAAU,EAAE,CAAE,KAAM,EAAE,CAAC;;;;sCAI5C,KAAK,UAAU,EAAM,WAAa,EAAE,CAAE,KAAM,EAAE,CAAC;;;;;;;;;;;;uBAY9D,EAAM,WAAW;wBACf,GACT,EAAM,mBAAoB,EAAE,OAA6B,MAAM,CAAC;;gBAE/D,EAAM,WAEL,EADA,CAAI,wDACI;gBACV,EAAM,QAAQ,IAAK,GAAM,CAAI,iBAAiB,EAAE,GAAG,EAAE,WAAW,CAAC;;;;;;uBAM1D,EAAM,WAAW;uBAChB,GACR,EAAM,mBAAoB,EAAE,OAA+B,MAAM,CAAC;;;;;;+CAMnC,EAAM,OAAO;;UAElD,EAAM,UACJ,CAAI,yDAAyD,EAAM,UAAU,QAC7E,EAAQ;UACV,EAAM,WACJ,CAAI,qDAAqD,EAAM,WAAW,QAC1E,EAAQ;;;;;;;;EAQlB,KAAK,UAAU,EAAM,QAAU,EAAE,CAAE,KAAM,EAAE,CAAC;;;;;;;QAOtC,EAAM,SAAS,SAAW,EACxB,CAAI,qEACJ,CAAI;;gBAEE,EAAM,SAAS,IACd,GAAQ,CAAI;;;gDAGmB,EAAI,MAAM;8CACZ,IAAI,KAAK,EAAI,GAAG,CAAC,oBAAoB,CAAC;;;;EAIlF,EAAmB,EAAI,QAAQ,CAAC;;;;kBAKnB,CAAC;;YAEJ"}
@@ -0,0 +1,18 @@
1
+ var e=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`,t=8;function n(n=t){let r=``,i=e.length;for(let t=0;t<n;t++)r+=e.charAt(Math.floor(Math.random()*i));return r}function r(e,t=!0){return{id:t?n():e.id,type:e.type,content:e.content.map(e=>({text:e.text,styles:{...e.styles}})),children:e.children.map(e=>r(e,t)),props:{...e.props}}}function i(e,t=!0){return e.map(e=>r(e,t))}function a(e){return e.replace(/\r\n|\r/g,`
2
+ `)}function o(e,t){let n=a(e);return t===`\r
3
+ `?n.replace(/\n/g,`\r
4
+ `):n}var s=/[\\`*_{}[\]()#+\-.!|]/g;function c(e){return e.replace(s,`\\$&`)}function l(e){return e.replace(/\\([\\`*_{}[\]()#+\-.!|])/g,`$1`)}function u(e){return e.replace(/```/g,"\\`\\`\\`")}function d(e){return e.split(`
5
+ `).map(e=>e.trimEnd()).join(`
6
+ `)}function f(e){let t=e.split(`
7
+ `),n=0;for(;n<t.length&&t[n].trim()===``;)n++;let r=t.length-1;for(;r>=n&&t[r].trim()===``;)r--;return t.slice(n,r+1).join(`
8
+ `)}function p(e,t){let n=` `.repeat(t);return e.split(`
9
+ `).map(e=>e.trim()?n+e:e).join(`
10
+ `)}function m(e){return e.map(e=>e.text).join(``)}function h(e){return{text:e,styles:{}}}function g(e){return[h(e)]}function _(e){return e.content.length>0&&e.content.some(e=>e.text.length>0)}function ee(e){return e.children.length>0}function te(e){return Number.isInteger(e)&&e>=1&&e<=6}function ne(e){return[`paragraph`,`heading`,`bulletList`,`numberedList`,`checkList`,`codeBlock`,`blockquote`,`table`,`image`,`divider`,`callout`].includes(e)}function v(e,t=[],r={},i=[]){return{id:n(),type:e,content:t,children:i,props:r}}function re(e){return h(e)}function ie(e){return{text:e,styles:{bold:!0}}}function ae(e){return{text:e,styles:{italic:!0}}}function oe(e){return{text:e,styles:{code:!0}}}function se(e){return{text:e,styles:{strikethrough:!0}}}function ce(e){return{text:e,styles:{underline:!0}}}function le(e){return{text:e,styles:{highlight:!0}}}function ue(e,t,n){return{text:e,styles:{link:{url:t,title:n}}}}function de(e,t){return{text:e,styles:t}}function fe(...e){return e}function y(e){return v(`paragraph`,typeof e==`string`?g(e):e,{})}function b(e,t){return v(`heading`,typeof t==`string`?g(t):t,{level:e})}var pe=e=>b(1,e),me=e=>b(2,e),he=e=>b(3,e),ge=e=>b(4,e),_e=e=>b(5,e),ve=e=>b(6,e);function ye(e){return v(`bulletList`,[],{},e.map(e=>typeof e==`string`||Array.isArray(e)?y(e):e))}function be(e){return v(`numberedList`,[],{},e.map(e=>typeof e==`string`||Array.isArray(e)?y(e):e))}function x(e,t=!1){return v(`checkList`,typeof e==`string`?g(e):e,{checked:t})}function xe(e){return e.map(e=>x(e.content,e.checked??!1))}function Se(e,t){return v(`codeBlock`,g(e),{language:t})}function S(e){return v(`blockquote`,typeof e==`string`?g(e):e,{})}function C(){return v(`divider`,[],{})}function w(e,t,n){return v(`image`,[],{url:e,alt:t,title:n?.title,width:n?.width,height:n?.height})}function T(e,t){return v(`callout`,typeof t==`string`?g(t):t,{type:e})}var E=e=>T(`info`,e),D=e=>T(`warning`,e),O=e=>T(`tip`,e),k=e=>T(`danger`,e),A=e=>T(`note`,e);function j(e,t,n){return v(`table`,[],{headers:e,rows:t,alignments:n})}function Ce(e,...t){return{...e,content:[...e.content,...t]}}function we(e,...t){return{...e,content:[...t,...e.content]}}function Te(e,t){return{...e,content:t}}function Ee(e,...t){return{...e,children:[...e.children,...t]}}function De(e,t){return{...e,props:{...e.props,...t}}}var Oe=1;function M(e=[],t={}){let{meta:n={}}=t;return{version:1,blocks:i(e,!1),meta:{createdAt:new Date,updatedAt:new Date,...n}}}function ke(e={}){return M([],e)}function Ae(e){return{version:e.version,blocks:i(e.blocks,!0),meta:{...e.meta,createdAt:new Date,updatedAt:new Date}}}function N(e,t,n){let i=[...e.blocks],a=n??i.length;return i.splice(a,0,r(t,!1)),{...e,blocks:i,meta:{...e.meta,updatedAt:new Date}}}function je(e,t){return N(e,t)}function Me(e,t){return N(e,t,0)}function Ne(e,t,n){let r=[...e.blocks],a=n??r.length;return r.splice(a,0,...i(t,!1)),{...e,blocks:r,meta:{...e.meta,updatedAt:new Date}}}function Pe(e,t){let n=e.blocks.filter(e=>e.id!==t);return n.length===e.blocks.length?e:{...e,blocks:n,meta:{...e.meta,updatedAt:new Date}}}function Fe(e,t){let n=new Set(t),r=e.blocks.filter(e=>!n.has(e.id));return r.length===e.blocks.length?e:{...e,blocks:r,meta:{...e.meta,updatedAt:new Date}}}function P(e,t,n){let r=e.blocks.findIndex(e=>e.id===t);if(r===-1)return e;let i=[...e.blocks],a=i[r];return i[r]={...a,...n,id:a.id,type:a.type,content:n.content??a.content,children:n.children??a.children,props:n.props?{...a.props,...n.props}:a.props},{...e,blocks:i,meta:{...e.meta,updatedAt:new Date}}}function Ie(e,t,n){let i=e.blocks.findIndex(e=>e.id===t);if(i===-1)return e;let a=[...e.blocks];return a[i]=r(n,!1),{...e,blocks:a,meta:{...e.meta,updatedAt:new Date}}}function Le(e,t,n){let r=e.blocks.findIndex(e=>e.id===t);if(r===-1)return e;let i=Math.max(0,Math.min(n,e.blocks.length-1));if(r===i)return e;let a=[...e.blocks],[o]=a.splice(r,1);return a.splice(i,0,o),{...e,blocks:a,meta:{...e.meta,updatedAt:new Date}}}function Re(e,t,n){let r=e.blocks.findIndex(e=>e.id===t),i=e.blocks.findIndex(e=>e.id===n);if(r===-1||i===-1||r===i)return e;let a=[...e.blocks];return[a[r],a[i]]=[a[i],a[r]],{...e,blocks:a,meta:{...e.meta,updatedAt:new Date}}}function F(e,t){return e.blocks.find(e=>e.id===t)}function ze(e,t){return e.blocks.findIndex(e=>e.id===t)}function Be(e,t){return e.blocks[t]}function Ve(e){return e.blocks[0]}function He(e){return e.blocks[e.blocks.length-1]}function Ue(e,t){return e.blocks.filter(e=>e.type===t)}function We(e,t){return e.blocks.some(e=>e.id===t)}function Ge(e){return e.blocks.length}function Ke(e){return e.blocks.length===0}function qe(e,t,n){return P(e,t,{content:n})}function Je(e,t,n){let r=F(e,t);return r?P(e,t,{content:[...r.content,...n]}):e}function I(e,t){return{...e,meta:{...e.meta,...t,updatedAt:new Date}}}function Ye(e,t,n){return I(e,{[t]:n})}function Xe(e,t){return e.meta[t]}function Ze(e){return{...e,blocks:[],meta:{...e.meta,updatedAt:new Date}}}function Qe(e,t){return{...e,blocks:i(t,!1),meta:{...e.meta,updatedAt:new Date}}}function $e(e,t){let n=e.blocks.filter(t);return n.length===e.blocks.length?e:{...e,blocks:n,meta:{...e.meta,updatedAt:new Date}}}function et(e,t){return{...e,blocks:e.blocks.map(t),meta:{...e.meta,updatedAt:new Date}}}var tt={lineEnding:`
11
+ `,listIndent:2,headingStyle:`atx`,codeBlockStyle:`fenced`,bulletChar:`-`,emphasisChar:`*`};function L(e,t={}){let n={...tt,...t};return e.map((t,r)=>R(t,0,n,r,e)).filter(e=>e!==null).join(n.lineEnding+n.lineEnding)}function nt(e,t={}){return L(e.blocks,t)}function R(e,t,n,r=0,i=[]){switch(e.type){case`paragraph`:return rt(e,n);case`heading`:return it(e,n);case`bulletList`:return at(e,t,n);case`numberedList`:return ot(e,t,n,r,i);case`checkList`:return st(e,t,n);case`codeBlock`:return ct(e,n);case`blockquote`:return lt(e,n);case`table`:return dt(e,n);case`image`:return ut(e);case`divider`:return`---`;case`callout`:return ft(e,n);default:return B(e.content,n)}}function rt(e,t){return B(e.content,t)}function it(e,t){let n=e.props.level,r=B(e.content,t);if(t.headingStyle===`setext`&&(n===1||n===2)){let e=n===1?`=`:`-`;return`${r}${t.lineEnding}${e.repeat(r.length)}`}return`${`#`.repeat(n)} ${r}`}function at(e,t,n){let r=` `.repeat(t*n.listIndent),i=n.bulletChar;return e.children.map(e=>`${r}${i} ${z(e,t,n)}`).join(n.lineEnding)}function ot(e,t,n,r=0,i=[]){let a=` `.repeat(t*n.listIndent);return e.children.map((e,r)=>{let i=z(e,t,n);return`${a}${r+1}. ${i}`}).join(n.lineEnding)}function st(e,t,n){return`${` `.repeat(t*n.listIndent)}- [${e.props.checked?`x`:` `}] ${B(e.content,n)}`}function z(e,t,n){if(e.children.length>0){let r=B(e.content,n),i=e.children.map((r,i)=>R(r,t+1,n,i,e.children)).join(n.lineEnding);return`${r}${n.lineEnding}${i}`}return B(e.content,n)}function ct(e,t){let n=m(e.content),r=e.props.language??``;return t.codeBlockStyle===`indented`?n.split(`
12
+ `).map(e=>` ${e}`).join(t.lineEnding):`\`\`\`${r}${t.lineEnding}${n}${t.lineEnding}\`\`\``}function lt(e,t){return B(e.content,t).split(`
13
+ `).map(e=>`> ${e}`).join(t.lineEnding)}function ut(e){let t=e.props.alt??``,n=e.props.url??``,r=e.props.title;return r?`![${t}](${n} "${r}")`:`![${t}](${n})`}function dt(e,t){let{headers:n,rows:r,alignments:i}=e.props,a=t.lineEnding,o=n.map((e,t)=>{let n=r.map(e=>(e[t]??``).length);return Math.max(e.length,...n,3)}),s=n.map((e,t)=>e.padEnd(o[t])).join(` | `),c=n.map((e,t)=>{let n=o[t],r=i?.[t]??null;return r===`left`?`:${`-`.repeat(n-1)}`:r===`right`?`${`-`.repeat(n-1)}:`:r===`center`?`:${`-`.repeat(n-2)}:`:`-`.repeat(n)}).join(` | `),l=r.map(e=>e.map((e,t)=>(e??``).padEnd(o[t])).join(` | `));return[`| ${s} |`,`| ${c} |`,...l.map(e=>`| ${e} |`)].join(a)}function ft(e,t){let n=e.props.type.toUpperCase(),r=B(e.content,t),i=t.lineEnding;return`> [!${n}]${i}> ${r.split(`
14
+ `).join(`${i}> `)}`}function B(e,t){return e.map(e=>V(e,t)).join(``)}function V(e,t){let n=e.text,r=e.styles;if(!pt(r))return n;if(r.code&&(n=`\`${n}\``),r.highlight&&(n=`==${n}==`),r.strikethrough&&(n=`~~${n}~~`),r.bold&&r.italic){let e=t.emphasisChar;n=`${e}${e}${e}${n}${e}${e}${e}`}else{if(r.italic){let e=t.emphasisChar;n=`${e}${n}${e}`}if(r.bold){let e=t.emphasisChar;n=`${e}${e}${n}${e}${e}`}}if(r.underline&&(n=`<u>${n}</u>`),r.link){let{url:e,title:t}=r.link;n=t?`[${n}](${e} "${t}")`:`[${n}](${e})`}return n}function pt(e){return!!(e.bold||e.italic||e.underline||e.strikethrough||e.code||e.highlight||e.link)}function mt(e,t){return L(e,t)}var H={heading:/^(#{1,6})\s+(.*)$/,setextH1:/^=+\s*$/,setextH2:/^-+\s*$/,bulletList:/^(\s*)([-*+])\s+(.*)$/,numberedList:/^(\s*)(\d+)\.\s+(.*)$/,checkList:/^(\s*)[-*+]\s+\[([ xX])\]\s+(.*)$/,codeFence:/^(\s*)(`{3,}|~{3,})(\w*)?\s*$/,blockquote:/^>\s?(.*)$/,callout:/^>\s*\[!(\w+)\]\s*$/,divider:/^(\s*)(-{3,}|\*{3,}|_{3,})\s*$/,tableRow:/^\|(.+)\|$/,tableSeparator:/^\|[\s\-:|]+\|$/,image:/^!\[([^\]]*)\]\(([^)]+)\)$/,blank:/^\s*$/};function U(e){let t=e.split(/\r?\n/),n=[],r={inCodeBlock:!1,codeBlockFence:``,lineNumber:0};for(let e=0;e<t.length;e++){r.lineNumber=e+1;let i=t[e],a=ht(i,r,t,e);a&&n.push(a)}return n}function ht(e,t,n,r){let i=t.lineNumber;if(t.inCodeBlock)return e.match(H.codeFence)&&e.trim().startsWith(t.codeBlockFence.charAt(0))?(t.inCodeBlock=!1,t.codeBlockFence=``,{type:`code_fence_end`,raw:e,content:``,indent:0,line:i}):{type:`code_content`,raw:e,content:e,indent:0,line:i};let a=e.match(H.codeFence);if(a){t.inCodeBlock=!0,t.codeBlockFence=a[2];let n=a[3]||``;return{type:`code_fence_start`,raw:e,content:``,indent:(a[1]||``).length,line:i,meta:{language:n}}}if(H.blank.test(e))return{type:`blank`,raw:e,content:``,indent:0,line:i};let o=e.match(H.divider);if(o){let t=r>0?n[r-1]:``;if(t.trim()&&!H.blank.test(t))H.setextH2.test(e);else return{type:`divider`,raw:e,content:``,indent:(o[1]||``).length,line:i}}let s=e.match(H.heading);if(s)return{type:`heading`,raw:e,content:s[2].trim(),indent:0,line:i,meta:{level:s[1].length}};let c=e.match(H.callout);if(c)return{type:`callout`,raw:e,content:``,indent:0,line:i,meta:{calloutType:c[1].toLowerCase()}};let l=e.match(H.blockquote);if(l)return{type:`blockquote`,raw:e,content:l[1],indent:0,line:i};let u=e.match(H.checkList);if(u){let t=u[2].toLowerCase()===`x`;return{type:`check_list_item`,raw:e,content:u[3],indent:u[1].length,line:i,meta:{checked:t}}}let d=e.match(H.bulletList);if(d)return{type:`bullet_list_item`,raw:e,content:d[3],indent:d[1].length,line:i,meta:{listMarker:d[2]}};let f=e.match(H.numberedList);if(f)return{type:`numbered_list_item`,raw:e,content:f[3],indent:f[1].length,line:i,meta:{listIndex:parseInt(f[2],10)}};if(H.tableSeparator.test(e))return{type:`table_separator`,raw:e,content:e,indent:0,line:i};let p=e.match(H.tableRow);if(p)return{type:`table_row`,raw:e,content:p[1],indent:0,line:i};let m=e.match(H.image);if(m)return{type:`image`,raw:e,content:m[2],indent:0,line:i,meta:{language:m[1]}};if(H.setextH1.test(e)||H.setextH2.test(e)){let t=r>0?n[r-1]:``;return t.trim()&&!H.blank.test(t)?{type:`heading`,raw:e,content:t.trim(),indent:0,line:i,meta:{level:H.setextH1.test(e)?1:2}}:{type:`divider`,raw:e,content:``,indent:0,line:i}}return{type:`paragraph`,raw:e,content:e.trim(),indent:e.length-e.trimStart().length,line:i}}function gt(e){let t=[],n=[],r=null;for(let i of e){if(i.type===`blank`){n.length>0&&(t.push(n),n=[]),r=null;continue}r===i.type?n.push(i):(n.length>0&&t.push(n),n=[i],r=i.type)}return n.length>0&&t.push(n),t}function _t(e){return e.type===`bullet_list_item`||e.type===`numbered_list_item`||e.type===`check_list_item`}function vt(e){return e.type===`code_fence_start`||e.type===`code_fence_end`||e.type===`code_content`}function W(e){return e?xt(yt(e)):[]}function yt(e){let t=[],n=e,r=0;for(;r<n.length;){let e=Tt(n,r);e?(e.startIndex>r&&t.push({type:`text`,content:n.slice(r,e.startIndex)}),t.push(e.token),r=e.endIndex):r++}return G(e)}function G(e){let t=[],n=0,r=``,i=()=>{r&&=(t.push({type:`text`,content:r}),``)};for(;n<e.length;){if(e[n]===`\\`&&n+1<e.length){r+=e[n+1],n+=2;continue}if(e[n]==="`"){let r=K(e,n);if(r){i(),t.push(r.token),n=r.end;continue}}if(e[n]===`[`||e[n]===`!`&&e[n+1]===`[`){let r=e[n]===`!`,a=bt(e,r?n+1:n,r);if(a){i(),t.push(a.token),n=a.end;continue}}if(e[n]===`*`||e[n]===`_`){let r=q(e,n);if(r){i(),t.push(r.token),n=r.end;continue}}if(e[n]===`~`&&e[n+1]===`~`){let r=J(e,n);if(r){i(),t.push(r.token),n=r.end;continue}}if(e[n]===`=`&&e[n+1]===`=`){let r=Y(e,n);if(r){i(),t.push(r.token),n=r.end;continue}}r+=e[n],n++}return i(),t}function K(e,t){let n=0,r=t;for(;r<e.length&&e[r]==="`";)n++,r++;if(n===0)return null;let i="`".repeat(n),a=e.indexOf(i,r);return a===-1||e[a+n]==="`"?null:{token:{type:`code`,content:e.slice(r,a).trim()},end:a+n}}function bt(e,t,n=!1){if(e[t]!==`[`)return null;let r=1,i=t+1;for(;i<e.length&&r>0;)e[i]===`[`?r++:e[i]===`]`?r--:e[i]===`\\`&&i++,i++;if(r!==0)return null;let a=e.slice(t+1,i-1);if(e[i]!==`(`)return null;let o=i+1,s=o,c=1;for(;s<e.length&&c>0;)e[s]===`(`?c++:e[s]===`)`?c--:e[s]===`\\`&&s++,s++;if(c!==0)return null;let l=e.slice(o,s-1).trim(),u=l,d,f=l.match(/^(.+?)\s+["'](.+?)["']$/);f&&(u=f[1],d=f[2]);let p=G(a);return{token:n?{type:`image`,content:a,url:u,title:d,children:p}:{type:`link`,content:a,url:u,title:d,children:p},end:n?s+1:s}}function q(e,t){let n=e[t];if(n!==`*`&&n!==`_`)return null;let r=0,i=t;for(;i<e.length&&e[i]===n&&r<3;)r++,i++;if(r===0)return null;let a=n.repeat(r),o=i;for(;o<e.length;){let t=e.indexOf(a,o);if(t===-1)return null;if(e[t+r]===n){o=t+1;continue}if(e[t-1]===` `){o=t+1;continue}let s=e.slice(i,t);if(!s.trim()){o=t+1;continue}let c=G(s);return r===3?{token:{type:`bold`,content:s,children:[{type:`italic`,content:s,children:c}]},end:t+r}:r===2?{token:{type:`bold`,content:s,children:c},end:t+r}:{token:{type:`italic`,content:s,children:c},end:t+r}}return null}function J(e,t){if(e[t]!==`~`||e[t+1]!==`~`)return null;let n=e.indexOf(`~~`,t+2);if(n===-1)return null;let r=e.slice(t+2,n);return r.trim()?{token:{type:`strikethrough`,content:r,children:G(r)},end:n+2}:null}function Y(e,t){if(e[t]!==`=`||e[t+1]!==`=`)return null;let n=e.indexOf(`==`,t+2);if(n===-1)return null;let r=e.slice(t+2,n);return r.trim()?{token:{type:`highlight`,content:r,children:G(r)},end:n+2}:null}function xt(e){let t=[];for(let n of e){let e=X(n,{});t.push(...e)}return St(t)}function X(e,t){switch(e.type){case`text`:return[{text:e.content,styles:{...t}}];case`bold`:return Z(e,{...t,bold:!0});case`italic`:return Z(e,{...t,italic:!0});case`code`:return[{text:e.content,styles:{...t,code:!0}}];case`strikethrough`:return Z(e,{...t,strikethrough:!0});case`highlight`:return Z(e,{...t,highlight:!0});case`link`:return Z(e,{...t,link:{url:e.url||``,title:e.title}});case`image`:return[{text:`[image: ${e.content}]`,styles:t}];default:return[{text:e.content,styles:t}]}}function Z(e,t){if(e.children&&e.children.length>0){let n=[];for(let r of e.children)n.push(...X(r,t));return n}return[{text:e.content,styles:t}]}function St(e){if(e.length===0)return[];let t=[e[0]];for(let n=1;n<e.length;n++){let r=e[n],i=t[t.length-1];Ct(r.styles,i.styles)?i.text+=r.text:t.push(r)}return t}function Ct(e,t){return e.bold===t.bold&&e.italic===t.italic&&e.underline===t.underline&&e.strikethrough===t.strikethrough&&e.code===t.code&&e.highlight===t.highlight&&wt(e.link,t.link)}function wt(e,t){return!e&&!t?!0:!e||!t?!1:e.url===t.url&&e.title===t.title}function Tt(e,t){let n=[()=>K(e,t),()=>q(e,t),()=>J(e,t),()=>Y(e,t)];for(let e of n){let n=e();if(n)return{token:n.token,startIndex:t,endIndex:n.end}}return null}var Et={generateId:n,strict:!1};function Q(e,t={}){let n={...Et,...t};return kt(U(e),n)}function Dt(e,t={}){return M(Q(e,t))}function Ot(e,t){return Q(e,t)}function kt(e,t){let n=[],r={options:t,tokens:e,index:0};for(;r.index<e.length;){if(e[r.index].type===`blank`){r.index++;continue}let t=At(r);t&&n.push(t)}return n}function At(e){switch(e.tokens[e.index].type){case`heading`:return jt(e);case`paragraph`:return Mt(e);case`bullet_list_item`:return Nt(e);case`numbered_list_item`:return Pt(e);case`check_list_item`:return Ft(e);case`code_fence_start`:return It(e);case`blockquote`:return Lt(e);case`callout`:return Rt(e);case`divider`:return zt(e);case`table_row`:return $(e);case`image`:return Vt(e);default:return e.index++,null}}function jt(e){let t=e.tokens[e.index],n=t.meta?.level??1,r=W(t.content);return e.index++,{id:e.options.generateId(),type:`heading`,content:r,children:[],props:{level:n}}}function Mt(e){let t=[];for(;e.index<e.tokens.length&&e.tokens[e.index].type===`paragraph`;)t.push(e.tokens[e.index].content),e.index++;let n=W(t.join(` `));return{id:e.options.generateId(),type:`paragraph`,content:n,children:[],props:{}}}function Nt(e){let t=[],n=e.tokens[e.index].indent;for(;e.index<e.tokens.length&&e.tokens[e.index].type===`bullet_list_item`&&e.tokens[e.index].indent>=n;){let r=e.tokens[e.index];if(r.indent>n){e.index++;continue}let i=W(r.content);t.push({id:e.options.generateId(),type:`paragraph`,content:i,children:[],props:{}}),e.index++}return{id:e.options.generateId(),type:`bulletList`,content:[],children:t,props:{}}}function Pt(e){let t=[],n=e.tokens[e.index].indent;for(;e.index<e.tokens.length&&e.tokens[e.index].type===`numbered_list_item`&&e.tokens[e.index].indent>=n;){let r=e.tokens[e.index];if(r.indent>n){e.index++;continue}let i=W(r.content);t.push({id:e.options.generateId(),type:`paragraph`,content:i,children:[],props:{}}),e.index++}return{id:e.options.generateId(),type:`numberedList`,content:[],children:t,props:{}}}function Ft(e){let t=e.tokens[e.index],n=t.meta?.checked??!1,r=W(t.content);return e.index++,{id:e.options.generateId(),type:`checkList`,content:r,children:[],props:{checked:n}}}function It(e){let t=e.tokens[e.index].meta?.language??``,n=[];for(e.index++;e.index<e.tokens.length&&e.tokens[e.index].type===`code_content`;)n.push(e.tokens[e.index].content),e.index++;return e.index<e.tokens.length&&e.tokens[e.index].type===`code_fence_end`&&e.index++,{id:e.options.generateId(),type:`codeBlock`,content:g(n.join(`
15
+ `)),children:[],props:{language:t||void 0}}}function Lt(e){let t=[];for(;e.index<e.tokens.length&&e.tokens[e.index].type===`blockquote`;)t.push(e.tokens[e.index].content),e.index++;let n=W(t.join(`
16
+ `));return{id:e.options.generateId(),type:`blockquote`,content:n,children:[],props:{}}}function Rt(e){let t=e.tokens[e.index].meta?.calloutType??`note`;e.index++;let n=[];for(;e.index<e.tokens.length&&e.tokens[e.index].type===`blockquote`;)n.push(e.tokens[e.index].content),e.index++;let r=W(n.join(`
17
+ `));return{id:e.options.generateId(),type:`callout`,content:r,children:[],props:{type:t}}}function zt(e){return e.index++,{id:e.options.generateId(),type:`divider`,content:[],children:[],props:{}}}function $(e){let t=[],n=[],r=[],i=!0,a=!1;for(;e.index<e.tokens.length&&(e.tokens[e.index].type===`table_row`||e.tokens[e.index].type===`table_separator`);){let o=e.tokens[e.index];if(o.type===`table_separator`){r=Bt(o.content),a=!0,e.index++;continue}let s=o.content.split(`|`).map(e=>e.trim()).filter(e=>e!==``);i&&!a?(n=s,i=!1):a&&t.push(s),e.index++}return!a&&n.length>0&&(t.unshift(n),n=[]),{id:e.options.generateId(),type:`table`,content:[],children:[],props:{headers:n,rows:t,alignments:r.length>0?r:void 0}}}function Bt(e){return e.split(`|`).map(e=>e.trim()).filter(e=>e!==``).map(e=>{let t=e.startsWith(`:`),n=e.endsWith(`:`);return t&&n?`center`:t?`left`:n?`right`:null})}function Vt(e){let t=e.tokens[e.index],n=t.content,r=t.meta?.language??``;return e.index++,{id:e.options.generateId(),type:`image`,content:[],children:[],props:{url:n,alt:r||void 0}}}function Ht(e){return M(Q(e))}function Ut(e){return L(Array.isArray(e)?e:e.blocks)}var Wt=`2.0.0`;export{Oe as DOCUMENT_VERSION,Wt as VERSION,Ee as addChildren,je as appendBlock,Je as appendBlockContent,Ce as appendContent,S as blockquote,L as blocksToMarkdown,ie as bold,ye as bulletList,T as callout,xe as checkList,x as checkListItem,Ze as clearBlocks,Ae as cloneDocument,oe as code,Se as codeBlock,o as convertLineEndings,v as createBlock,M as createDocument,k as dangerCallout,r as deepClone,i as deepCloneBlocks,C as divider,nt as documentToMarkdown,ke as emptyDocument,u as escapeCodeBlock,c as escapeMarkdown,$e as filterBlocks,F as findBlock,Ue as findBlocksByType,Ht as fromMarkdown,n as generateId,Be as getBlockAt,Ge as getBlockCount,ze as getBlockIndex,Ve as getFirstBlock,He as getLastBlock,Xe as getMetaField,gt as groupTokens,pe as h1,me as h2,he as h3,ge as h4,_e as h5,ve as h6,We as hasBlock,ee as hasChildren,_ as hasContent,b as heading,le as highlight,w as image,p as indent,E as infoCallout,N as insertBlock,Ne as insertBlocks,vt as isCodeToken,Ke as isEmpty,_t as isListToken,ne as isValidBlockType,te as isValidHeadingLevel,ae as italic,ue as link,et as mapBlocks,Q as markdownToBlocks,Dt as markdownToDocument,Le as moveBlock,a as normalizeLineEndings,A as noteCallout,be as numberedList,y as paragraph,Ot as parse,W as parseInlineContent,g as plainContent,h as plainSpan,Me as prependBlock,we as prependContent,Pe as removeBlock,Fe as removeBlocks,Ie as replaceBlock,R as serializeBlock,B as serializeInlineContent,V as serializeSpan,qe as setBlockContent,Qe as setBlocks,Te as setContent,Ye as setMetaField,fe as spans,m as spansToPlainText,se as strikethrough,mt as stringify,de as styled,Re as swapBlocks,j as table,re as text,O as tipCallout,Ut as toMarkdown,U as tokenize,f as trimBlankLines,d as trimTrailingWhitespace,ce as underline,l as unescapeMarkdown,P as updateBlock,I as updateMeta,De as updateProps,D as warningCallout};
18
+ //# sourceMappingURL=dist-D8DZLmCF.js.map