@xopcai/xopc 0.0.77 → 0.0.78

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 (126) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agents-DN3vr8pb.js → agents-Bh_9-1KB.js} +2 -2
  4. package/dist/gateway/static/root/assets/{agents-DN3vr8pb.js.map → agents-Bh_9-1KB.js.map} +1 -1
  5. package/dist/gateway/static/root/assets/{apps-page-BUn41aPi.js → apps-page-CB5anZpc.js} +2 -2
  6. package/dist/gateway/static/root/assets/{apps-page-BUn41aPi.js.map → apps-page-CB5anZpc.js.map} +1 -1
  7. package/dist/gateway/static/root/assets/{channels-settings-CYMmWDtP.js → channels-settings-Bt1sprhC.js} +2 -2
  8. package/dist/gateway/static/root/assets/{channels-settings-CYMmWDtP.js.map → channels-settings-Bt1sprhC.js.map} +1 -1
  9. package/dist/gateway/static/root/assets/{channels-status-swr-sJj4ueTp.js → channels-status-swr-Crgak3fg.js} +2 -2
  10. package/dist/gateway/static/root/assets/{channels-status-swr-sJj4ueTp.js.map → channels-status-swr-Crgak3fg.js.map} +1 -1
  11. package/dist/gateway/static/root/assets/{cron-api-CLxnaHdq.js → cron-api-CzJGvQQ7.js} +2 -2
  12. package/dist/gateway/static/root/assets/{cron-api-CLxnaHdq.js.map → cron-api-CzJGvQQ7.js.map} +1 -1
  13. package/dist/gateway/static/root/assets/{cron-page-BAQ8xSnJ.js → cron-page-BoNRJNVV.js} +2 -2
  14. package/dist/gateway/static/root/assets/{cron-page-BAQ8xSnJ.js.map → cron-page-BoNRJNVV.js.map} +1 -1
  15. package/dist/gateway/static/root/assets/{dist-BfJYxiK5.js → dist-a-eaOUvs.js} +2 -2
  16. package/dist/gateway/static/root/assets/{dist-BfJYxiK5.js.map → dist-a-eaOUvs.js.map} +1 -1
  17. package/dist/gateway/static/root/assets/{extension-debug-page-bgvVs-Sy.js → extension-debug-page-D-O1XjAa.js} +2 -2
  18. package/dist/gateway/static/root/assets/{extension-debug-page-bgvVs-Sy.js.map → extension-debug-page-D-O1XjAa.js.map} +1 -1
  19. package/dist/gateway/static/root/assets/{extension-page-SG4TVv-u.js → extension-page-B2VpqBTH.js} +2 -2
  20. package/dist/gateway/static/root/assets/{extension-page-SG4TVv-u.js.map → extension-page-B2VpqBTH.js.map} +1 -1
  21. package/dist/gateway/static/root/assets/{extension-settings-page-CJZRTsjF.js → extension-settings-page-CmBcQfeO.js} +2 -2
  22. package/dist/gateway/static/root/assets/{extension-settings-page-CJZRTsjF.js.map → extension-settings-page-CmBcQfeO.js.map} +1 -1
  23. package/dist/gateway/static/root/assets/{fetch-K_0JRCXU.js → fetch-EGO9T3MN.js} +3 -3
  24. package/dist/gateway/static/root/assets/{fetch-K_0JRCXU.js.map → fetch-EGO9T3MN.js.map} +1 -1
  25. package/dist/gateway/static/root/assets/{field-primitives-Z76hyBYS.js → field-primitives-Bh7G1y4D.js} +2 -2
  26. package/dist/gateway/static/root/assets/{field-primitives-Z76hyBYS.js.map → field-primitives-Bh7G1y4D.js.map} +1 -1
  27. package/dist/gateway/static/root/assets/{heartbeat-config-api-BqfDabSI.js → heartbeat-config-api-DxpIEZNs.js} +2 -2
  28. package/dist/gateway/static/root/assets/{heartbeat-config-api-BqfDabSI.js.map → heartbeat-config-api-DxpIEZNs.js.map} +1 -1
  29. package/dist/gateway/static/root/assets/{index-ChiUhJAs.js → index-Dxy9ZCtC.js} +5 -5
  30. package/dist/gateway/static/root/assets/{index-ChiUhJAs.js.map → index-Dxy9ZCtC.js.map} +1 -1
  31. package/dist/gateway/static/root/assets/{logs-page-DrIMhDE2.js → logs-page-Dw58E2GE.js} +2 -2
  32. package/dist/gateway/static/root/assets/{logs-page-DrIMhDE2.js.map → logs-page-Dw58E2GE.js.map} +1 -1
  33. package/dist/gateway/static/root/assets/{sessions-page-B-RGO3N0.js → sessions-page-CPkhCy57.js} +2 -2
  34. package/dist/gateway/static/root/assets/{sessions-page-B-RGO3N0.js.map → sessions-page-CPkhCy57.js.map} +1 -1
  35. package/dist/gateway/static/root/assets/{settings-form-section-Csvl1iL6.js → settings-form-section-DLZDVMEf.js} +2 -2
  36. package/dist/gateway/static/root/assets/{settings-form-section-Csvl1iL6.js.map → settings-form-section-DLZDVMEf.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/settings-page-CVPCa0PE.js +4 -0
  38. package/dist/gateway/static/root/assets/settings-page-CVPCa0PE.js.map +1 -0
  39. package/dist/gateway/static/root/assets/{skills-page-dHwx2vh0.js → skills-page-DueZ9Qfg.js} +2 -2
  40. package/dist/gateway/static/root/assets/{skills-page-dHwx2vh0.js.map → skills-page-DueZ9Qfg.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/{theme-store-Bl5A2Fd_.js → theme-store-CWPq9gW1.js} +2 -2
  42. package/dist/gateway/static/root/assets/{theme-store-Bl5A2Fd_.js.map → theme-store-CWPq9gW1.js.map} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-COYrNFF7.js → utils-Cnix55r9.js} +2 -2
  44. package/dist/gateway/static/root/assets/{utils-COYrNFF7.js.map → utils-Cnix55r9.js.map} +1 -1
  45. package/dist/gateway/static/root/assets/{voice-api-key-field-5WZZaxH3.js → voice-api-key-field-BR3Ut06g.js} +2 -2
  46. package/dist/gateway/static/root/assets/{voice-api-key-field-5WZZaxH3.js.map → voice-api-key-field-BR3Ut06g.js.map} +1 -1
  47. package/dist/gateway/static/root/index.html +3 -3
  48. package/dist/package.js +1 -1
  49. package/dist/src/browser/providers/browser-ext-install.js +23 -4
  50. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  51. package/dist/src/cli/commands/tunnel.js +4 -5
  52. package/dist/src/cli/commands/tunnel.js.map +1 -1
  53. package/dist/src/config/index.js +2 -2
  54. package/dist/src/config/rules.js +0 -5
  55. package/dist/src/config/rules.js.map +1 -1
  56. package/dist/src/config/schema.d.ts +0 -27
  57. package/dist/src/config/schema.js +4 -18
  58. package/dist/src/config/schema.js.map +1 -1
  59. package/dist/src/gateway/auth-rate-limit.d.ts +2 -0
  60. package/dist/src/gateway/auth-rate-limit.js +9 -3
  61. package/dist/src/gateway/auth-rate-limit.js.map +1 -1
  62. package/dist/src/gateway/hono/app.js +19 -13
  63. package/dist/src/gateway/hono/app.js.map +1 -1
  64. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  65. package/dist/src/gateway/hono/lib/config-payload.js +1 -2
  66. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  67. package/dist/src/gateway/hono/routes/tunnel.js +32 -30
  68. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  69. package/dist/src/gateway/host.d.ts +24 -0
  70. package/dist/src/gateway/host.js +33 -1
  71. package/dist/src/gateway/host.js.map +1 -1
  72. package/dist/src/gateway/index.d.ts +1 -1
  73. package/dist/src/gateway/index.js +2 -2
  74. package/dist/src/gateway/runtime-config.js +1 -8
  75. package/dist/src/gateway/runtime-config.js.map +1 -1
  76. package/dist/src/gateway/security/audit.js +4 -4
  77. package/dist/src/gateway/security/audit.js.map +1 -1
  78. package/dist/src/gateway/server.js +2 -3
  79. package/dist/src/gateway/server.js.map +1 -1
  80. package/dist/src/gateway/service/types.d.ts +2 -0
  81. package/dist/src/gateway/service.d.ts +2 -0
  82. package/dist/src/gateway/service.js +7 -2
  83. package/dist/src/gateway/service.js.map +1 -1
  84. package/dist/src/tunnel/frp-subdomain-host.d.ts +2 -0
  85. package/dist/src/tunnel/frp-subdomain-host.js +15 -0
  86. package/dist/src/tunnel/frp-subdomain-host.js.map +1 -0
  87. package/dist/src/tunnel/gateway-lifecycle.d.ts +0 -4
  88. package/dist/src/tunnel/gateway-lifecycle.js +9 -11
  89. package/dist/src/tunnel/gateway-lifecycle.js.map +1 -1
  90. package/dist/src/tunnel/index.d.ts +2 -4
  91. package/dist/src/tunnel/index.js +2 -4
  92. package/dist/src/tunnel/pair-url.js +7 -1
  93. package/dist/src/tunnel/pair-url.js.map +1 -1
  94. package/dist/src/tunnel/pairing.d.ts +13 -0
  95. package/dist/src/tunnel/pairing.js +48 -1
  96. package/dist/src/tunnel/pairing.js.map +1 -1
  97. package/dist/src/tunnel/tunnel-config.js +2 -16
  98. package/dist/src/tunnel/tunnel-config.js.map +1 -1
  99. package/dist/src/tunnel/tunnel-service.d.ts +1 -10
  100. package/dist/src/tunnel/tunnel-service.js +7 -60
  101. package/dist/src/tunnel/tunnel-service.js.map +1 -1
  102. package/dist/src/tunnel/tunnel-types.d.ts +3 -18
  103. package/dist/src/tunnel/well-known.d.ts +5 -0
  104. package/dist/src/tunnel/well-known.js +2 -1
  105. package/dist/src/tunnel/well-known.js.map +1 -1
  106. package/package.json +2 -2
  107. package/dist/gateway/static/root/assets/settings-page-nxAc0ta1.js +0 -4
  108. package/dist/gateway/static/root/assets/settings-page-nxAc0ta1.js.map +0 -1
  109. package/dist/src/tunnel/acme-cert-store.d.ts +0 -34
  110. package/dist/src/tunnel/acme-cert-store.js +0 -184
  111. package/dist/src/tunnel/acme-cert-store.js.map +0 -1
  112. package/dist/src/tunnel/acme-client.d.ts +0 -50
  113. package/dist/src/tunnel/acme-client.js +0 -473
  114. package/dist/src/tunnel/acme-client.js.map +0 -1
  115. package/dist/src/tunnel/acme-crypto.d.ts +0 -25
  116. package/dist/src/tunnel/acme-crypto.js +0 -58
  117. package/dist/src/tunnel/acme-crypto.js.map +0 -1
  118. package/dist/src/tunnel/acme-csr.d.ts +0 -5
  119. package/dist/src/tunnel/acme-csr.js +0 -48
  120. package/dist/src/tunnel/acme-csr.js.map +0 -1
  121. package/dist/src/tunnel/tls-server.d.ts +0 -14
  122. package/dist/src/tunnel/tls-server.js +0 -126
  123. package/dist/src/tunnel/tls-server.js.map +0 -1
  124. package/dist/src/tunnel/tunnel-e2e-config.d.ts +0 -11
  125. package/dist/src/tunnel/tunnel-e2e-config.js +0 -29
  126. package/dist/src/tunnel/tunnel-e2e-config.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{n as e,t}from"./vendor-react-BOUWij0V.js";import{n}from"./utils-COYrNFF7.js";var r=e(),i=t();function a(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:n}),t[0]=n,t[1]=a),a}function o(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`p`,{className:`text-xs leading-relaxed text-fg-subtle`,children:n}),t[0]=n,t[1]=a),a}function s(e){let t=(0,r.c)(14),{label:o,value:s,onChange:l,options:u}=e,d;t[0]===o?d=t[1]:(d=(0,i.jsx)(a,{children:o}),t[0]=o,t[1]=d);let f;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=n(),t[2]=f):f=t[2];let p;t[3]===l?p=t[4]:(p=e=>l(e.target.value),t[3]=l,t[4]=p);let m;t[5]===u?m=t[6]:(m=u.map(c),t[5]=u,t[6]=m);let h;t[7]!==p||t[8]!==m||t[9]!==s?(h=(0,i.jsx)(`select`,{className:f,value:s,onChange:p,children:m}),t[7]=p,t[8]=m,t[9]=s,t[10]=h):h=t[10];let g;return t[11]!==d||t[12]!==h?(g=(0,i.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[d,h]}),t[11]=d,t[12]=h,t[13]=g):g=t[13],g}function c(e){return(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value)}export{a as n,s as r,o as t};
