@xopcai/xopc 0.0.75 → 0.0.77
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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agents-Bq-2L2z0.js → agents-DN3vr8pb.js} +2 -2
- package/dist/gateway/static/root/assets/{agents-Bq-2L2z0.js.map → agents-DN3vr8pb.js.map} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-DitlAmYZ.js → apps-page-BUn41aPi.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-DitlAmYZ.js.map → apps-page-BUn41aPi.js.map} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-BzJYkjyh.js → channels-settings-CYMmWDtP.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-BzJYkjyh.js.map → channels-settings-CYMmWDtP.js.map} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-CiY7i2IN.js → channels-status-swr-sJj4ueTp.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-status-swr-CiY7i2IN.js.map → channels-status-swr-sJj4ueTp.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-S4gy4e5e.js → cron-api-CLxnaHdq.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-api-S4gy4e5e.js.map → cron-api-CLxnaHdq.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-7uMZvuju.js → cron-page-BAQ8xSnJ.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-7uMZvuju.js.map → cron-page-BAQ8xSnJ.js.map} +1 -1
- package/dist/gateway/static/root/assets/{dist-DXGDHevt.js → dist-BfJYxiK5.js} +2 -2
- package/dist/gateway/static/root/assets/{dist-DXGDHevt.js.map → dist-BfJYxiK5.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DYLqqlXt.js → extension-debug-page-bgvVs-Sy.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-DYLqqlXt.js.map → extension-debug-page-bgvVs-Sy.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-H9Odxw56.js → extension-page-SG4TVv-u.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-H9Odxw56.js.map → extension-page-SG4TVv-u.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Ch6vY8Uy.js → extension-settings-page-CJZRTsjF.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-Ch6vY8Uy.js.map → extension-settings-page-CJZRTsjF.js.map} +1 -1
- package/dist/gateway/static/root/assets/{field-primitives-CrexIsCD.js → field-primitives-Z76hyBYS.js} +2 -2
- package/dist/gateway/static/root/assets/{field-primitives-CrexIsCD.js.map → field-primitives-Z76hyBYS.js.map} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-CVGIOMMM.js → heartbeat-config-api-BqfDabSI.js} +2 -2
- package/dist/gateway/static/root/assets/{heartbeat-config-api-CVGIOMMM.js.map → heartbeat-config-api-BqfDabSI.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-S3bgG2JF.js → index-ChiUhJAs.js} +44 -41
- package/dist/gateway/static/root/assets/{index-S3bgG2JF.js.map → index-ChiUhJAs.js.map} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-BKpRWihz.js → logs-page-DrIMhDE2.js} +2 -2
- package/dist/gateway/static/root/assets/{logs-page-BKpRWihz.js.map → logs-page-DrIMhDE2.js.map} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-BRFJ-djK.js → sessions-page-B-RGO3N0.js} +2 -2
- package/dist/gateway/static/root/assets/{sessions-page-BRFJ-djK.js.map → sessions-page-B-RGO3N0.js.map} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-cS13ImiU.js → settings-form-section-Csvl1iL6.js} +2 -2
- package/dist/gateway/static/root/assets/{settings-form-section-cS13ImiU.js.map → settings-form-section-Csvl1iL6.js.map} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-D99K6Jjx.js → settings-page-nxAc0ta1.js} +2 -2
- package/dist/gateway/static/root/assets/{settings-page-D99K6Jjx.js.map → settings-page-nxAc0ta1.js.map} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-CjBO9BH2.js → skills-page-dHwx2vh0.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-CjBO9BH2.js.map → skills-page-dHwx2vh0.js.map} +1 -1
- package/dist/gateway/static/root/assets/{utils-DVw8OvAC.js → utils-COYrNFF7.js} +2 -2
- package/dist/gateway/static/root/assets/{utils-DVw8OvAC.js.map → utils-COYrNFF7.js.map} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-BIh7mDN6.js → voice-api-key-field-5WZZaxH3.js} +2 -2
- package/dist/gateway/static/root/assets/{voice-api-key-field-BIh7mDN6.js.map → voice-api-key-field-5WZZaxH3.js.map} +1 -1
- package/dist/gateway/static/root/index.html +1 -1
- package/dist/package.js +1 -1
- package/dist/src/agent/embedded/session-manager-init.js +5 -1
- package/dist/src/agent/embedded/session-manager-init.js.map +1 -1
- package/dist/src/channels/index.js +1 -1
- package/dist/src/channels/manager.js +1 -1
- package/dist/src/cli/commands/channels.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/service.js +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat-config-api-CVGIOMMM.js","names":["useCallback","useMemo","useReducer","useRef","ChangeEvent","buildCronFromPickerState","cronExpressionToPickerState","IntervalKind","PickerState","SchedulePickerMode","cn","formControlBorderFocusClass","selectControlBaseClass","MINUTE_VALUES","Array","from","length","_","idx","CronSchedulePickerLabels","scheduleTimeLabel","modeNoRepeat","modeInterval","intervalKindMinutes","intervalKindHours","modeHourly","modeDaily","modeWeekly","modeMonthly","modeCustom","minuteUnit","minuteAtHour","intervalMinutes","intervalHours","hourUnit","dayOfMonth","customCronHint","weekdays","pickerSelectClass","timeInputClass","dateInputClass","numberInputClass","cronTextareaClass","InternalState","intervalMinutesDraft","intervalHoursDraft","fromParsed","parsed","toPickerState","state","_minutesDraft","_hoursDraft","picker","PickerAction","type","pickerReducer","_state","action","CronSchedulePickerProps","value","onChange","cron","labels","disabled","showHeading","CronSchedulePicker","dispatch","trackedValueRef","current","commitPicker","patch","Partial","nextState","nextPicker","prevPicker","pickerChanged","Object","keys","some","key","mode","intervalKind","onceDate","minute","hour","weekDays","rawCron","timeValue","String","padStart","onTimeChange","e","HTMLInputElement","v","target","hh","mm","split","map","x","parseInt","Number","isNaN","modeRow","next","k","raw","isFinite","Math","min","max","round","m","d","i","weekRow","label","on","customBlock","fetchJson","apiUrl","heartbeatMdSwrKey","fetchHeartbeatMdSwr","Promise","res","ok","payload","content","revalidateGatewayConfig","fetchJson","apiUrl","heartbeatMdSwrKey","mutate","HeartbeatSettingsState","isRecord","v","Record","Array","isArray","normalizeHeartbeatFromConfig","config","c","gw","gateway","hb","heartbeat","ahRaw","activeHours","ah","start","end","timezone","enabled","Boolean","intervalMs","Number","isFinite","includeSystemPromptSection","target","targetChatId","prompt","ackMaxChars","isolatedSession","buildHeartbeatPayload","state","p","trim","undefined","patchHeartbeatSettings","Promise","method","body","JSON","stringify","putHeartbeatMd","content","triggerHeartbeat","reason","headers"],"sources":["../../../../../web/src/features/scheduling/cron/cron-schedule-picker.tsx","../../../../../web/src/features/settings/heartbeat-md-swr.ts","../../../../../web/src/features/settings/heartbeat-config-api.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer, useRef, type ChangeEvent } from 'react';\n\nimport {\n buildCronFromPickerState,\n cronExpressionToPickerState,\n type IntervalKind,\n type PickerState,\n type SchedulePickerMode,\n} from '@/features/scheduling/cron/cron-expression';\nimport { cn } from '@/lib/cn';\nimport { formControlBorderFocusClass, selectControlBaseClass } from '@/lib/form-field-width';\n\nexport type { IntervalKind, PickerState, SchedulePickerMode } from '@/features/scheduling/cron/cron-expression';\nexport { buildCronFromPickerState, cronExpressionToPickerState } from '@/features/scheduling/cron/cron-expression';\n\nconst MINUTE_VALUES: readonly number[] = Array.from({ length: 60 }, (_, idx) => idx);\n\nexport type CronSchedulePickerLabels = {\n scheduleTimeLabel: string;\n modeNoRepeat: string;\n modeInterval: string;\n intervalKindMinutes: string;\n intervalKindHours: string;\n modeHourly: string;\n modeDaily: string;\n modeWeekly: string;\n modeMonthly: string;\n modeCustom: string;\n minuteUnit: string;\n minuteAtHour: string;\n intervalMinutes: string;\n intervalHours: string;\n hourUnit: string;\n dayOfMonth: string;\n customCronHint: string;\n weekdays: readonly string[];\n};\n\nconst pickerSelectClass = cn(\n selectControlBaseClass,\n 'min-w-0 shrink text-xs sm:min-w-[7rem] sm:max-w-[11rem]',\n);\n\nconst timeInputClass = cn(\n 'h-9 min-w-[6.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg',\n formControlBorderFocusClass,\n 'dark:bg-surface-panel',\n);\n\nconst dateInputClass = cn(\n 'h-9 min-w-[9.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg',\n formControlBorderFocusClass,\n);\n\nconst numberInputClass = cn(\n 'h-9 w-14 shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-center text-sm tabular-nums text-fg',\n formControlBorderFocusClass,\n);\n\nconst cronTextareaClass = cn(\n 'min-h-[2.5rem] w-full rounded-lg border border-edge-subtle bg-surface-base px-3 py-2 font-mono text-xs text-fg',\n formControlBorderFocusClass,\n);\n\ntype InternalState = PickerState & {\n intervalMinutesDraft: string | null;\n intervalHoursDraft: string | null;\n};\n\nfunction fromParsed(parsed: PickerState): InternalState {\n return { ...parsed, intervalMinutesDraft: null, intervalHoursDraft: null };\n}\n\nfunction toPickerState(state: InternalState): PickerState {\n const { intervalMinutesDraft: _minutesDraft, intervalHoursDraft: _hoursDraft, ...picker } = state;\n return picker;\n}\n\ntype PickerAction =\n | { type: 'reset'; state: PickerState }\n | { type: 'replace'; state: InternalState };\n\nfunction pickerReducer(_state: InternalState, action: PickerAction): InternalState {\n switch (action.type) {\n case 'reset':\n return fromParsed(action.state);\n case 'replace':\n return action.state;\n }\n}\n\ntype CronSchedulePickerProps = {\n value: string;\n onChange: (cron: string) => void;\n labels: CronSchedulePickerLabels;\n disabled?: boolean;\n /** When false, hides the top \"Scheduled time\" label (e.g. when wrapped by ScheduleField). */\n showHeading?: boolean;\n};\n\nexport function CronSchedulePicker({\n value,\n onChange,\n labels,\n disabled,\n showHeading = true,\n}: CronSchedulePickerProps) {\n const parsed = useMemo(() => cronExpressionToPickerState(value), [value]);\n const [state, dispatch] = useReducer(pickerReducer, parsed, fromParsed);\n\n const trackedValueRef = useRef(value);\n if (trackedValueRef.current !== value) {\n trackedValueRef.current = value;\n dispatch({ type: 'reset', state: parsed });\n }\n\n const commitPicker = useCallback(\n (patch: Partial<InternalState>) => {\n const nextState = { ...state, ...patch };\n dispatch({ type: 'replace', state: nextState });\n const nextPicker = toPickerState(nextState);\n const prevPicker = toPickerState(state);\n const pickerChanged = (Object.keys(nextPicker) as (keyof PickerState)[]).some(\n (key) => nextPicker[key] !== prevPicker[key],\n );\n if (pickerChanged) {\n onChange(buildCronFromPickerState(nextPicker));\n }\n },\n [onChange, state],\n );\n\n const {\n mode,\n intervalKind,\n onceDate,\n intervalMinutes,\n intervalHours,\n minute,\n hour,\n weekDays,\n dayOfMonth,\n rawCron,\n intervalMinutesDraft,\n intervalHoursDraft,\n } = state;\n\n const timeValue = `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n\n const onTimeChange = (e: ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n if (!v) return;\n const [hh, mm] = v.split(':').map((x) => parseInt(x, 10));\n if (Number.isNaN(hh) || Number.isNaN(mm)) return;\n commitPicker({ minute: mm, hour: hh });\n };\n\n const modeRow = (\n <div className=\"flex min-w-0 flex-nowrap items-center gap-2 overflow-x-auto pb-0.5\">\n <select\n className={pickerSelectClass}\n disabled={disabled}\n value={mode}\n onChange={(e) => {\n const next = e.target.value as SchedulePickerMode;\n commitPicker({ mode: next });\n }}\n aria-label={labels.scheduleTimeLabel}\n >\n <option value=\"no_repeat\">{labels.modeNoRepeat}</option>\n <option value=\"interval\">{labels.modeInterval}</option>\n <option value=\"hourly\">{labels.modeHourly}</option>\n <option value=\"daily\">{labels.modeDaily}</option>\n <option value=\"weekly\">{labels.modeWeekly}</option>\n <option value=\"monthly\">{labels.modeMonthly}</option>\n <option value=\"custom\">{labels.modeCustom}</option>\n </select>\n\n {mode === 'no_repeat' && (\n <>\n <input\n type=\"date\"\n disabled={disabled}\n className={dateInputClass}\n value={onceDate}\n onChange={(e) => {\n commitPicker({ onceDate: e.target.value });\n }}\n aria-label={labels.modeNoRepeat}\n />\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n </>\n )}\n\n {mode === 'interval' && (\n <>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[5rem]')}\n disabled={disabled}\n value={intervalKind}\n onChange={(e) => {\n const k = e.target.value as IntervalKind;\n commitPicker({ intervalKind: k, intervalMinutesDraft: null, intervalHoursDraft: null });\n }}\n aria-label={labels.modeInterval}\n >\n <option value=\"minutes\">{labels.intervalKindMinutes}</option>\n <option value=\"hours\">{labels.intervalKindHours}</option>\n </select>\n {intervalKind === 'minutes' ? (\n <>\n <input\n type=\"number\"\n min={1}\n max={59}\n disabled={disabled}\n className={numberInputClass}\n value={intervalMinutesDraft ?? String(intervalMinutes)}\n onChange={(e) => {\n const next = e.target.value;\n const raw = parseInt(next, 10);\n const patch: Partial<InternalState> = { intervalMinutesDraft: next };\n if (Number.isFinite(raw) && raw >= 1 && raw <= 59) {\n patch.intervalMinutes = raw;\n }\n commitPicker(patch);\n }}\n onBlur={() => {\n if (intervalMinutesDraft === null) return;\n const raw = parseInt(intervalMinutesDraft, 10);\n const v =\n !Number.isFinite(raw) || raw < 1\n ? 5\n : Math.min(59, Math.max(1, Math.round(raw)));\n commitPicker({ intervalMinutes: v, intervalMinutesDraft: null });\n }}\n aria-label={labels.intervalMinutes}\n />\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.minuteUnit}</span>\n </>\n ) : (\n <>\n <input\n type=\"number\"\n min={1}\n max={23}\n disabled={disabled}\n className={numberInputClass}\n value={intervalHoursDraft ?? String(intervalHours)}\n onChange={(e) => {\n const next = e.target.value;\n const raw = parseInt(next, 10);\n const patch: Partial<InternalState> = { intervalHoursDraft: next };\n if (Number.isFinite(raw) && raw >= 1 && raw <= 23) {\n patch.intervalHours = raw;\n }\n commitPicker(patch);\n }}\n onBlur={() => {\n if (intervalHoursDraft === null) return;\n const raw = parseInt(intervalHoursDraft, 10);\n const v =\n !Number.isFinite(raw) || raw < 1\n ? 2\n : Math.min(23, Math.max(1, Math.round(raw)));\n commitPicker({ intervalHours: v, intervalHoursDraft: null });\n }}\n aria-label={labels.intervalHours}\n />\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.hourUnit}</span>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[4rem]')}\n disabled={disabled}\n value={minute}\n onChange={(e) => {\n const mm = parseInt(e.target.value, 10);\n commitPicker({ minute: mm });\n }}\n aria-label={labels.minuteAtHour}\n >\n {MINUTE_VALUES.map((m) => (\n <option key={m} value={m}>\n {String(m).padStart(2, '0')}\n </option>\n ))}\n </select>\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.minuteUnit}</span>\n </>\n )}\n </>\n )}\n\n {mode === 'daily' && (\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n )}\n\n {mode === 'weekly' && (\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n )}\n\n {mode === 'monthly' && (\n <>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[4.5rem]')}\n disabled={disabled}\n value={dayOfMonth}\n onChange={(e) => {\n const d = parseInt(e.target.value, 10);\n commitPicker({ dayOfMonth: d });\n }}\n aria-label={labels.dayOfMonth}\n >\n {Array.from({ length: 31 }, (_, i) => i + 1).map((d) => (\n <option key={d} value={d}>\n {d}\n </option>\n ))}\n </select>\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n </>\n )}\n\n {mode === 'hourly' && (\n <>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[4rem]')}\n disabled={disabled}\n value={minute}\n onChange={(e) => {\n const mm = parseInt(e.target.value, 10);\n commitPicker({ minute: mm });\n }}\n aria-label={labels.minuteAtHour}\n >\n {MINUTE_VALUES.map((m) => (\n <option key={m} value={m}>\n {String(m).padStart(2, '0')}\n </option>\n ))}\n </select>\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.minuteUnit}</span>\n </>\n )}\n </div>\n );\n\n const weekRow =\n mode === 'weekly' ? (\n <div className=\"flex flex-wrap gap-1.5 pt-1\" role=\"group\" aria-label={labels.modeWeekly}>\n {labels.weekdays.map((label, i) => {\n const on = weekDays[i];\n return (\n <button\n key={label}\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'flex size-9 select-none items-center justify-center rounded-full border text-xs font-medium transition-colors',\n on\n ? 'border-fg bg-fg text-surface-panel'\n : 'border-edge-subtle bg-surface-panel text-fg hover:border-edge',\n )}\n aria-pressed={on}\n onClick={() => {\n const next = [...weekDays];\n next[i] = !next[i];\n commitPicker({ weekDays: next });\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n ) : null;\n\n const customBlock =\n mode === 'custom' ? (\n <div className=\"pt-1\">\n <textarea\n disabled={disabled}\n className={cronTextareaClass}\n rows={2}\n spellCheck={false}\n value={rawCron}\n placeholder=\"*/5 * * * *\"\n onChange={(e) => {\n commitPicker({ rawCron: e.target.value });\n }}\n aria-label={labels.modeCustom}\n />\n <p className=\"mt-1 text-xs text-fg-muted\">{labels.customCronHint}</p>\n </div>\n ) : null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {showHeading ? (\n <span className=\"text-xs font-medium text-fg-muted\">{labels.scheduleTimeLabel}</span>\n ) : null}\n {modeRow}\n {weekRow}\n {customBlock}\n </div>\n );\n}\n","import { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport function heartbeatMdSwrKey(): string {\n return apiUrl('/api/workspace/heartbeat-md');\n}\n\nexport async function fetchHeartbeatMdSwr(): Promise<string> {\n const res = await fetchJson<{ ok?: boolean; payload?: { content?: string } }>(heartbeatMdSwrKey());\n return typeof res.payload?.content === 'string' ? res.payload.content : '';\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { heartbeatMdSwrKey } from '@/features/settings/heartbeat-md-swr';\nimport { mutate } from 'swr';\n\nimport type { HeartbeatSettingsState } from './heartbeat-settings.types';\n\nexport type { HeartbeatSettingsState } from './heartbeat-settings.types';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function normalizeHeartbeatFromConfig(config: unknown): HeartbeatSettingsState {\n const c = isRecord(config) ? config : {};\n const gw = isRecord(c.gateway) ? c.gateway : {};\n const hb = isRecord(gw.heartbeat) ? gw.heartbeat : {};\n const ahRaw = hb.activeHours;\n const ah = isRecord(ahRaw) ? ahRaw : null;\n const activeHours =\n ah && typeof ah.start === 'string' && typeof ah.end === 'string' && ah.start && ah.end\n ? {\n start: ah.start,\n end: ah.end,\n timezone: typeof ah.timezone === 'string' ? ah.timezone : '',\n }\n : null;\n return {\n enabled: Boolean(hb.enabled ?? true),\n intervalMs: typeof hb.intervalMs === 'number' && Number.isFinite(hb.intervalMs) ? hb.intervalMs : 1_800_000,\n includeSystemPromptSection: hb.includeSystemPromptSection === true,\n target: typeof hb.target === 'string' ? hb.target : '',\n targetChatId: typeof hb.targetChatId === 'string' ? hb.targetChatId : '',\n prompt: typeof hb.prompt === 'string' ? hb.prompt : '',\n ackMaxChars:\n typeof hb.ackMaxChars === 'number' && Number.isFinite(hb.ackMaxChars) ? hb.ackMaxChars : '',\n isolatedSession: Boolean(hb.isolatedSession),\n activeHours,\n };\n}\n\nfunction buildHeartbeatPayload(state: HeartbeatSettingsState): Record<string, unknown> {\n const p: Record<string, unknown> = {\n enabled: state.enabled,\n intervalMs: state.intervalMs,\n includeSystemPromptSection: state.includeSystemPromptSection,\n };\n if (state.target.trim()) p.target = state.target.trim();\n else p.target = null;\n if (state.targetChatId.trim()) p.targetChatId = state.targetChatId.trim();\n else p.targetChatId = null;\n if (state.prompt.trim()) p.prompt = state.prompt.trim();\n else p.prompt = null;\n if (state.ackMaxChars === '' || state.ackMaxChars === undefined) {\n p.ackMaxChars = null;\n } else {\n p.ackMaxChars = state.ackMaxChars;\n }\n if (state.isolatedSession) p.isolatedSession = true;\n else p.isolatedSession = null;\n if (state.activeHours?.start?.trim() && state.activeHours?.end?.trim()) {\n p.activeHours = {\n start: state.activeHours.start.trim(),\n end: state.activeHours.end.trim(),\n ...(state.activeHours.timezone.trim()\n ? { timezone: state.activeHours.timezone.trim() }\n : {}),\n };\n } else {\n p.activeHours = null;\n }\n return p;\n}\n\nexport async function patchHeartbeatSettings(state: HeartbeatSettingsState): Promise<void> {\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n gateway: {\n heartbeat: buildHeartbeatPayload(state),\n },\n }),\n });\n void revalidateGatewayConfig();\n}\n\nexport async function putHeartbeatMd(content: string): Promise<void> {\n await fetchJson(apiUrl('/api/workspace/heartbeat-md'), {\n method: 'PUT',\n body: JSON.stringify({ content }),\n });\n void mutate(heartbeatMdSwrKey());\n}\n\n/** Queue one heartbeat run (same path as the interval timer). */\nexport async function triggerHeartbeat(reason?: string): Promise<void> {\n await fetchJson(apiUrl('/api/heartbeat/trigger'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(reason ? { reason } : {}),\n });\n}\n"],"mappings":"wXAeMa,EAAmCC,MAAMC,KAAK,CAAEC,OAAQ,EAAG,GAAIC,EAAGC,IAAQA,CAAG,EAuB7EoB,EAAoB5B,EACxBE,EACA,yDACF,EAEM2B,EAAiB7B,EACrB,gHACAC,EACA,uBACF,EAEM6B,EAAiB9B,EACrB,gHACAC,CACF,EAEM8B,EAAmB/B,EACvB,+HACAC,CACF,EAEM+B,EAAoBhC,EACxB,iHACAC,CACF,EAOA,SAASmC,EAAWC,EAAoC,CACtD,MAAO,CAAE,GAAGA,EAAQH,qBAAsB,KAAMC,mBAAoB,IAAK,CAC3E,CAEA,SAASG,EAAcC,EAAmC,CACxD,GAAM,CAAEL,qBAAsBM,EAAeL,mBAAoBM,EAAa,GAAGC,GAAWH,EAC5F,OAAOG,CACT,CAMA,SAASG,EAAcC,EAAuBC,EAAqC,CACjF,OAAQA,EAAOH,KAAf,CACE,IAAK,QACH,OAAOR,EAAWW,EAAOR,KAAK,EAChC,IAAK,UACH,OAAOQ,EAAOR,KAClB,CACF,CAWA,SAAgBgB,EAAmB,CACjCN,QACAC,WACAE,SACAC,WACAC,cAAc,IACY,CAC1B,IAAMjB,GAAAA,EAAAA,EAAAA,aAAuBzC,EAA4BqD,CAAK,EAAG,CAACA,CAAK,CAAC,EAClE,CAACV,EAAOiB,IAAAA,EAAAA,EAAAA,YAAuBX,EAAeR,EAAQD,CAAU,EAEhEqB,GAAAA,EAAAA,EAAAA,QAAyBR,CAAK,EAChCQ,EAAgBC,UAAYT,IAC9BQ,EAAgBC,QAAUT,EAC1BO,EAAS,CAAEZ,KAAM,QAASL,MAAOF,CAAO,CAAC,GAG3C,IAAMsB,GAAAA,EAAAA,EAAAA,aACHC,GAAkC,CACjC,IAAME,EAAY,CAAE,GAAGvB,EAAO,GAAGqB,CAAM,EACvCJ,EAAS,CAAEZ,KAAM,UAAWL,MAAOuB,CAAU,CAAC,EAC9C,IAAMC,EAAazB,EAAcwB,CAAS,EACpCE,EAAa1B,EAAcC,CAAK,EACf2B,OAAOC,KAAKJ,CAAU,EAA4BK,KACtEC,GAAQN,EAAWM,KAASL,EAAWK,EAEtCJ,GACFf,EAASvD,EAAyBoE,CAAU,CAAC,CAEjD,EACA,CAACb,EAAUX,CAAK,CAClB,EAEM,CACJ+B,OACAC,eACAC,WACAlD,kBACAC,gBACAkD,SACAC,OACAC,WACAlD,aACAmD,UACA1C,uBACAC,sBACEI,EAEEsC,EAAY,GAAGC,OAAOJ,CAAI,EAAEK,SAAS,EAAG,GAAG,EAAC,GAAID,OAAOL,CAAM,EAAEM,SAAS,EAAG,GAAG,IAE9EC,EAAgBC,GAAqC,CACzD,IAAME,EAAIF,EAAEG,OAAOnC,MACnB,GAAI,CAACkC,EAAG,OACR,GAAM,CAACE,EAAIC,GAAMH,EAAEI,MAAM,GAAG,EAAEC,IAAKC,GAAMC,SAASD,EAAG,EAAE,CAAC,EACpDE,OAAOC,MAAMP,CAAE,GAAKM,OAAOC,MAAMN,CAAE,GACvC3B,EAAa,CAAEc,OAAQa,EAAIZ,KAAMW,CAAG,CAAC,CACvC,EAEMQ,GACJ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,8EAAf,EACE,EAAA,EAAA,MAAC,SAAD,CACE,UAAWjE,EACDyB,WACV,MAAOiB,EACP,SAAWW,GAAM,CACf,IAAMa,EAAOb,EAAEG,OAAOnC,MACtBU,EAAa,CAAEW,KAAMwB,CAAK,CAAC,CAC7B,EACA,aAAY1C,EAAO1C,2BARrB,EAUE,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,qBAAa0C,EAAOzC,YAAqB,CAAA,GACvD,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,oBAAYyC,EAAOxC,YAAqB,CAAA,GACtD,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAUwC,EAAOrC,UAAmB,CAAA,GAClD,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,iBAASqC,EAAOpC,SAAkB,CAAA,GAChD,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAUoC,EAAOnC,UAAmB,CAAA,GAClD,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,mBAAWmC,EAAOlC,WAAoB,CAAA,GACpD,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAUkC,EAAOjC,UAAmB,CAAA,CAC5C,IAEPmD,IAAS,cACR,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,OACKjB,WACV,UAAWvB,EACX,MAAO0C,EACP,SAAWS,GAAM,CACftB,EAAa,CAAEa,SAAUS,EAAEG,OAAOnC,KAAM,CAAC,CAC3C,EACA,aAAYG,EAAOzC,YAAa,CAAA,GAElC,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,OACL,KAAM,GACI0C,WACV,UAAWxB,EACX,MAAOgD,EACP,SAAUG,EACV,aAAY5B,EAAO1C,iBAAkB,CAAA,CAEzC,CAAA,CAAA,EAGD4D,IAAS,aACR,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,MAAC,SAAD,CACE,UAAWtE,EAAG4B,EAAmB,qBAAqB,EAC5CyB,WACV,MAAOkB,EACP,SAAWU,GAAM,CACf,IAAMc,EAAId,EAAEG,OAAOnC,MACnBU,EAAa,CAAEY,aAAcwB,EAAG7D,qBAAsB,KAAMC,mBAAoB,IAAK,CAAC,CACxF,EACA,aAAYiB,EAAOxC,sBARrB,EAUE,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,mBAAWwC,EAAOvC,mBAA4B,CAAA,GAC5D,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,iBAASuC,EAAOtC,iBAA0B,CAAA,CAClD,IACPyD,IAAiB,WAChB,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,SACL,IAAK,EACL,IAAK,GACKlB,WACV,UAAWtB,EACX,MAAOG,GAAwB4C,OAAOxD,CAAe,EACrD,SAAW2D,GAAM,CACf,IAAMa,EAAOb,EAAEG,OAAOnC,MAChB+C,EAAMN,SAASI,EAAM,EAAE,EACvBlC,EAAgC,CAAE1B,qBAAsB4D,CAAK,EAC/DH,OAAOM,SAASD,CAAG,GAAKA,GAAO,GAAKA,GAAO,KAC7CpC,EAAMtC,gBAAkB0E,GAE1BrC,EAAaC,CAAK,CACpB,EACA,WAAc,CACZ,GAAI1B,IAAyB,KAAM,OACnC,IAAM8D,EAAMN,SAASxD,EAAsB,EAAE,EAK7CyB,EAAa,CAAErC,gBAHb,CAACqE,OAAOM,SAASD,CAAG,GAAKA,EAAM,EAC3B,EACAE,KAAKC,IAAI,GAAID,KAAKE,IAAI,EAAGF,KAAKG,MAAML,CAAG,CAAC,CAAC,EACZ9D,qBAAsB,IAAK,CAAC,CACjE,EACA,aAAYkB,EAAO9B,eAAgB,CAAA,GAErC,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAkC8B,EAAOhC,UAAiB,CAAA,CAC5E,CAAA,CAAA,GAEA,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,SACL,IAAK,EACL,IAAK,GACKiC,WACV,UAAWtB,EACX,MAAOI,GAAsB2C,OAAOvD,CAAa,EACjD,SAAW0D,GAAM,CACf,IAAMa,EAAOb,EAAEG,OAAOnC,MAChB+C,EAAMN,SAASI,EAAM,EAAE,EACvBlC,EAAgC,CAAEzB,mBAAoB2D,CAAK,EAC7DH,OAAOM,SAASD,CAAG,GAAKA,GAAO,GAAKA,GAAO,KAC7CpC,EAAMrC,cAAgByE,GAExBrC,EAAaC,CAAK,CACpB,EACA,WAAc,CACZ,GAAIzB,IAAuB,KAAM,OACjC,IAAM6D,EAAMN,SAASvD,EAAoB,EAAE,EAK3CwB,EAAa,CAAEpC,cAHb,CAACoE,OAAOM,SAASD,CAAG,GAAKA,EAAM,EAC3B,EACAE,KAAKC,IAAI,GAAID,KAAKE,IAAI,EAAGF,KAAKG,MAAML,CAAG,CAAC,CAAC,EACd7D,mBAAoB,IAAK,CAAC,CAC7D,EACA,aAAYiB,EAAO7B,aAAc,CAAA,GAEnC,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAkC6B,EAAO5B,QAAe,CAAA,GACxE,EAAA,EAAA,KAAC,SAAD,CACE,UAAWxB,EAAG4B,EAAmB,qBAAqB,EAC5CyB,WACV,MAAOoB,EACP,SAAWQ,GAAM,CAEftB,EAAa,CAAEc,OADJiB,SAAST,EAAEG,OAAOnC,MAAO,EACbqC,CAAG,CAAC,CAC7B,EACA,aAAYlC,EAAO/B,sBAElBlB,EAAcqF,IAAKc,IAClB,EAAA,EAAA,KAAC,SAAD,CAAgB,MAAOA,WACpBxB,OAAOwB,CAAC,EAAEvB,SAAS,EAAG,GAAG,CACpB,EAFKuB,CAEL,CACT,CACK,CAAA,GACR,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAkClD,EAAOhC,UAAiB,CAAA,CAC5E,CAAA,CAAA,CAEJ,CAAA,CAAA,EAGDkD,IAAS,UACR,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,OACL,KAAM,GACIjB,WACV,UAAWxB,EACX,MAAOgD,EACP,SAAUG,EACV,aAAY5B,EAAO1C,iBAAkB,CAAA,EAIxC4D,IAAS,WACR,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,OACL,KAAM,GACIjB,WACV,UAAWxB,EACX,MAAOgD,EACP,SAAUG,EACV,aAAY5B,EAAO1C,iBAAkB,CAAA,EAIxC4D,IAAS,YACR,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,SAAD,CACE,UAAWtE,EAAG4B,EAAmB,uBAAuB,EAC9CyB,WACV,MAAO5B,EACP,SAAWwD,GAAM,CAEftB,EAAa,CAAElC,WADLiE,SAAST,EAAEG,OAAOnC,MAAO,EACRsD,CAAE,CAAC,CAChC,EACA,aAAYnD,EAAO3B,oBAElBrB,MAAMC,KAAK,CAAEC,OAAQ,EAAG,GAAIC,EAAGiG,IAAMA,EAAI,CAAC,EAAEhB,IAAKe,IAChD,EAAA,EAAA,KAAC,SAAD,CAAgB,MAAOA,WACpBA,CACK,EAFKA,CAEL,CACT,CACK,CAAA,GACR,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,OACL,KAAM,GACIlD,WACV,UAAWxB,EACX,MAAOgD,EACP,SAAUG,EACV,aAAY5B,EAAO1C,iBAAkB,CAAA,CAEzC,CAAA,CAAA,EAGD4D,IAAS,WACR,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,SAAD,CACE,UAAWtE,EAAG4B,EAAmB,qBAAqB,EAC5CyB,WACV,MAAOoB,EACP,SAAWQ,GAAM,CAEftB,EAAa,CAAEc,OADJiB,SAAST,EAAEG,OAAOnC,MAAO,EACbqC,CAAG,CAAC,CAC7B,EACA,aAAYlC,EAAO/B,sBAElBlB,EAAcqF,IAAKc,IAClB,EAAA,EAAA,KAAC,SAAD,CAAgB,MAAOA,WACpBxB,OAAOwB,CAAC,EAAEvB,SAAS,EAAG,GAAG,CACpB,EAFKuB,CAEL,CACT,CACK,CAAA,GACR,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAkClD,EAAOhC,UAAiB,CAAA,CAC5E,CAAA,CAAA,CAEC,IAGDqF,EACJnC,IAAS,UACP,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,8BAA8B,KAAK,QAAQ,aAAYlB,EAAOnC,oBAC1EmC,EAAOzB,SAAS6D,KAAKkB,EAAOF,IAAM,CACjC,IAAMG,EAAKhC,EAAS6B,GACpB,OACE,EAAA,EAAA,KAAC,SAAD,CAEE,KAAK,SACKnD,WACV,UAAWrD,EACT,gHACA2G,EACI,qCACA,+DACN,EACA,eAAcA,EACd,YAAe,CACb,IAAMb,EAAO,CAAC,GAAGnB,CAAQ,EACzBmB,EAAKU,GAAK,CAACV,EAAKU,GAChB7C,EAAa,CAAEgB,SAAUmB,CAAK,CAAC,CACjC,WAECY,CACK,EAjBDA,CAiBC,CAEZ,CAAC,CACE,CAAA,EACH,KAEAE,EACJtC,IAAS,UACP,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAC,WAAD,CACYjB,WACV,UAAWrB,EACX,KAAM,EACN,WAAY,GACZ,MAAO4C,EACP,YAAY,cACZ,SAAWK,GAAM,CACftB,EAAa,CAAEiB,QAASK,EAAEG,OAAOnC,KAAM,CAAC,CAC1C,EACA,aAAYG,EAAOjC,UAAW,CAAA,GAEhC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sCAA8BiC,EAAO1B,cAAkB,CAAA,CACjE,IACH,KAEN,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+BAAf,CACG4B,GACC,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,6CAAqCF,EAAO1C,iBAAwB,CAAA,EAClF,KACHmF,EACAY,EACAG,CACE,GAET,CClbA,SAAgBG,GAA4B,CAC1C,OAAOD,EAAO,6BAA6B,CAC7C,CAEA,eAAsBE,GAAuC,CAC3D,IAAME,EAAM,MAAML,EAA4DE,EAAkB,CAAC,EACjG,OAAO,OAAOG,EAAIE,SAASC,SAAY,SAAWH,EAAIE,QAAQC,QAAU,EAC1E,CCAA,SAASO,EAASC,EAA0C,CAC1D,OAAqB,OAAOA,GAAM,YAA3BA,GAAuC,CAACE,MAAMC,QAAQH,CAAC,CAChE,CAEA,SAAgBI,EAA6BC,EAAyC,CACpF,IAAMC,EAAIP,EAASM,CAAM,EAAIA,EAAS,CAAC,EACjCE,EAAKR,EAASO,EAAEE,OAAO,EAAIF,EAAEE,QAAU,CAAC,EACxCC,EAAKV,EAASQ,EAAGG,SAAS,EAAIH,EAAGG,UAAY,CAAC,EAC9CC,EAAQF,EAAGG,YACXC,EAAKd,EAASY,CAAK,EAAIA,EAAQ,KAC/BC,EACJC,GAAM,OAAOA,EAAGC,OAAU,UAAY,OAAOD,EAAGE,KAAQ,UAAYF,EAAGC,OAASD,EAAGE,IAC/E,CACED,MAAOD,EAAGC,MACVC,IAAKF,EAAGE,IACRC,SAAU,OAAOH,EAAGG,UAAa,SAAWH,EAAGG,SAAW,EAC5D,EACA,KACN,MAAO,CACLC,QAASC,GAAQT,EAAGQ,SAAW,IAC/BE,WAAY,OAAOV,EAAGU,YAAe,UAAYC,OAAOC,SAASZ,EAAGU,UAAU,EAAIV,EAAGU,WAAa,KAClGG,2BAA4Bb,EAAGa,6BAA+B,GAC9DC,OAAQ,OAAOd,EAAGc,QAAW,SAAWd,EAAGc,OAAS,GACpDC,aAAc,OAAOf,EAAGe,cAAiB,SAAWf,EAAGe,aAAe,GACtEC,OAAQ,OAAOhB,EAAGgB,QAAW,SAAWhB,EAAGgB,OAAS,GACpDC,YACE,OAAOjB,EAAGiB,aAAgB,UAAYN,OAAOC,SAASZ,EAAGiB,WAAW,EAAIjB,EAAGiB,YAAc,GAC3FC,gBAAiBT,EAAQT,EAAGkB,gBAC5Bf,aACF,CACF,CAEA,SAASgB,EAAsBC,EAAwD,CACrF,IAAMC,EAA6B,CACjCb,QAASY,EAAMZ,QACfE,WAAYU,EAAMV,WAClBG,2BAA4BO,EAAMP,0BACpC,EAyBA,OAxBIO,EAAMN,OAAOQ,KAAK,EAAGD,EAAEP,OAASM,EAAMN,OAAOQ,KAAK,EACjDD,EAAEP,OAAS,KACZM,EAAML,aAAaO,KAAK,EAAGD,EAAEN,aAAeK,EAAML,aAAaO,KAAK,EACnED,EAAEN,aAAe,KAClBK,EAAMJ,OAAOM,KAAK,EAAGD,EAAEL,OAASI,EAAMJ,OAAOM,KAAK,EACjDD,EAAEL,OAAS,KACZI,EAAMH,cAAgB,IAAMG,EAAMH,cAAgBM,IAAAA,GACpDF,EAAEJ,YAAc,KAEhBI,EAAEJ,YAAcG,EAAMH,YAEpBG,EAAMF,gBAAiBG,EAAEH,gBAAkB,GAC1CG,EAAEH,gBAAkB,KACrBE,EAAMjB,aAAaE,OAAOiB,KAAK,GAAKF,EAAMjB,aAAaG,KAAKgB,KAAK,EACnED,EAAElB,YAAc,CACdE,MAAOe,EAAMjB,YAAYE,MAAMiB,KAAK,EACpChB,IAAKc,EAAMjB,YAAYG,IAAIgB,KAAK,EAChC,GAAIF,EAAMjB,YAAYI,SAASe,KAAK,EAChC,CAAEf,SAAUa,EAAMjB,YAAYI,SAASe,KAAK,CAAE,EAC9C,CAAC,CACP,EAEAD,EAAElB,YAAc,KAEXkB,CACT,CAEA,eAAsBG,EAAuBJ,EAA8C,CACzF,MAAMnC,EAAUC,EAAO,aAAa,EAAG,CACrCwC,OAAQ,QACRC,KAAMC,KAAKC,UAAU,CACnB9B,QAAS,CACPE,UAAWkB,EAAsBC,CAAK,CACxC,CACF,CAAC,CACH,CAAC,EACD,EAA6B,CAC/B,CAEA,eAAsBU,EAAeC,EAAgC,CACnE,MAAM9C,EAAUC,EAAO,6BAA6B,EAAG,CACrDwC,OAAQ,MACRC,KAAMC,KAAKC,UAAU,CAAEE,SAAQ,CAAC,CAClC,CAAC,EACD,EAAY5C,EAAkB,CAAC,CACjC,CAGA,eAAsB6C,EAAiBC,EAAgC,CACrE,MAAMhD,EAAUC,EAAO,wBAAwB,EAAG,CAChDwC,OAAQ,OACRQ,QAAS,CAAE,eAAgB,kBAAmB,EAC9CP,KAAMC,KAAKC,UAAUI,EAAS,CAAEA,QAAO,EAAI,CAAC,CAAC,CAC/C,CAAC,CACH"}
|
|
1
|
+
{"version":3,"file":"heartbeat-config-api-BqfDabSI.js","names":["useCallback","useMemo","useReducer","useRef","ChangeEvent","buildCronFromPickerState","cronExpressionToPickerState","IntervalKind","PickerState","SchedulePickerMode","cn","formControlBorderFocusClass","selectControlBaseClass","MINUTE_VALUES","Array","from","length","_","idx","CronSchedulePickerLabels","scheduleTimeLabel","modeNoRepeat","modeInterval","intervalKindMinutes","intervalKindHours","modeHourly","modeDaily","modeWeekly","modeMonthly","modeCustom","minuteUnit","minuteAtHour","intervalMinutes","intervalHours","hourUnit","dayOfMonth","customCronHint","weekdays","pickerSelectClass","timeInputClass","dateInputClass","numberInputClass","cronTextareaClass","InternalState","intervalMinutesDraft","intervalHoursDraft","fromParsed","parsed","toPickerState","state","_minutesDraft","_hoursDraft","picker","PickerAction","type","pickerReducer","_state","action","CronSchedulePickerProps","value","onChange","cron","labels","disabled","showHeading","CronSchedulePicker","dispatch","trackedValueRef","current","commitPicker","patch","Partial","nextState","nextPicker","prevPicker","pickerChanged","Object","keys","some","key","mode","intervalKind","onceDate","minute","hour","weekDays","rawCron","timeValue","String","padStart","onTimeChange","e","HTMLInputElement","v","target","hh","mm","split","map","x","parseInt","Number","isNaN","modeRow","next","k","raw","isFinite","Math","min","max","round","m","d","i","weekRow","label","on","customBlock","fetchJson","apiUrl","heartbeatMdSwrKey","fetchHeartbeatMdSwr","Promise","res","ok","payload","content","revalidateGatewayConfig","fetchJson","apiUrl","heartbeatMdSwrKey","mutate","HeartbeatSettingsState","isRecord","v","Record","Array","isArray","normalizeHeartbeatFromConfig","config","c","gw","gateway","hb","heartbeat","ahRaw","activeHours","ah","start","end","timezone","enabled","Boolean","intervalMs","Number","isFinite","includeSystemPromptSection","target","targetChatId","prompt","ackMaxChars","isolatedSession","buildHeartbeatPayload","state","p","trim","undefined","patchHeartbeatSettings","Promise","method","body","JSON","stringify","putHeartbeatMd","content","triggerHeartbeat","reason","headers"],"sources":["../../../../../web/src/features/scheduling/cron/cron-schedule-picker.tsx","../../../../../web/src/features/settings/heartbeat-md-swr.ts","../../../../../web/src/features/settings/heartbeat-config-api.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer, useRef, type ChangeEvent } from 'react';\n\nimport {\n buildCronFromPickerState,\n cronExpressionToPickerState,\n type IntervalKind,\n type PickerState,\n type SchedulePickerMode,\n} from '@/features/scheduling/cron/cron-expression';\nimport { cn } from '@/lib/cn';\nimport { formControlBorderFocusClass, selectControlBaseClass } from '@/lib/form-field-width';\n\nexport type { IntervalKind, PickerState, SchedulePickerMode } from '@/features/scheduling/cron/cron-expression';\nexport { buildCronFromPickerState, cronExpressionToPickerState } from '@/features/scheduling/cron/cron-expression';\n\nconst MINUTE_VALUES: readonly number[] = Array.from({ length: 60 }, (_, idx) => idx);\n\nexport type CronSchedulePickerLabels = {\n scheduleTimeLabel: string;\n modeNoRepeat: string;\n modeInterval: string;\n intervalKindMinutes: string;\n intervalKindHours: string;\n modeHourly: string;\n modeDaily: string;\n modeWeekly: string;\n modeMonthly: string;\n modeCustom: string;\n minuteUnit: string;\n minuteAtHour: string;\n intervalMinutes: string;\n intervalHours: string;\n hourUnit: string;\n dayOfMonth: string;\n customCronHint: string;\n weekdays: readonly string[];\n};\n\nconst pickerSelectClass = cn(\n selectControlBaseClass,\n 'min-w-0 shrink text-xs sm:min-w-[7rem] sm:max-w-[11rem]',\n);\n\nconst timeInputClass = cn(\n 'h-9 min-w-[6.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg',\n formControlBorderFocusClass,\n 'dark:bg-surface-panel',\n);\n\nconst dateInputClass = cn(\n 'h-9 min-w-[9.5rem] shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-sm text-fg',\n formControlBorderFocusClass,\n);\n\nconst numberInputClass = cn(\n 'h-9 w-14 shrink-0 rounded-lg border border-edge-subtle bg-surface-panel px-2 py-1.5 text-center text-sm tabular-nums text-fg',\n formControlBorderFocusClass,\n);\n\nconst cronTextareaClass = cn(\n 'min-h-[2.5rem] w-full rounded-lg border border-edge-subtle bg-surface-base px-3 py-2 font-mono text-xs text-fg',\n formControlBorderFocusClass,\n);\n\ntype InternalState = PickerState & {\n intervalMinutesDraft: string | null;\n intervalHoursDraft: string | null;\n};\n\nfunction fromParsed(parsed: PickerState): InternalState {\n return { ...parsed, intervalMinutesDraft: null, intervalHoursDraft: null };\n}\n\nfunction toPickerState(state: InternalState): PickerState {\n const { intervalMinutesDraft: _minutesDraft, intervalHoursDraft: _hoursDraft, ...picker } = state;\n return picker;\n}\n\ntype PickerAction =\n | { type: 'reset'; state: PickerState }\n | { type: 'replace'; state: InternalState };\n\nfunction pickerReducer(_state: InternalState, action: PickerAction): InternalState {\n switch (action.type) {\n case 'reset':\n return fromParsed(action.state);\n case 'replace':\n return action.state;\n }\n}\n\ntype CronSchedulePickerProps = {\n value: string;\n onChange: (cron: string) => void;\n labels: CronSchedulePickerLabels;\n disabled?: boolean;\n /** When false, hides the top \"Scheduled time\" label (e.g. when wrapped by ScheduleField). */\n showHeading?: boolean;\n};\n\nexport function CronSchedulePicker({\n value,\n onChange,\n labels,\n disabled,\n showHeading = true,\n}: CronSchedulePickerProps) {\n const parsed = useMemo(() => cronExpressionToPickerState(value), [value]);\n const [state, dispatch] = useReducer(pickerReducer, parsed, fromParsed);\n\n const trackedValueRef = useRef(value);\n if (trackedValueRef.current !== value) {\n trackedValueRef.current = value;\n dispatch({ type: 'reset', state: parsed });\n }\n\n const commitPicker = useCallback(\n (patch: Partial<InternalState>) => {\n const nextState = { ...state, ...patch };\n dispatch({ type: 'replace', state: nextState });\n const nextPicker = toPickerState(nextState);\n const prevPicker = toPickerState(state);\n const pickerChanged = (Object.keys(nextPicker) as (keyof PickerState)[]).some(\n (key) => nextPicker[key] !== prevPicker[key],\n );\n if (pickerChanged) {\n onChange(buildCronFromPickerState(nextPicker));\n }\n },\n [onChange, state],\n );\n\n const {\n mode,\n intervalKind,\n onceDate,\n intervalMinutes,\n intervalHours,\n minute,\n hour,\n weekDays,\n dayOfMonth,\n rawCron,\n intervalMinutesDraft,\n intervalHoursDraft,\n } = state;\n\n const timeValue = `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n\n const onTimeChange = (e: ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n if (!v) return;\n const [hh, mm] = v.split(':').map((x) => parseInt(x, 10));\n if (Number.isNaN(hh) || Number.isNaN(mm)) return;\n commitPicker({ minute: mm, hour: hh });\n };\n\n const modeRow = (\n <div className=\"flex min-w-0 flex-nowrap items-center gap-2 overflow-x-auto pb-0.5\">\n <select\n className={pickerSelectClass}\n disabled={disabled}\n value={mode}\n onChange={(e) => {\n const next = e.target.value as SchedulePickerMode;\n commitPicker({ mode: next });\n }}\n aria-label={labels.scheduleTimeLabel}\n >\n <option value=\"no_repeat\">{labels.modeNoRepeat}</option>\n <option value=\"interval\">{labels.modeInterval}</option>\n <option value=\"hourly\">{labels.modeHourly}</option>\n <option value=\"daily\">{labels.modeDaily}</option>\n <option value=\"weekly\">{labels.modeWeekly}</option>\n <option value=\"monthly\">{labels.modeMonthly}</option>\n <option value=\"custom\">{labels.modeCustom}</option>\n </select>\n\n {mode === 'no_repeat' && (\n <>\n <input\n type=\"date\"\n disabled={disabled}\n className={dateInputClass}\n value={onceDate}\n onChange={(e) => {\n commitPicker({ onceDate: e.target.value });\n }}\n aria-label={labels.modeNoRepeat}\n />\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n </>\n )}\n\n {mode === 'interval' && (\n <>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[5rem]')}\n disabled={disabled}\n value={intervalKind}\n onChange={(e) => {\n const k = e.target.value as IntervalKind;\n commitPicker({ intervalKind: k, intervalMinutesDraft: null, intervalHoursDraft: null });\n }}\n aria-label={labels.modeInterval}\n >\n <option value=\"minutes\">{labels.intervalKindMinutes}</option>\n <option value=\"hours\">{labels.intervalKindHours}</option>\n </select>\n {intervalKind === 'minutes' ? (\n <>\n <input\n type=\"number\"\n min={1}\n max={59}\n disabled={disabled}\n className={numberInputClass}\n value={intervalMinutesDraft ?? String(intervalMinutes)}\n onChange={(e) => {\n const next = e.target.value;\n const raw = parseInt(next, 10);\n const patch: Partial<InternalState> = { intervalMinutesDraft: next };\n if (Number.isFinite(raw) && raw >= 1 && raw <= 59) {\n patch.intervalMinutes = raw;\n }\n commitPicker(patch);\n }}\n onBlur={() => {\n if (intervalMinutesDraft === null) return;\n const raw = parseInt(intervalMinutesDraft, 10);\n const v =\n !Number.isFinite(raw) || raw < 1\n ? 5\n : Math.min(59, Math.max(1, Math.round(raw)));\n commitPicker({ intervalMinutes: v, intervalMinutesDraft: null });\n }}\n aria-label={labels.intervalMinutes}\n />\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.minuteUnit}</span>\n </>\n ) : (\n <>\n <input\n type=\"number\"\n min={1}\n max={23}\n disabled={disabled}\n className={numberInputClass}\n value={intervalHoursDraft ?? String(intervalHours)}\n onChange={(e) => {\n const next = e.target.value;\n const raw = parseInt(next, 10);\n const patch: Partial<InternalState> = { intervalHoursDraft: next };\n if (Number.isFinite(raw) && raw >= 1 && raw <= 23) {\n patch.intervalHours = raw;\n }\n commitPicker(patch);\n }}\n onBlur={() => {\n if (intervalHoursDraft === null) return;\n const raw = parseInt(intervalHoursDraft, 10);\n const v =\n !Number.isFinite(raw) || raw < 1\n ? 2\n : Math.min(23, Math.max(1, Math.round(raw)));\n commitPicker({ intervalHours: v, intervalHoursDraft: null });\n }}\n aria-label={labels.intervalHours}\n />\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.hourUnit}</span>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[4rem]')}\n disabled={disabled}\n value={minute}\n onChange={(e) => {\n const mm = parseInt(e.target.value, 10);\n commitPicker({ minute: mm });\n }}\n aria-label={labels.minuteAtHour}\n >\n {MINUTE_VALUES.map((m) => (\n <option key={m} value={m}>\n {String(m).padStart(2, '0')}\n </option>\n ))}\n </select>\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.minuteUnit}</span>\n </>\n )}\n </>\n )}\n\n {mode === 'daily' && (\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n )}\n\n {mode === 'weekly' && (\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n )}\n\n {mode === 'monthly' && (\n <>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[4.5rem]')}\n disabled={disabled}\n value={dayOfMonth}\n onChange={(e) => {\n const d = parseInt(e.target.value, 10);\n commitPicker({ dayOfMonth: d });\n }}\n aria-label={labels.dayOfMonth}\n >\n {Array.from({ length: 31 }, (_, i) => i + 1).map((d) => (\n <option key={d} value={d}>\n {d}\n </option>\n ))}\n </select>\n <input\n type=\"time\"\n step={60}\n disabled={disabled}\n className={timeInputClass}\n value={timeValue}\n onChange={onTimeChange}\n aria-label={labels.scheduleTimeLabel}\n />\n </>\n )}\n\n {mode === 'hourly' && (\n <>\n <select\n className={cn(pickerSelectClass, 'w-auto min-w-[4rem]')}\n disabled={disabled}\n value={minute}\n onChange={(e) => {\n const mm = parseInt(e.target.value, 10);\n commitPicker({ minute: mm });\n }}\n aria-label={labels.minuteAtHour}\n >\n {MINUTE_VALUES.map((m) => (\n <option key={m} value={m}>\n {String(m).padStart(2, '0')}\n </option>\n ))}\n </select>\n <span className=\"shrink-0 text-sm text-fg-muted\">{labels.minuteUnit}</span>\n </>\n )}\n </div>\n );\n\n const weekRow =\n mode === 'weekly' ? (\n <div className=\"flex flex-wrap gap-1.5 pt-1\" role=\"group\" aria-label={labels.modeWeekly}>\n {labels.weekdays.map((label, i) => {\n const on = weekDays[i];\n return (\n <button\n key={label}\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'flex size-9 select-none items-center justify-center rounded-full border text-xs font-medium transition-colors',\n on\n ? 'border-fg bg-fg text-surface-panel'\n : 'border-edge-subtle bg-surface-panel text-fg hover:border-edge',\n )}\n aria-pressed={on}\n onClick={() => {\n const next = [...weekDays];\n next[i] = !next[i];\n commitPicker({ weekDays: next });\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n ) : null;\n\n const customBlock =\n mode === 'custom' ? (\n <div className=\"pt-1\">\n <textarea\n disabled={disabled}\n className={cronTextareaClass}\n rows={2}\n spellCheck={false}\n value={rawCron}\n placeholder=\"*/5 * * * *\"\n onChange={(e) => {\n commitPicker({ rawCron: e.target.value });\n }}\n aria-label={labels.modeCustom}\n />\n <p className=\"mt-1 text-xs text-fg-muted\">{labels.customCronHint}</p>\n </div>\n ) : null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {showHeading ? (\n <span className=\"text-xs font-medium text-fg-muted\">{labels.scheduleTimeLabel}</span>\n ) : null}\n {modeRow}\n {weekRow}\n {customBlock}\n </div>\n );\n}\n","import { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\n\nexport function heartbeatMdSwrKey(): string {\n return apiUrl('/api/workspace/heartbeat-md');\n}\n\nexport async function fetchHeartbeatMdSwr(): Promise<string> {\n const res = await fetchJson<{ ok?: boolean; payload?: { content?: string } }>(heartbeatMdSwrKey());\n return typeof res.payload?.content === 'string' ? res.payload.content : '';\n}\n","import { revalidateGatewayConfig } from '@/features/gateway/gateway-config-swr';\nimport { fetchJson } from '@/lib/fetch';\nimport { apiUrl } from '@/lib/url';\nimport { heartbeatMdSwrKey } from '@/features/settings/heartbeat-md-swr';\nimport { mutate } from 'swr';\n\nimport type { HeartbeatSettingsState } from './heartbeat-settings.types';\n\nexport type { HeartbeatSettingsState } from './heartbeat-settings.types';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function normalizeHeartbeatFromConfig(config: unknown): HeartbeatSettingsState {\n const c = isRecord(config) ? config : {};\n const gw = isRecord(c.gateway) ? c.gateway : {};\n const hb = isRecord(gw.heartbeat) ? gw.heartbeat : {};\n const ahRaw = hb.activeHours;\n const ah = isRecord(ahRaw) ? ahRaw : null;\n const activeHours =\n ah && typeof ah.start === 'string' && typeof ah.end === 'string' && ah.start && ah.end\n ? {\n start: ah.start,\n end: ah.end,\n timezone: typeof ah.timezone === 'string' ? ah.timezone : '',\n }\n : null;\n return {\n enabled: Boolean(hb.enabled ?? true),\n intervalMs: typeof hb.intervalMs === 'number' && Number.isFinite(hb.intervalMs) ? hb.intervalMs : 1_800_000,\n includeSystemPromptSection: hb.includeSystemPromptSection === true,\n target: typeof hb.target === 'string' ? hb.target : '',\n targetChatId: typeof hb.targetChatId === 'string' ? hb.targetChatId : '',\n prompt: typeof hb.prompt === 'string' ? hb.prompt : '',\n ackMaxChars:\n typeof hb.ackMaxChars === 'number' && Number.isFinite(hb.ackMaxChars) ? hb.ackMaxChars : '',\n isolatedSession: Boolean(hb.isolatedSession),\n activeHours,\n };\n}\n\nfunction buildHeartbeatPayload(state: HeartbeatSettingsState): Record<string, unknown> {\n const p: Record<string, unknown> = {\n enabled: state.enabled,\n intervalMs: state.intervalMs,\n includeSystemPromptSection: state.includeSystemPromptSection,\n };\n if (state.target.trim()) p.target = state.target.trim();\n else p.target = null;\n if (state.targetChatId.trim()) p.targetChatId = state.targetChatId.trim();\n else p.targetChatId = null;\n if (state.prompt.trim()) p.prompt = state.prompt.trim();\n else p.prompt = null;\n if (state.ackMaxChars === '' || state.ackMaxChars === undefined) {\n p.ackMaxChars = null;\n } else {\n p.ackMaxChars = state.ackMaxChars;\n }\n if (state.isolatedSession) p.isolatedSession = true;\n else p.isolatedSession = null;\n if (state.activeHours?.start?.trim() && state.activeHours?.end?.trim()) {\n p.activeHours = {\n start: state.activeHours.start.trim(),\n end: state.activeHours.end.trim(),\n ...(state.activeHours.timezone.trim()\n ? { timezone: state.activeHours.timezone.trim() }\n : {}),\n };\n } else {\n p.activeHours = null;\n }\n return p;\n}\n\nexport async function patchHeartbeatSettings(state: HeartbeatSettingsState): Promise<void> {\n await fetchJson(apiUrl('/api/config'), {\n method: 'PATCH',\n body: JSON.stringify({\n gateway: {\n heartbeat: buildHeartbeatPayload(state),\n },\n }),\n });\n void revalidateGatewayConfig();\n}\n\nexport async function putHeartbeatMd(content: string): Promise<void> {\n await fetchJson(apiUrl('/api/workspace/heartbeat-md'), {\n method: 'PUT',\n body: JSON.stringify({ content }),\n });\n void mutate(heartbeatMdSwrKey());\n}\n\n/** Queue one heartbeat run (same path as the interval timer). */\nexport async function triggerHeartbeat(reason?: string): Promise<void> {\n await fetchJson(apiUrl('/api/heartbeat/trigger'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(reason ? { reason } : {}),\n });\n}\n"],"mappings":"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"}
|