2
- //# sourceMappingURL=field-primitives-Z76hyBYS.js.map
1
+ import{n as e,t}from"./vendor-react-BOUWij0V.js";import{n}from"./utils-Cnix55r9.js";var r=e(),i=t();function a(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:n}),t[0]=n,t[1]=a),a}function o(e){let t=(0,r.c)(2),{children:n}=e,a;return t[0]===n?a=t[1]:(a=(0,i.jsx)(`p`,{className:`text-xs leading-relaxed text-fg-subtle`,children:n}),t[0]=n,t[1]=a),a}function s(e){let t=(0,r.c)(14),{label:o,value:s,onChange:l,options:u}=e,d;t[0]===o?d=t[1]:(d=(0,i.jsx)(a,{children:o}),t[0]=o,t[1]=d);let f;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=n(),t[2]=f):f=t[2];let p;t[3]===l?p=t[4]:(p=e=>l(e.target.value),t[3]=l,t[4]=p);let m;t[5]===u?m=t[6]:(m=u.map(c),t[5]=u,t[6]=m);let h;t[7]!==p||t[8]!==m||t[9]!==s?(h=(0,i.jsx)(`select`,{className:f,value:s,onChange:p,children:m}),t[7]=p,t[8]=m,t[9]=s,t[10]=h):h=t[10];let g;return t[11]!==d||t[12]!==h?(g=(0,i.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[d,h]}),t[11]=d,t[12]=h,t[13]=g):g=t[13],g}function c(e){return(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value)}export{a as n,s as r,o as t};
2
+ //# sourceMappingURL=field-primitives-Bh7G1y4D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-primitives-Z76hyBYS.js","names":["ReactNode","channelsSelectClassName","FieldLabel","t0","$","_c","children","t1","FieldHint","SelectFieldProps","label","value","T","onChange","v","options","SelectField","t2","Symbol","for","t3","e","target","t4","map","_temp","t5","t6","o"],"sources":["../../../../../web/src/features/settings/channels/field-primitives.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { channelsSelectClassName } from './utils';\n\nexport function FieldLabel({ children }: { children: ReactNode }) {\n return <div className=\"text-sm font-medium text-fg\">{children}</div>;\n}\n\nexport function FieldHint({ children }: { children: ReactNode }) {\n return <p className=\"text-xs leading-relaxed text-fg-subtle\">{children}</p>;\n}\n\ntype SelectFieldProps<T extends string> = {\n label: string;\n value: T;\n onChange: (v: T) => void;\n options: { value: T; label: string }[];\n};\n\nexport function SelectField<T extends string>({ label, value, onChange, options }: SelectFieldProps<T>) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <FieldLabel>{label}</FieldLabel>\n <select className={channelsSelectClassName()} value={value} onChange={(e) => onChange(e.target.value as T)}>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n"],"mappings":"oGAIA,SAAOE,EAAAC,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAoB,CAAAE,YAAAH,EAAqCI,EACM,OADNH,EAAA,KAAAE,EACMC,EAAAH,EAAA,IAA7DG,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,8BAA+BD,UAAe,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAA7DA,CAA6D,CAGtE,SAAOC,EAAAL,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAmB,CAAAE,YAAAH,EAAqCI,EACc,OADdH,EAAA,KAAAE,EACcC,EAAAH,EAAA,IAApEG,GAAA,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,yCAA0CD,UAAa,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAApEA,CAAoE,CAU7E,SAAOS,EAAAb,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,EAAA,EAAuC,CAAAM,QAAAC,QAAAE,WAAAE,WAAAZ,EAAwDI,EAAAH,EAAA,KAAAM,EAGhEH,EAAAH,EAAA,IAAhCG,GAAA,EAAA,EAAA,KAAC,EAAD,CAAA,SAAaG,CAAF,CAAA,EAAqBN,EAAA,GAAAM,EAAAN,EAAA,GAAAG,GAAA,IAAAU,EAAAb,EAAA,KAAAc,OAAAC,IAAA,2BAAA,GACbF,EAAAhB,EAAwB,EAACG,EAAA,GAAAa,GAAAA,EAAAb,EAAA,GAAA,IAAAgB,EAAAhB,EAAA,KAAAS,EAA8DO,EAAAhB,EAAA,IAApCgB,EAAAC,GAAOR,EAASQ,EAACC,OAAOX,KAAW,EAACP,EAAA,GAAAS,EAAAT,EAAA,GAAAgB,GAAA,IAAAG,EAAAnB,EAAA,KAAAW,EAKtGQ,EAAAnB,EAAA,IAJDmB,EAAAR,EAAOS,IAAKC,CAIZ,EAACrB,EAAA,GAAAW,EAAAX,EAAA,GAAAmB,GAAA,IAAAG,EAAAtB,EAAA,KAAAgB,GAAAhB,EAAA,KAAAmB,GAAAnB,EAAA,KAAAO,GALJe,GAAA,EAAA,EAAA,KAAA,SAAA,CAAmB,UAAAT,EAAkCN,QAAiB,SAAAS,WACnEG,CAKM,CAAA,EAAAnB,EAAA,GAAAgB,EAAAhB,EAAA,GAAAmB,EAAAnB,EAAA,GAAAO,EAAAP,EAAA,IAAAsB,GAAAA,EAAAtB,EAAA,IAAA,IAAAuB,EACL,OADKvB,EAAA,MAAAG,GAAAH,EAAA,MAAAsB,GARXC,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,iCAAf,CACEpB,EACAmB,CAOI,IAAAtB,EAAA,IAAAG,EAAAH,EAAA,IAAAsB,EAAAtB,EAAA,IAAAuB,GAAAA,EAAAvB,EAAA,IATNuB,CASM,CAXH,SAAAF,EAAAG,EAAA,CAAA,OAMG,EAAA,EAAA,KAAA,SAAA,CAA6B,MAAAA,EAACjB,eAC3BiB,EAAClB,KACK,EAFIkB,EAACjB,KAEL,CAAA"}
1
+ {"version":3,"file":"field-primitives-Bh7G1y4D.js","names":["ReactNode","channelsSelectClassName","FieldLabel","t0","$","_c","children","t1","FieldHint","SelectFieldProps","label","value","T","onChange","v","options","SelectField","t2","Symbol","for","t3","e","target","t4","map","_temp","t5","t6","o"],"sources":["../../../../../web/src/features/settings/channels/field-primitives.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { channelsSelectClassName } from './utils';\n\nexport function FieldLabel({ children }: { children: ReactNode }) {\n return <div className=\"text-sm font-medium text-fg\">{children}</div>;\n}\n\nexport function FieldHint({ children }: { children: ReactNode }) {\n return <p className=\"text-xs leading-relaxed text-fg-subtle\">{children}</p>;\n}\n\ntype SelectFieldProps<T extends string> = {\n label: string;\n value: T;\n onChange: (v: T) => void;\n options: { value: T; label: string }[];\n};\n\nexport function SelectField<T extends string>({ label, value, onChange, options }: SelectFieldProps<T>) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <FieldLabel>{label}</FieldLabel>\n <select className={channelsSelectClassName()} value={value} onChange={(e) => onChange(e.target.value as T)}>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n"],"mappings":"oGAIA,SAAOE,EAAAC,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAoB,CAAAE,YAAAH,EAAqCI,EACM,OADNH,EAAA,KAAAE,EACMC,EAAAH,EAAA,IAA7DG,GAAA,EAAA,EAAA,KAAA,MAAA,CAAe,UAAA,8BAA+BD,UAAe,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAA7DA,CAA6D,CAGtE,SAAOC,EAAAL,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,CAAA,EAAmB,CAAAE,YAAAH,EAAqCI,EACc,OADdH,EAAA,KAAAE,EACcC,EAAAH,EAAA,IAApEG,GAAA,EAAA,EAAA,KAAA,IAAA,CAAa,UAAA,yCAA0CD,UAAa,CAAA,EAAAF,EAAA,GAAAE,EAAAF,EAAA,GAAAG,GAApEA,CAAoE,CAU7E,SAAOS,EAAAb,EAAA,CAAA,IAAAC,GAAAA,EAAAA,EAAAA,GAAA,EAAA,EAAuC,CAAAM,QAAAC,QAAAE,WAAAE,WAAAZ,EAAwDI,EAAAH,EAAA,KAAAM,EAGhEH,EAAAH,EAAA,IAAhCG,GAAA,EAAA,EAAA,KAAC,EAAD,CAAA,SAAaG,CAAF,CAAA,EAAqBN,EAAA,GAAAM,EAAAN,EAAA,GAAAG,GAAA,IAAAU,EAAAb,EAAA,KAAAc,OAAAC,IAAA,2BAAA,GACbF,EAAAhB,EAAwB,EAACG,EAAA,GAAAa,GAAAA,EAAAb,EAAA,GAAA,IAAAgB,EAAAhB,EAAA,KAAAS,EAA8DO,EAAAhB,EAAA,IAApCgB,EAAAC,GAAOR,EAASQ,EAACC,OAAOX,KAAW,EAACP,EAAA,GAAAS,EAAAT,EAAA,GAAAgB,GAAA,IAAAG,EAAAnB,EAAA,KAAAW,EAKtGQ,EAAAnB,EAAA,IAJDmB,EAAAR,EAAOS,IAAKC,CAIZ,EAACrB,EAAA,GAAAW,EAAAX,EAAA,GAAAmB,GAAA,IAAAG,EAAAtB,EAAA,KAAAgB,GAAAhB,EAAA,KAAAmB,GAAAnB,EAAA,KAAAO,GALJe,GAAA,EAAA,EAAA,KAAA,SAAA,CAAmB,UAAAT,EAAkCN,QAAiB,SAAAS,WACnEG,CAKM,CAAA,EAAAnB,EAAA,GAAAgB,EAAAhB,EAAA,GAAAmB,EAAAnB,EAAA,GAAAO,EAAAP,EAAA,IAAAsB,GAAAA,EAAAtB,EAAA,IAAA,IAAAuB,EACL,OADKvB,EAAA,MAAAG,GAAAH,EAAA,MAAAsB,GARXC,GAAA,EAAA,EAAA,MAAA,MAAA,CAAe,UAAA,iCAAf,CACEpB,EACAmB,CAOI,IAAAtB,EAAA,IAAAG,EAAAH,EAAA,IAAAsB,EAAAtB,EAAA,IAAAuB,GAAAA,EAAAvB,EAAA,IATNuB,CASM,CAXH,SAAAF,EAAAG,EAAA,CAAA,OAMG,EAAA,EAAA,KAAA,SAAA,CAA6B,MAAAA,EAACjB,eAC3BiB,EAAClB,KACK,EAFIkB,EAACjB,KAEL,CAAA"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,t as n}from"./vendor-react-BOUWij0V.js";import{i as r,n as i}from"./fetch-K_0JRCXU.js";import{o as a}from"./vendor-swr-BIWyz7Rc.js";import{n as o}from"./button-KafIU8dx.js";import{Rn as s,Vn as c,sn as l}from"./index-ChiUhJAs.js";import{m as u,p as d}from"./cron-dreaming-jobs-DueM3rBz.js";var f=e(t(),1),p=n(),m=Array.from({length:60},(e,t)=>t),h=o(c,`min-w-0 shrink text-xs sm:min-w-[7rem] sm:max-w-[11rem]`),g=o(`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`,s,`dark:bg-surface-panel`),_=o(`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`,s),v=o(`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`,s),y=o(`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`,s);function b(e){return{...e,intervalMinutesDraft:null,intervalHoursDraft:null}}function x(e){let{intervalMinutesDraft:t,intervalHoursDraft:n,...r}=e;return r}function S(e,t){switch(t.type){case`reset`:return b(t.state);case`replace`:return t.state}}function C({value:e,onChange:t,labels:n,disabled:r,showHeading:i=!0}){let a=(0,f.useMemo)(()=>u(e),[e]),[s,c]=(0,f.useReducer)(S,a,b),l=(0,f.useRef)(e);l.current!==e&&(l.current=e,c({type:`reset`,state:a}));let C=(0,f.useCallback)(e=>{let n={...s,...e};c({type:`replace`,state:n});let r=x(n),i=x(s);Object.keys(r).some(e=>r[e]!==i[e])&&t(d(r))},[t,s]),{mode:w,intervalKind:T,onceDate:E,intervalMinutes:D,intervalHours:O,minute:k,hour:A,weekDays:j,dayOfMonth:M,rawCron:N,intervalMinutesDraft:P,intervalHoursDraft:F}=s,I=`${String(A).padStart(2,`0`)}:${String(k).padStart(2,`0`)}`,L=e=>{let t=e.target.value;if(!t)return;let[n,r]=t.split(`:`).map(e=>parseInt(e,10));Number.isNaN(n)||Number.isNaN(r)||C({minute:r,hour:n})},R=(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-nowrap items-center gap-2 overflow-x-auto pb-0.5`,children:[(0,p.jsxs)(`select`,{className:h,disabled:r,value:w,onChange:e=>{let t=e.target.value;C({mode:t})},"aria-label":n.scheduleTimeLabel,children:[(0,p.jsx)(`option`,{value:`no_repeat`,children:n.modeNoRepeat}),(0,p.jsx)(`option`,{value:`interval`,children:n.modeInterval}),(0,p.jsx)(`option`,{value:`hourly`,children:n.modeHourly}),(0,p.jsx)(`option`,{value:`daily`,children:n.modeDaily}),(0,p.jsx)(`option`,{value:`weekly`,children:n.modeWeekly}),(0,p.jsx)(`option`,{value:`monthly`,children:n.modeMonthly}),(0,p.jsx)(`option`,{value:`custom`,children:n.modeCustom})]}),w===`no_repeat`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`date`,disabled:r,className:_,value:E,onChange:e=>{C({onceDate:e.target.value})},"aria-label":n.modeNoRepeat}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`interval`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`select`,{className:o(h,`w-auto min-w-[5rem]`),disabled:r,value:T,onChange:e=>{let t=e.target.value;C({intervalKind:t,intervalMinutesDraft:null,intervalHoursDraft:null})},"aria-label":n.modeInterval,children:[(0,p.jsx)(`option`,{value:`minutes`,children:n.intervalKindMinutes}),(0,p.jsx)(`option`,{value:`hours`,children:n.intervalKindHours})]}),T===`minutes`?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:59,disabled:r,className:v,value:P??String(D),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalMinutesDraft:t};Number.isFinite(n)&&n>=1&&n<=59&&(r.intervalMinutes=n),C(r)},onBlur:()=>{if(P===null)return;let e=parseInt(P,10);C({intervalMinutes:!Number.isFinite(e)||e<1?5:Math.min(59,Math.max(1,Math.round(e))),intervalMinutesDraft:null})},"aria-label":n.intervalMinutes}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:23,disabled:r,className:v,value:F??String(O),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalHoursDraft:t};Number.isFinite(n)&&n>=1&&n<=23&&(r.intervalHours=n),C(r)},onBlur:()=>{if(F===null)return;let e=parseInt(F,10);C({intervalHours:!Number.isFinite(e)||e<1?2:Math.min(23,Math.max(1,Math.round(e))),intervalHoursDraft:null})},"aria-label":n.intervalHours}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.hourUnit}),(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),w===`daily`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`weekly`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`monthly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4.5rem]`),disabled:r,value:M,onChange:e=>{C({dayOfMonth:parseInt(e.target.value,10)})},"aria-label":n.dayOfMonth,children:Array.from({length:31},(e,t)=>t+1).map(e=>(0,p.jsx)(`option`,{value:e,children:e},e))}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`hourly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),z=w===`weekly`?(0,p.jsx)(`div`,{className:`flex flex-wrap gap-1.5 pt-1`,role:`group`,"aria-label":n.modeWeekly,children:n.weekdays.map((e,t)=>{let n=j[t];return(0,p.jsx)(`button`,{type:`button`,disabled:r,className:o(`flex size-9 select-none items-center justify-center rounded-full border text-xs font-medium transition-colors`,n?`border-fg bg-fg text-surface-panel`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),"aria-pressed":n,onClick:()=>{let e=[...j];e[t]=!e[t],C({weekDays:e})},children:e},e)})}):null,B=w===`custom`?(0,p.jsxs)(`div`,{className:`pt-1`,children:[(0,p.jsx)(`textarea`,{disabled:r,className:y,rows:2,spellCheck:!1,value:N,placeholder:`*/5 * * * *`,onChange:e=>{C({rawCron:e.target.value})},"aria-label":n.modeCustom}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:n.customCronHint})]}):null;return(0,p.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[i?(0,p.jsx)(`span`,{className:`text-xs font-medium text-fg-muted`,children:n.scheduleTimeLabel}):null,R,z,B]})}function w(){return r(`/api/workspace/heartbeat-md`)}async function T(){let e=await i(w());return typeof e.payload?.content==`string`?e.payload.content:``}function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function D(e){let t=E(e)?e:{},n=E(t.gateway)?t.gateway:{},r=E(n.heartbeat)?n.heartbeat:{},i=r.activeHours,a=E(i)?i:null,o=a&&typeof a.start==`string`&&typeof a.end==`string`&&a.start&&a.end?{start:a.start,end:a.end,timezone:typeof a.timezone==`string`?a.timezone:``}:null;return{enabled:!!(r.enabled??!0),intervalMs:typeof r.intervalMs==`number`&&Number.isFinite(r.intervalMs)?r.intervalMs:18e5,includeSystemPromptSection:r.includeSystemPromptSection===!0,target:typeof r.target==`string`?r.target:``,targetChatId:typeof r.targetChatId==`string`?r.targetChatId:``,prompt:typeof r.prompt==`string`?r.prompt:``,ackMaxChars:typeof r.ackMaxChars==`number`&&Number.isFinite(r.ackMaxChars)?r.ackMaxChars:``,isolatedSession:!!r.isolatedSession,activeHours:o}}function O(e){let t={enabled:e.enabled,intervalMs:e.intervalMs,includeSystemPromptSection:e.includeSystemPromptSection};return e.target.trim()?t.target=e.target.trim():t.target=null,e.targetChatId.trim()?t.targetChatId=e.targetChatId.trim():t.targetChatId=null,e.prompt.trim()?t.prompt=e.prompt.trim():t.prompt=null,e.ackMaxChars===``||e.ackMaxChars===void 0?t.ackMaxChars=null:t.ackMaxChars=e.ackMaxChars,e.isolatedSession?t.isolatedSession=!0:t.isolatedSession=null,e.activeHours?.start?.trim()&&e.activeHours?.end?.trim()?t.activeHours={start:e.activeHours.start.trim(),end:e.activeHours.end.trim(),...e.activeHours.timezone.trim()?{timezone:e.activeHours.timezone.trim()}:{}}:t.activeHours=null,t}async function k(e){await i(r(`/api/config`),{method:`PATCH`,body:JSON.stringify({gateway:{heartbeat:O(e)}})}),l()}async function A(e){await i(r(`/api/workspace/heartbeat-md`),{method:`PUT`,body:JSON.stringify({content:e})}),a(w())}async function j(e){await i(r(`/api/heartbeat/trigger`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e?{reason:e}:{})})}export{T as a,j as i,k as n,w as o,A as r,C as s,D as t};
2
- //# sourceMappingURL=heartbeat-config-api-BqfDabSI.js.map
1
+ import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,t as n}from"./vendor-react-BOUWij0V.js";import{i as r,n as i}from"./fetch-EGO9T3MN.js";import{o as a}from"./vendor-swr-BIWyz7Rc.js";import{n as o}from"./button-KafIU8dx.js";import{Rn as s,Vn as c,sn as l}from"./index-Dxy9ZCtC.js";import{m as u,p as d}from"./cron-dreaming-jobs-DueM3rBz.js";var f=e(t(),1),p=n(),m=Array.from({length:60},(e,t)=>t),h=o(c,`min-w-0 shrink text-xs sm:min-w-[7rem] sm:max-w-[11rem]`),g=o(`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`,s,`dark:bg-surface-panel`),_=o(`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`,s),v=o(`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`,s),y=o(`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`,s);function b(e){return{...e,intervalMinutesDraft:null,intervalHoursDraft:null}}function x(e){let{intervalMinutesDraft:t,intervalHoursDraft:n,...r}=e;return r}function S(e,t){switch(t.type){case`reset`:return b(t.state);case`replace`:return t.state}}function C({value:e,onChange:t,labels:n,disabled:r,showHeading:i=!0}){let a=(0,f.useMemo)(()=>u(e),[e]),[s,c]=(0,f.useReducer)(S,a,b),l=(0,f.useRef)(e);l.current!==e&&(l.current=e,c({type:`reset`,state:a}));let C=(0,f.useCallback)(e=>{let n={...s,...e};c({type:`replace`,state:n});let r=x(n),i=x(s);Object.keys(r).some(e=>r[e]!==i[e])&&t(d(r))},[t,s]),{mode:w,intervalKind:T,onceDate:E,intervalMinutes:D,intervalHours:O,minute:k,hour:A,weekDays:j,dayOfMonth:M,rawCron:N,intervalMinutesDraft:P,intervalHoursDraft:F}=s,I=`${String(A).padStart(2,`0`)}:${String(k).padStart(2,`0`)}`,L=e=>{let t=e.target.value;if(!t)return;let[n,r]=t.split(`:`).map(e=>parseInt(e,10));Number.isNaN(n)||Number.isNaN(r)||C({minute:r,hour:n})},R=(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-nowrap items-center gap-2 overflow-x-auto pb-0.5`,children:[(0,p.jsxs)(`select`,{className:h,disabled:r,value:w,onChange:e=>{let t=e.target.value;C({mode:t})},"aria-label":n.scheduleTimeLabel,children:[(0,p.jsx)(`option`,{value:`no_repeat`,children:n.modeNoRepeat}),(0,p.jsx)(`option`,{value:`interval`,children:n.modeInterval}),(0,p.jsx)(`option`,{value:`hourly`,children:n.modeHourly}),(0,p.jsx)(`option`,{value:`daily`,children:n.modeDaily}),(0,p.jsx)(`option`,{value:`weekly`,children:n.modeWeekly}),(0,p.jsx)(`option`,{value:`monthly`,children:n.modeMonthly}),(0,p.jsx)(`option`,{value:`custom`,children:n.modeCustom})]}),w===`no_repeat`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`date`,disabled:r,className:_,value:E,onChange:e=>{C({onceDate:e.target.value})},"aria-label":n.modeNoRepeat}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`interval`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`select`,{className:o(h,`w-auto min-w-[5rem]`),disabled:r,value:T,onChange:e=>{let t=e.target.value;C({intervalKind:t,intervalMinutesDraft:null,intervalHoursDraft:null})},"aria-label":n.modeInterval,children:[(0,p.jsx)(`option`,{value:`minutes`,children:n.intervalKindMinutes}),(0,p.jsx)(`option`,{value:`hours`,children:n.intervalKindHours})]}),T===`minutes`?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:59,disabled:r,className:v,value:P??String(D),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalMinutesDraft:t};Number.isFinite(n)&&n>=1&&n<=59&&(r.intervalMinutes=n),C(r)},onBlur:()=>{if(P===null)return;let e=parseInt(P,10);C({intervalMinutes:!Number.isFinite(e)||e<1?5:Math.min(59,Math.max(1,Math.round(e))),intervalMinutesDraft:null})},"aria-label":n.intervalMinutes}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`input`,{type:`number`,min:1,max:23,disabled:r,className:v,value:F??String(O),onChange:e=>{let t=e.target.value,n=parseInt(t,10),r={intervalHoursDraft:t};Number.isFinite(n)&&n>=1&&n<=23&&(r.intervalHours=n),C(r)},onBlur:()=>{if(F===null)return;let e=parseInt(F,10);C({intervalHours:!Number.isFinite(e)||e<1?2:Math.min(23,Math.max(1,Math.round(e))),intervalHoursDraft:null})},"aria-label":n.intervalHours}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.hourUnit}),(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),w===`daily`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`weekly`&&(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel}),w===`monthly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4.5rem]`),disabled:r,value:M,onChange:e=>{C({dayOfMonth:parseInt(e.target.value,10)})},"aria-label":n.dayOfMonth,children:Array.from({length:31},(e,t)=>t+1).map(e=>(0,p.jsx)(`option`,{value:e,children:e},e))}),(0,p.jsx)(`input`,{type:`time`,step:60,disabled:r,className:g,value:I,onChange:L,"aria-label":n.scheduleTimeLabel})]}),w===`hourly`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`select`,{className:o(h,`w-auto min-w-[4rem]`),disabled:r,value:k,onChange:e=>{C({minute:parseInt(e.target.value,10)})},"aria-label":n.minuteAtHour,children:m.map(e=>(0,p.jsx)(`option`,{value:e,children:String(e).padStart(2,`0`)},e))}),(0,p.jsx)(`span`,{className:`shrink-0 text-sm text-fg-muted`,children:n.minuteUnit})]})]}),z=w===`weekly`?(0,p.jsx)(`div`,{className:`flex flex-wrap gap-1.5 pt-1`,role:`group`,"aria-label":n.modeWeekly,children:n.weekdays.map((e,t)=>{let n=j[t];return(0,p.jsx)(`button`,{type:`button`,disabled:r,className:o(`flex size-9 select-none items-center justify-center rounded-full border text-xs font-medium transition-colors`,n?`border-fg bg-fg text-surface-panel`:`border-edge-subtle bg-surface-panel text-fg hover:border-edge`),"aria-pressed":n,onClick:()=>{let e=[...j];e[t]=!e[t],C({weekDays:e})},children:e},e)})}):null,B=w===`custom`?(0,p.jsxs)(`div`,{className:`pt-1`,children:[(0,p.jsx)(`textarea`,{disabled:r,className:y,rows:2,spellCheck:!1,value:N,placeholder:`*/5 * * * *`,onChange:e=>{C({rawCron:e.target.value})},"aria-label":n.modeCustom}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-fg-muted`,children:n.customCronHint})]}):null;return(0,p.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[i?(0,p.jsx)(`span`,{className:`text-xs font-medium text-fg-muted`,children:n.scheduleTimeLabel}):null,R,z,B]})}function w(){return r(`/api/workspace/heartbeat-md`)}async function T(){let e=await i(w());return typeof e.payload?.content==`string`?e.payload.content:``}function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function D(e){let t=E(e)?e:{},n=E(t.gateway)?t.gateway:{},r=E(n.heartbeat)?n.heartbeat:{},i=r.activeHours,a=E(i)?i:null,o=a&&typeof a.start==`string`&&typeof a.end==`string`&&a.start&&a.end?{start:a.start,end:a.end,timezone:typeof a.timezone==`string`?a.timezone:``}:null;return{enabled:!!(r.enabled??!0),intervalMs:typeof r.intervalMs==`number`&&Number.isFinite(r.intervalMs)?r.intervalMs:18e5,includeSystemPromptSection:r.includeSystemPromptSection===!0,target:typeof r.target==`string`?r.target:``,targetChatId:typeof r.targetChatId==`string`?r.targetChatId:``,prompt:typeof r.prompt==`string`?r.prompt:``,ackMaxChars:typeof r.ackMaxChars==`number`&&Number.isFinite(r.ackMaxChars)?r.ackMaxChars:``,isolatedSession:!!r.isolatedSession,activeHours:o}}function O(e){let t={enabled:e.enabled,intervalMs:e.intervalMs,includeSystemPromptSection:e.includeSystemPromptSection};return e.target.trim()?t.target=e.target.trim():t.target=null,e.targetChatId.trim()?t.targetChatId=e.targetChatId.trim():t.targetChatId=null,e.prompt.trim()?t.prompt=e.prompt.trim():t.prompt=null,e.ackMaxChars===``||e.ackMaxChars===void 0?t.ackMaxChars=null:t.ackMaxChars=e.ackMaxChars,e.isolatedSession?t.isolatedSession=!0:t.isolatedSession=null,e.activeHours?.start?.trim()&&e.activeHours?.end?.trim()?t.activeHours={start:e.activeHours.start.trim(),end:e.activeHours.end.trim(),...e.activeHours.timezone.trim()?{timezone:e.activeHours.timezone.trim()}:{}}:t.activeHours=null,t}async function k(e){await i(r(`/api/config`),{method:`PATCH`,body:JSON.stringify({gateway:{heartbeat:O(e)}})}),l()}async function A(e){await i(r(`/api/workspace/heartbeat-md`),{method:`PUT`,body:JSON.stringify({content:e})}),a(w())}async function j(e){await i(r(`/api/heartbeat/trigger`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e?{reason:e}:{})})}export{T as a,j as i,k as n,w as o,A as r,C as s,D as t};
2
+ //# sourceMappingURL=heartbeat-config-api-DxpIEZNs.js.map
@@ -1 +1 @@
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":"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-DxpIEZNs.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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"}