@timqi/pier 0.0.29 → 0.1.1

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 (165) hide show
  1. package/README.md +58 -125
  2. package/dist/agent/config.js +24 -11
  3. package/dist/agent/credentials.js +11 -23
  4. package/dist/agent/events.js +43 -62
  5. package/dist/agent/listing.js +113 -68
  6. package/dist/agent/pi.js +204 -211
  7. package/dist/boards/boards.js +19 -29
  8. package/dist/channels/attach.js +14 -42
  9. package/dist/channels/chains.js +33 -37
  10. package/dist/channels/chunk.js +8 -28
  11. package/dist/channels/commands.js +3 -14
  12. package/dist/channels/config.js +33 -52
  13. package/dist/channels/control.js +4 -13
  14. package/dist/channels/conversations.js +8 -25
  15. package/dist/channels/dedup.js +8 -17
  16. package/dist/channels/gatekeeper.js +13 -23
  17. package/dist/channels/lark-api.js +23 -63
  18. package/dist/channels/lark-outbound.js +12 -44
  19. package/dist/channels/lark-panel.js +8 -24
  20. package/dist/channels/lark-render.js +18 -62
  21. package/dist/channels/lark.js +52 -141
  22. package/dist/channels/lines.js +13 -15
  23. package/dist/channels/panel.js +16 -36
  24. package/dist/channels/receipts.js +29 -52
  25. package/dist/channels/routes.js +3 -9
  26. package/dist/channels/runtime.js +12 -23
  27. package/dist/channels/slack-api.js +34 -86
  28. package/dist/channels/slack-directory.js +7 -23
  29. package/dist/channels/slack-outbound.js +12 -56
  30. package/dist/channels/slack-panel.js +4 -13
  31. package/dist/channels/slack-render.js +23 -91
  32. package/dist/channels/slack-tool.js +48 -171
  33. package/dist/channels/slack.js +73 -239
  34. package/dist/channels/telegram-api.js +8 -20
  35. package/dist/channels/telegram-panel.js +5 -21
  36. package/dist/channels/telegram-render.js +13 -40
  37. package/dist/channels/telegram.js +54 -146
  38. package/dist/channels/types.js +5 -16
  39. package/dist/cli.js +17 -41
  40. package/dist/config-sync.js +87 -4
  41. package/dist/core/hub.js +7 -20
  42. package/dist/core/identity.js +20 -59
  43. package/dist/core/inbound-file.js +15 -49
  44. package/dist/core/inbox.js +13 -35
  45. package/dist/core/queue.js +3 -5
  46. package/dist/core/reply.js +41 -142
  47. package/dist/core/router.js +209 -260
  48. package/dist/core/types.js +17 -1
  49. package/dist/db.js +98 -252
  50. package/dist/drain.js +58 -51
  51. package/dist/extensions/index.js +3 -11
  52. package/dist/extensions/web/anthropic.js +3 -9
  53. package/dist/extensions/web/artifacts.js +2 -5
  54. package/dist/extensions/web/content.js +6 -14
  55. package/dist/extensions/web/http.js +2 -6
  56. package/dist/extensions/web/language.js +8 -18
  57. package/dist/extensions/web/openai.js +1 -1
  58. package/dist/extensions/web/provider.js +5 -18
  59. package/dist/extensions/web/tools.js +19 -63
  60. package/dist/lock.js +98 -0
  61. package/dist/log.js +9 -26
  62. package/dist/main.js +87 -179
  63. package/dist/paths.js +10 -26
  64. package/dist/secrets.js +19 -46
  65. package/dist/service.js +33 -75
  66. package/dist/settings.js +42 -65
  67. package/dist/tasks/agent.js +129 -114
  68. package/dist/tasks/callbacks.js +9 -19
  69. package/dist/tasks/command.js +29 -14
  70. package/dist/tasks/definitions.js +39 -62
  71. package/dist/tasks/execution.js +46 -42
  72. package/dist/tasks/groups.js +41 -35
  73. package/dist/tasks/messages.js +121 -182
  74. package/dist/tasks/outbox.js +61 -55
  75. package/dist/tasks/routes.js +5 -11
  76. package/dist/tasks/runs.js +14 -13
  77. package/dist/tasks/service.js +53 -54
  78. package/dist/tasks/store.js +53 -30
  79. package/dist/tasks/tool.js +132 -61
  80. package/dist/tools-task.js +20 -60
  81. package/dist/tools.js +100 -327
  82. package/dist/update.js +21 -44
  83. package/dist/web/auth.js +118 -179
  84. package/dist/web/config-sync.js +2 -2
  85. package/dist/web/config.js +3 -7
  86. package/dist/web/explorer.js +10 -21
  87. package/dist/web/fs.js +20 -42
  88. package/dist/web/instance.js +45 -85
  89. package/dist/web/providers.js +14 -13
  90. package/dist/web/public/assets/{activity-D3m4L2IL.js → activity-B89_hH7q.js} +2 -2
  91. package/dist/web/public/assets/activity-B89_hH7q.js.br +0 -0
  92. package/dist/web/public/assets/activity-B89_hH7q.js.gz +0 -0
  93. package/dist/web/public/assets/boards-BeKW0ZXK.js +1 -0
  94. package/dist/web/public/assets/boards-BeKW0ZXK.js.br +0 -0
  95. package/dist/web/public/assets/boards-BeKW0ZXK.js.gz +0 -0
  96. package/dist/web/public/assets/explorer-DIuMlaV3.js +4 -0
  97. package/dist/web/public/assets/explorer-DIuMlaV3.js.br +0 -0
  98. package/dist/web/public/assets/explorer-DIuMlaV3.js.gz +0 -0
  99. package/dist/web/public/assets/index-DzXDXra_.js +85 -0
  100. package/dist/web/public/assets/index-DzXDXra_.js.br +0 -0
  101. package/dist/web/public/assets/index-DzXDXra_.js.gz +0 -0
  102. package/dist/web/public/assets/index-eqQLVS8Q.css +2 -0
  103. package/dist/web/public/assets/index-eqQLVS8Q.css.br +0 -0
  104. package/dist/web/public/assets/index-eqQLVS8Q.css.gz +0 -0
  105. package/dist/web/public/assets/runs-Cwy0mN8i.js +1 -0
  106. package/dist/web/public/assets/runs-Cwy0mN8i.js.br +0 -0
  107. package/dist/web/public/assets/runs-Cwy0mN8i.js.gz +0 -0
  108. package/dist/web/public/assets/settings-DzZLmujq.js +5 -0
  109. package/dist/web/public/assets/settings-DzZLmujq.js.br +0 -0
  110. package/dist/web/public/assets/settings-DzZLmujq.js.gz +0 -0
  111. package/dist/web/public/assets/task-runs-BCakxFk8.js +3 -0
  112. package/dist/web/public/assets/task-runs-BCakxFk8.js.br +0 -0
  113. package/dist/web/public/assets/task-runs-BCakxFk8.js.gz +0 -0
  114. package/dist/web/public/assets/tasks-BlzEbk11.js +4 -0
  115. package/dist/web/public/assets/tasks-BlzEbk11.js.br +0 -0
  116. package/dist/web/public/assets/tasks-BlzEbk11.js.gz +0 -0
  117. package/dist/web/public/index.html +100 -130
  118. package/dist/web/public/index.html.br +0 -0
  119. package/dist/web/public/index.html.gz +0 -0
  120. package/dist/web/public/manifest.webmanifest +2 -2
  121. package/dist/web/public/manifest.webmanifest.br +0 -0
  122. package/dist/web/public/manifest.webmanifest.gz +0 -0
  123. package/dist/web/public/sw.js +14 -2
  124. package/dist/web/public/sw.js.br +0 -0
  125. package/dist/web/public/sw.js.gz +0 -0
  126. package/dist/web/push.js +55 -77
  127. package/dist/web/route.js +3 -7
  128. package/dist/web/server.js +131 -180
  129. package/dist/web/session-state.js +14 -54
  130. package/dist/web/types.js +2 -4
  131. package/dist/web/webpush.js +10 -25
  132. package/docs/deploy.md +115 -330
  133. package/package.json +2 -1
  134. package/skills/pier-boards/SKILL.md +81 -160
  135. package/skills/pier-help/SKILL.md +23 -20
  136. package/skills/pier-slack/SKILL.md +2 -2
  137. package/skills/pier-tasks/SKILL.md +153 -160
  138. package/dist/config-sync-fetch.js +0 -84
  139. package/dist/limits.js +0 -14
  140. package/dist/web/public/assets/activity-D3m4L2IL.js.br +0 -0
  141. package/dist/web/public/assets/activity-D3m4L2IL.js.gz +0 -0
  142. package/dist/web/public/assets/boards-BIObcQeX.js +0 -1
  143. package/dist/web/public/assets/boards-BIObcQeX.js.br +0 -0
  144. package/dist/web/public/assets/boards-BIObcQeX.js.gz +0 -0
  145. package/dist/web/public/assets/explorer-C_rSWPNB.js +0 -4
  146. package/dist/web/public/assets/explorer-C_rSWPNB.js.br +0 -0
  147. package/dist/web/public/assets/explorer-C_rSWPNB.js.gz +0 -0
  148. package/dist/web/public/assets/index-CX3fYZY5.css +0 -2
  149. package/dist/web/public/assets/index-CX3fYZY5.css.br +0 -0
  150. package/dist/web/public/assets/index-CX3fYZY5.css.gz +0 -0
  151. package/dist/web/public/assets/index-uFsZkKOQ.js +0 -85
  152. package/dist/web/public/assets/index-uFsZkKOQ.js.br +0 -0
  153. package/dist/web/public/assets/index-uFsZkKOQ.js.gz +0 -0
  154. package/dist/web/public/assets/runs-Ch6DZq6O.js +0 -1
  155. package/dist/web/public/assets/runs-Ch6DZq6O.js.br +0 -0
  156. package/dist/web/public/assets/runs-Ch6DZq6O.js.gz +0 -0
  157. package/dist/web/public/assets/settings-BWcEIEcv.js +0 -5
  158. package/dist/web/public/assets/settings-BWcEIEcv.js.br +0 -0
  159. package/dist/web/public/assets/settings-BWcEIEcv.js.gz +0 -0
  160. package/dist/web/public/assets/task-runs-DPkwv2UE.js +0 -3
  161. package/dist/web/public/assets/task-runs-DPkwv2UE.js.br +0 -0
  162. package/dist/web/public/assets/task-runs-DPkwv2UE.js.gz +0 -0
  163. package/dist/web/public/assets/tasks-DTiCi2mH.js +0 -4
  164. package/dist/web/public/assets/tasks-DTiCi2mH.js.br +0 -0
  165. package/dist/web/public/assets/tasks-DTiCi2mH.js.gz +0 -0
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-content:"";--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-green-50:oklch(98.2% .018 155.826);--color-green-500:oklch(72.3% .219 149.579);--color-green-700:oklch(52.7% .154 150.069);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-700:oklch(52% .105 223.128);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-700:oklch(49.1% .27 292.581);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background:var(--workbench-canvas)}::selection{background:var(--color-indigo-100);color:var(--color-indigo-800)}:focus-visible{outline:2px solid var(--color-indigo-500);outline-offset:3px}input,textarea,select{accent-color:var(--color-indigo-600)}dialog{background:var(--color-white);color:var(--color-neutral-800)}dialog::backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}*{scrollbar-width:thin;scrollbar-color:var(--color-neutral-300) transparent}}@layer components{.btn{cursor:pointer;border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-neutral-200);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:2147483647px}@media (hover:hover){.btn:hover{border-color:var(--color-neutral-300);background-color:var(--color-neutral-50)}}.btn:active{background-color:var(--color-neutral-100)}.btn:disabled{cursor:not-allowed;opacity:.45}@media (hover:hover){.btn:disabled:hover{background-color:var(--color-white)}}.btn-primary{border-color:var(--color-indigo-600);background-color:var(--color-indigo-600);color:var(--color-white);--tw-shadow-color:#4f39f633}@supports (color:color-mix(in lab, red, red)){.btn-primary{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-indigo-600) 20%, transparent) var(--tw-shadow-alpha), transparent)}}@media (hover:hover){.btn-primary:hover{border-color:var(--color-indigo-500);background-color:var(--color-indigo-500)}}.btn-primary:active{background-color:var(--color-indigo-700)}.btn-primary:where([data-theme=dark],[data-theme=dark] *){color:var(--color-neutral-50)}.select{cursor:pointer;appearance:none;background-color:var(--color-white);padding-right:calc(var(--spacing) * 8);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));background-image:var(--select-chevron);background-position:right .5rem center;background-repeat:no-repeat;background-size:.9rem}.icon-btn{height:calc(var(--spacing) * 7);width:calc(var(--spacing) * 7);cursor:pointer;color:var(--color-neutral-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:2147483647px;flex:none;justify-content:center;align-items:center;display:flex}@media (hover:hover){.icon-btn:hover{background-color:var(--color-neutral-200);color:var(--color-neutral-700)}}.pagehead{min-height:calc(var(--spacing) * 12);align-items:center;gap:calc(var(--spacing) * 2);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);white-space:nowrap;flex-wrap:wrap;flex:none;display:flex;overflow-x:auto}.lightbox-btn{height:calc(var(--spacing) * 10);width:calc(var(--spacing) * 10);cursor:pointer;background-color:#0009;border-radius:2147483647px;justify-content:center;align-items:center;display:flex;position:absolute}@supports (color:color-mix(in lab, red, red)){.lightbox-btn{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.lightbox-btn{--tw-leading:1;color:var(--color-white);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#ffffff4d;font-size:1.5rem;line-height:1}@supports (color:color-mix(in lab, red, red)){.lightbox-btn{--tw-ring-color:color-mix(in oklab, var(--color-white) 30%, transparent)}}@media (hover:hover){.lightbox-btn:hover{background-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.lightbox-btn:hover{background-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}}.lightbox-btn:where([data-theme=dark],[data-theme=dark] *){color:var(--color-neutral-950)}summary{list-style-type:none}summary::-webkit-details-marker{display:none}.chev{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;flex:none;font-size:10px;transition-duration:.15s;display:inline-block}details[open]>summary .chev{transform:rotate(90deg)}.spinner{height:calc(var(--spacing) * 3);width:calc(var(--spacing) * 3);animation:var(--animate-spin);flex:none}.skeleton{animation:var(--animate-pulse);background-color:var(--color-neutral-200);border-radius:.25rem}.thumb{height:calc(var(--spacing) * 16);width:calc(var(--spacing) * 16);cursor:zoom-in;border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:#0000000d;display:inline-block}@supports (color:color-mix(in lab, red, red)){.thumb{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.thumb{background-color:#00000005}@supports (color:color-mix(in lab, red, red)){.thumb{background-color:color-mix(in oklab, var(--color-black) 2%, transparent)}}.thumb{object-fit:contain;vertical-align:middle}.thumb:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-neutral-200);background-color:var(--color-neutral-100)}.thumbs{margin-top:calc(var(--spacing) * 1.5);align-items:center;gap:calc(var(--spacing) * 1.5);flex-wrap:wrap;display:flex}.help code{background-color:var(--color-neutral-100);padding-inline:var(--spacing);font-family:var(--font-mono);color:var(--color-neutral-700);border-radius:.25rem;padding-block:1px;font-size:11.5px}.help a{color:var(--color-indigo-600);text-decoration-line:underline}.help em{font-style:italic}.md{color:var(--tw-prose-body);max-width:65ch}.md :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.md :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.md :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.md :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.md :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.md :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.md :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.md :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.md :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.md :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.md :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.md :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.md :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.md :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.md :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.md :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.md :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.md :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.md :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.md :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.md :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.md :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.md :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.md :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.md :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.md :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.md :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.md :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.md :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.md :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.md :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.md :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.md :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.md :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.md :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.md :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.md :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.md :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.md :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.md :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.md :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.md :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.md :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.md :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.md :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.md :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.md :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.md :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.md :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.md :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.md :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.md :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.md :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.md :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.md :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.md :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.md :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.md{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.md :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.md :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.md :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.md :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.md :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.md :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.md :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.md :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.md :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.md :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.md :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.md :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.md :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.md :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.md :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.md :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.md :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.md :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.md :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.md :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.md{--tw-prose-body:var(--color-neutral-900);--tw-prose-headings:var(--color-neutral-900);--tw-prose-lead:oklch(43.9% 0 none);--tw-prose-links:var(--color-neutral-900);--tw-prose-bold:var(--color-neutral-900);--tw-prose-counters:oklch(55.6% 0 none);--tw-prose-bullets:oklch(87% 0 none);--tw-prose-hr:oklch(92.2% 0 none);--tw-prose-quotes:var(--color-neutral-900);--tw-prose-quote-borders:oklch(92.2% 0 none);--tw-prose-captions:oklch(55.6% 0 none);--tw-prose-kbd:var(--color-neutral-900);--tw-prose-kbd-shadows:#1717171a;--tw-prose-code:oklch(20.5% 0 none);--tw-prose-pre-code:oklch(92.2% 0 none);--tw-prose-pre-bg:oklch(26.9% 0 none);--tw-prose-th-borders:oklch(87% 0 none);--tw-prose-td-borders:oklch(92.2% 0 none);--tw-prose-invert-body:oklch(87% 0 none);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.8% 0 none);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.8% 0 none);--tw-prose-invert-bullets:oklch(43.9% 0 none);--tw-prose-invert-hr:oklch(37.1% 0 none);--tw-prose-invert-quotes:oklch(97% 0 none);--tw-prose-invert-quote-borders:oklch(37.1% 0 none);--tw-prose-invert-captions:oklch(70.8% 0 none);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87% 0 none);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(43.9% 0 none);--tw-prose-invert-td-borders:oklch(37.1% 0 none);max-width:none;font-size:inherit;line-height:inherit}@supports (color:color-mix(in lab, red, red)){.md{--tw-prose-kbd-shadows:color-mix(in oklab, var(--color-neutral-900) 10%, transparent)}}.md{--tw-prose-code:var(--color-neutral-900);--tw-prose-counters:var(--color-neutral-500);--tw-prose-captions:var(--color-neutral-500);--tw-prose-bullets:var(--color-neutral-300);--tw-prose-th-borders:var(--color-neutral-300);--tw-prose-hr:var(--color-neutral-200);--tw-prose-quote-borders:var(--color-neutral-200);--tw-prose-td-borders:var(--color-neutral-200)}.md p,.md ul,.md ol,.md pre,.md blockquote,.md table{margin-block:.5em}.md li{margin-block:.1em}.md li>p,.md :is(ul,ol) :is(ul,ol){margin-block:.2em}.md :first-child{margin-top:0}.md :last-child{margin-bottom:0}.md :is(h1,h2,h3,h4,h5,h6){margin-block:.8em .2em;font-size:1em;font-weight:600;line-height:1.3}.md h1{font-size:1.22em}.md h2{font-size:1.12em}.md hr{margin-block:.9em}.md table{overscroll-behavior-x:contain;width:max-content;max-width:100%;display:block;overflow-x:auto}.md pre{border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:#e5e5e5b3;overflow-x:hidden}@supports (color:color-mix(in lab, red, red)){.md pre{border-color:color-mix(in oklab, var(--color-neutral-200) 70%, transparent)}}.md pre{background-color:var(--color-neutral-50);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);white-space:pre-wrap;font-size:13px}.md pre:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-neutral-200);background-color:var(--color-neutral-100)}.md pre{overflow-wrap:anywhere;color:var(--color-neutral-800)}.md pre code{white-space:inherit;overflow-wrap:inherit}.md :not(pre)>code{background-color:#0000000e;border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.md :not(pre)>code{background-color:color-mix(in oklab, var(--color-black) 5.5%, transparent)}}.md :not(pre)>code{padding-inline:var(--spacing);--tw-font-weight:var(--font-weight-normal);font-size:.9em;font-weight:var(--font-weight-normal);color:var(--color-neutral-800);padding-block:1px}.md :not(pre)>code:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-neutral-100)}.md :not(pre)>code:before,.md :not(pre)>code:after{content:none}.hljs-comment,.hljs-quote{color:var(--color-neutral-400);font-style:italic}.hljs-keyword,.hljs-literal,.hljs-selector-tag,.hljs-type{color:var(--color-violet-700)}.hljs-string,.hljs-regexp,.hljs-addition{color:var(--color-emerald-700)}.hljs-number,.hljs-symbol,.hljs-attr,.hljs-attribute,.hljs-meta{color:var(--color-amber-700)}.hljs-title,.hljs-section,.hljs-name{color:var(--color-blue-700)}.hljs-built_in,.hljs-variable,.hljs-template-variable{color:var(--color-cyan-700)}.hljs-deletion{color:var(--color-red-600)}.hljs-emphasis{font-style:italic}.hljs-strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-2{inset-inline:calc(var(--spacing) * 2)}.inset-y-0{inset-block:0}.-top-0\.5{top:calc(var(--spacing) * -.5)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-\[-8px\]{top:-8px}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.right-0{right:0}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-full{right:100%}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-0{left:0}.left-2{left:calc(var(--spacing) * 2)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.m-4{margin:calc(var(--spacing) * 4)}.m-auto{margin:auto}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-\[12vh\]{margin-top:12vh}.mr-1{margin-right:var(--spacing)}.mr-auto{margin-right:auto}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-auto{margin-bottom:auto}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0{height:0}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-72{height:calc(var(--spacing) * 72)}.h-\[1\.125rem\]{height:1.125rem}.h-\[3\.25rem\]{height:3.25rem}.h-\[100dvh\],.h-dvh{height:100dvh}.h-full{height:100%}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[4lh\]{max-height:4lh}.max-h-\[6rem\]{max-height:6rem}.max-h-\[60dvh\]{max-height:60dvh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[65vh\]{max-height:65vh}.max-h-\[70dvh\]{max-height:70dvh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[88vh\]{max-height:88vh}.max-h-\[92dvh\]{max-height:92dvh}.max-h-\[calc\(100dvh-1rem\)\]{max-height:calc(100dvh - 1rem)}.max-h-none{max-height:none}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-12{min-height:calc(var(--spacing) * 12)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/3{width:33.3333%}.w-2{width:calc(var(--spacing) * 2)}.w-2\/3{width:66.6667%}.w-2\/5{width:40%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/5{width:60%}.w-4{width:calc(var(--spacing) * 4)}.w-4\.5{width:calc(var(--spacing) * 4.5)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-11{width:calc(var(--spacing) * 11)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[1\.125rem\]{width:1.125rem}.w-\[6rem\]{width:6rem}.w-\[10\%\]{width:10%}.w-\[17\%\]{width:17%}.w-\[23\%\]{width:23%}.w-\[36rem\]{width:36rem}.w-\[38\%\]{width:38%}.w-\[38\.75rem\]{width:38.75rem}.w-\[38rem\]{width:38rem}.w-\[42\%\]{width:42%}.w-\[45rem\]{width:45rem}.w-\[50\%\]{width:50%}.w-\[min\(24rem\,calc\(100vw-2rem\)\)\]{width:min(24rem,100vw - 2rem)}.w-\[min\(26rem\,calc\(100vw-2rem\)\)\]{width:min(26rem,100vw - 2rem)}.w-\[min\(27rem\,calc\(100vw-3rem\)\)\]{width:min(27rem,100vw - 3rem)}.w-\[min\(32rem\,92vw\)\]{width:min(32rem,92vw)}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-28{max-width:calc(var(--spacing) * 28)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-52{max-width:calc(var(--spacing) * 52)}.max-w-72{max-width:calc(var(--spacing) * 72)}.max-w-96{max-width:calc(var(--spacing) * 96)}.max-w-\[92vw\]{max-width:92vw}.max-w-\[94vw\]{max-width:94vw}.max-w-\[calc\(100\%-3em\)\]{max-width:calc(100% - 3em)}.max-w-\[min\(42rem\,calc\(100vw-1rem\)\)\]{max-width:min(42rem,100vw - 1rem)}.max-w-full{max-width:100%}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-3\.5{min-width:calc(var(--spacing) * 3.5)}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-60{min-width:calc(var(--spacing) * 60)}.min-w-\[2\.5em\]{min-width:2.5em}.flex-1{flex:1}.flex-none{flex:none}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.shrink-\[999\]{flex-shrink:999}.grow{flex-grow:1}.basis-0{flex-basis:0}.basis-full{flex-basis:100%}.table-fixed{table-layout:fixed}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[6rem_minmax\(0\,1fr\)\]{grid-template-columns:6rem minmax(0,1fr)}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.grid-cols-\[minmax\(8rem\,1fr\)_minmax\(8rem\,auto\)_minmax\(9rem\,auto\)\]{grid-template-columns:minmax(8rem,1fr) minmax(8rem,auto) minmax(9rem,auto)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3\.5{row-gap:calc(var(--spacing) * 3.5)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-neutral-100>:not(:last-child)){border-color:var(--color-neutral-100)}:where(.divide-neutral-200>:not(:last-child)){border-color:var(--color-neutral-200)}:where(.divide-neutral-200\/70>:not(:last-child)){border-color:#e5e5e5b3}@supports (color:color-mix(in lab, red, red)){:where(.divide-neutral-200\/70>:not(:last-child)){border-color:color-mix(in oklab, var(--color-neutral-200) 70%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[1\.75rem\]{border-radius:1.75rem}.rounded-\[8px\]{border-radius:8px}.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-3xl{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-solid{--tw-border-style:solid;border-style:solid}.border-amber-500{border-color:var(--color-amber-500)}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.border-black\/\[0\.06\]{border-color:#0000000f}@supports (color:color-mix(in lab, red, red)){.border-black\/\[0\.06\]{border-color:color-mix(in oklab, var(--color-black) 6%, transparent)}}.border-black\/\[0\.08\]{border-color:#00000014}@supports (color:color-mix(in lab, red, red)){.border-black\/\[0\.08\]{border-color:color-mix(in oklab, var(--color-black) 8%, transparent)}}.border-cyan-500{border-color:var(--color-cyan-500)}.border-indigo-200{border-color:var(--color-indigo-200)}.border-indigo-300{border-color:var(--color-indigo-300)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-200\/70{border-color:#e5e5e5b3}@supports (color:color-mix(in lab, red, red)){.border-neutral-200\/70{border-color:color-mix(in oklab, var(--color-neutral-200) 70%, transparent)}}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-400{border-color:var(--color-neutral-400)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.border-l-amber-400{border-left-color:var(--color-amber-400)}.border-l-cyan-500{border-left-color:var(--color-cyan-500)}.border-l-fuchsia-500{border-left-color:var(--color-fuchsia-500)}.border-l-green-500{border-left-color:var(--color-green-500)}.border-l-neutral-300{border-left-color:var(--color-neutral-300)}.border-l-red-400{border-left-color:var(--color-red-400)}.border-l-red-500{border-left-color:var(--color-red-500)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-100\/80{background-color:#fef3c6cc}@supports (color:color-mix(in lab, red, red)){.bg-amber-100\/80{background-color:color-mix(in oklab, var(--color-amber-100) 80%, transparent)}}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-black\/15{background-color:#00000026}@supports (color:color-mix(in lab, red, red)){.bg-black\/15{background-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab, red, red)){.bg-black\/25{background-color:color-mix(in oklab, var(--color-black) 25%, transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab, red, red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab, var(--color-black) 4%, transparent)}}.bg-black\/\[0\.05\]{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.bg-black\/\[0\.05\]{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.bg-black\/\[0\.025\]{background-color:#00000006}@supports (color:color-mix(in lab, red, red)){.bg-black\/\[0\.025\]{background-color:color-mix(in oklab, var(--color-black) 2.5%, transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-200\/80{background-color:#a4f4cfcc}@supports (color:color-mix(in lab, red, red)){.bg-emerald-200\/80{background-color:color-mix(in oklab, var(--color-emerald-200) 80%, transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-50\/50{background-color:#fafafa80}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/50{background-color:color-mix(in oklab, var(--color-neutral-50) 50%, transparent)}}.bg-neutral-50\/60{background-color:#fafafa99}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/60{background-color:color-mix(in oklab, var(--color-neutral-50) 60%, transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-800\/95{background-color:#262626f2}@supports (color:color-mix(in lab, red, red)){.bg-neutral-800\/95{background-color:color-mix(in oklab, var(--color-neutral-800) 95%, transparent)}}.bg-red-50{background-color:var(--color-red-50)}.bg-red-200\/70{background-color:#ffcacab3}@supports (color:color-mix(in lab, red, red)){.bg-red-200\/70{background-color:color-mix(in oklab, var(--color-red-200) 70%, transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.bg-white\/15{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.bg-white\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-white\/85{background-color:color-mix(in oklab, var(--color-white) 85%, transparent)}}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-px{padding-top:1px}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-\[calc\(0\.25rem\+env\(safe-area-inset-bottom\)\)\]{padding-bottom:calc(.25rem + env(safe-area-inset-bottom))}.pl-1{padding-left:var(--spacing)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-12{padding-left:calc(var(--spacing) * 12)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.75rem\]{font-size:.75rem}.text-\[0\.875rem\]{font-size:.875rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[0\.9375rem\]{font-size:.9375rem}.text-\[1\.0625rem\]{font-size:1.0625rem}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[18px\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.02em\]{--tw-tracking:.02em;letter-spacing:.02em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!whitespace-normal{white-space:normal!important}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-cyan-700{color:var(--color-cyan-700)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-fuchsia-700{color:var(--color-fuchsia-700)}.text-green-700{color:var(--color-green-700)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-indigo-800{color:var(--color-indigo-800)}.text-inherit{color:inherit}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-sky-700{color:var(--color-sky-700)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-85{opacity:.85}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_-1px_0_var\(--color-neutral-200\)\]{--tw-shadow:inset 0 -1px 0 var(--tw-shadow-color,var(--color-neutral-200));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-amber-200{--tw-ring-color:var(--color-amber-200)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-emerald-600\/20{--tw-ring-color:#00976733}@supports (color:color-mix(in lab, red, red)){.ring-emerald-600\/20{--tw-ring-color:color-mix(in oklab, var(--color-emerald-600) 20%, transparent)}}.ring-indigo-200\/70{--tw-ring-color:#c7d2ffb3}@supports (color:color-mix(in lab, red, red)){.ring-indigo-200\/70{--tw-ring-color:color-mix(in oklab, var(--color-indigo-200) 70%, transparent)}}.ring-neutral-200{--tw-ring-color:var(--color-neutral-200)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-violet-200{--tw-ring-color:var(--color-violet-200)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:text-indigo-500:is(:where(.group):hover *){color:var(--color-indigo-500)}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/code\:opacity-100:is(:where(.group\/code):hover *){opacity:1}}.peer-checked\:border-indigo-200:is(:where(.peer):checked~*){border-color:var(--color-indigo-200)}.peer-checked\:bg-indigo-50:is(:where(.peer):checked~*){background-color:var(--color-indigo-50)}.peer-checked\:bg-indigo-600:is(:where(.peer):checked~*){background-color:var(--color-indigo-600)}.peer-checked\:font-semibold:is(:where(.peer):checked~*){--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.peer-checked\:text-indigo-700:is(:where(.peer):checked~*){color:var(--color-indigo-700)}.peer-focus-visible\:ring-2:is(:where(.peer):focus-visible~*){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.peer-focus-visible\:ring-indigo-200:is(:where(.peer):focus-visible~*){--tw-ring-color:var(--color-indigo-200)}.peer-focus-visible\:outline-2:is(:where(.peer):focus-visible~*){outline-style:var(--tw-outline-style);outline-width:2px}.peer-focus-visible\:outline-indigo-500:is(:where(.peer):focus-visible~*){outline-color:var(--color-indigo-500)}.marker\:text-neutral-400 ::marker{color:var(--color-neutral-400)}.marker\:text-neutral-400::marker{color:var(--color-neutral-400)}.marker\:text-neutral-400 ::-webkit-details-marker{color:var(--color-neutral-400)}.marker\:text-neutral-400::-webkit-details-marker{color:var(--color-neutral-400)}.placeholder\:text-neutral-400::placeholder{color:var(--color-neutral-400)}.backdrop\:bg-black\/20::backdrop{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/20::backdrop{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.backdrop\:bg-black\/25::backdrop{background-color:#00000040}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/25::backdrop{background-color:color-mix(in oklab, var(--color-black) 25%, transparent)}}.backdrop\:bg-black\/30::backdrop{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/30::backdrop{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.backdrop\:bg-black\/40::backdrop{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/40::backdrop{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.backdrop\:bg-black\/70::backdrop{background-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/70::backdrop{background-color:color-mix(in oklab, var(--color-black) 70%, transparent)}}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:top-0\.5:after{content:var(--tw-content);top:calc(var(--spacing) * .5)}.after\:left-0\.5:after{content:var(--tw-content);left:calc(var(--spacing) * .5)}.after\:h-3:after{content:var(--tw-content);height:calc(var(--spacing) * 3)}.after\:w-3:after{content:var(--tw-content);width:calc(var(--spacing) * 3)}.after\:rounded-full:after{content:var(--tw-content);border-radius:2147483647px}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\:shadow-sm:after{content:var(--tw-content);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.after\:transition-transform:after{content:var(--tw-content);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.peer-checked\:after\:translate-x-3:is(:where(.peer):checked~*):after{content:var(--tw-content);--tw-translate-x:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.first\:pt-2:first-child{padding-top:calc(var(--spacing) * 2)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.open\:border:is([open],:popover-open,:open){border-style:var(--tw-border-style);border-width:1px}.open\:border-neutral-200:is([open],:popover-open,:open){border-color:var(--color-neutral-200)}.open\:bg-amber-50:is([open],:popover-open,:open){background-color:var(--color-amber-50)}.open\:bg-black\/\[0\.02\]:is([open],:popover-open,:open){background-color:#00000005}@supports (color:color-mix(in lab, red, red)){.open\:bg-black\/\[0\.02\]:is([open],:popover-open,:open){background-color:color-mix(in oklab, var(--color-black) 2%, transparent)}}.open\:bg-green-50:is([open],:popover-open,:open){background-color:var(--color-green-50)}.open\:bg-red-50:is([open],:popover-open,:open){background-color:var(--color-red-50)}.open\:px-3:is([open],:popover-open,:open){padding-inline:calc(var(--spacing) * 3)}.open\:py-2:is([open],:popover-open,:open){padding-block:calc(var(--spacing) * 2)}.open\:text-neutral-500:is([open],:popover-open,:open){color:var(--color-neutral-500)}.focus-within\:border-indigo-400:focus-within{border-color:var(--color-indigo-400)}@media (hover:hover){.hover\:border-indigo-300:hover{border-color:var(--color-indigo-300)}.hover\:border-neutral-300:hover{border-color:var(--color-neutral-300)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-200:hover{background-color:var(--color-amber-200)}.hover\:bg-black\/\[0\.03\]:hover{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/\[0\.03\]:hover{background-color:color-mix(in oklab, var(--color-black) 3%, transparent)}}.hover\:bg-emerald-100:hover{background-color:var(--color-emerald-100)}.hover\:bg-indigo-50:hover{background-color:var(--color-indigo-50)}.hover\:bg-indigo-100:hover{background-color:var(--color-indigo-100)}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-neutral-50:hover{background-color:var(--color-neutral-50)}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-sky-100:hover{background-color:var(--color-sky-100)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:text-indigo-600:hover{color:var(--color-indigo-600)}.hover\:text-indigo-700:hover{color:var(--color-indigo-700)}.hover\:text-neutral-600:hover{color:var(--color-neutral-600)}.hover\:text-neutral-700:hover{color:var(--color-neutral-700)}.hover\:text-neutral-800:hover{color:var(--color-neutral-800)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-indigo-400:focus{border-color:var(--color-indigo-400)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-indigo-100:focus{--tw-ring-color:var(--color-indigo-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.active\:bg-amber-200:active{background-color:var(--color-amber-200)}.active\:bg-amber-300:active{background-color:var(--color-amber-300)}.active\:bg-indigo-100:active{background-color:var(--color-indigo-100)}.active\:bg-indigo-700:active{background-color:var(--color-indigo-700)}.active\:bg-neutral-300:active{background-color:var(--color-neutral-300)}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-40:disabled{opacity:.4}@media not all and (width>=48rem){.max-md\:order-1{order:1}.max-md\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.max-md\:hidden{display:none}.max-md\:h-2\/5{height:40%}.max-md\:max-h-48{max-height:calc(var(--spacing) * 48)}.max-md\:w-full{width:100%}.max-md\:basis-full{flex-basis:100%}.max-md\:flex-col{flex-direction:column}.max-md\:flex-wrap{flex-wrap:wrap}.max-md\:border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.max-md\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.max-md\:whitespace-normal{white-space:normal}}@media not all and (width>=40rem){.max-sm\:w-full{width:100%}.max-sm\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}}@media (width>=40rem){.sm\:h-8{height:calc(var(--spacing) * 8)}.sm\:min-h-8{min-height:calc(var(--spacing) * 8)}.sm\:w-8{width:calc(var(--spacing) * 8)}.sm\:w-88{width:calc(var(--spacing) * 88)}.sm\:min-w-72{min-width:calc(var(--spacing) * 72)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[5\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:5.5rem minmax(0,1fr)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}}@media (width>=48rem){.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-3{grid-column:span 3/span 3}.md\:flex{display:flex}.md\:hidden{display:none}.md\:table-cell{display:table-cell}.md\:w-\[14\%\]{width:14%}.md\:w-\[24\%\]{width:24%}.md\:w-\[34\%\]{width:34%}.md\:max-w-\[calc\(100vw-9rem\)\]{max-width:calc(100vw - 9rem)}.md\:grid-cols-\[6\.25rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:6.25rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[7\.5rem_minmax\(0\,1fr\)_7\.5rem_6\.25rem\]{grid-template-columns:7.5rem minmax(0,1fr) 7.5rem 6.25rem}.md\:grid-cols-\[9\.375rem_minmax\(0\,1fr\)\]{grid-template-columns:9.375rem minmax(0,1fr)}.md\:grid-cols-\[14\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:14.5rem minmax(0,1fr)}.md\:grid-cols-\[minmax\(0\,1fr\)_12rem_5rem\]{grid-template-columns:minmax(0,1fr) 12rem 5rem}}.dark\:border-neutral-200:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-neutral-200)}.dark\:bg-neutral-100:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-neutral-100)}.dark\:bg-neutral-200:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-neutral-200)}.dark\:text-neutral-50:where([data-theme=dark],[data-theme=dark] *){color:var(--color-neutral-50)}.dark\:after\:bg-neutral-950:where([data-theme=dark],[data-theme=dark] *):after{content:var(--tw-content);background-color:var(--color-neutral-950)}.dark\:open\:bg-neutral-100:where([data-theme=dark],[data-theme=dark] *):is([open],:popover-open,:open){background-color:var(--color-neutral-100)}@media (hover:hover){.dark\:hover\:bg-neutral-100:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--color-neutral-100)}}@media (pointer:coarse){.pointer-coarse\:min-h-11{min-height:calc(var(--spacing) * 11)}.pointer-coarse\:px-2{padding-inline:calc(var(--spacing) * 2)}.pointer-coarse\:opacity-100{opacity:1}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}html{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--workbench-canvas:#f1f4f3;--workbench-mist:#e6f1f3;--workbench-mint:#e8f3ed;--glass-edge:#10182814;--glass-shadow:0 1px 2px #1018280f, 0 12px 32px -8px #10182824, inset 0 1px 0 #ffffffb3;--glass-shadow-raised:0 1px 2px #10182814, 0 6px 18px -2px #1018281f, 0 18px 40px -8px #10182833, inset 0 1px 0 #ffffffb3;--color-neutral-50:oklch(98% .004 260);--color-neutral-100:oklch(96% .006 260);--color-neutral-200:oklch(91% .009 260);--color-neutral-300:oklch(83% .012 260);--color-neutral-400:oklch(55% .018 260);--color-neutral-500:oklch(49% .02 260);--color-neutral-600:oklch(43% .022 260);--color-neutral-700:oklch(36% .024 260);--color-neutral-800:oklch(29% .026 260);--color-neutral-900:oklch(23% .028 260);--color-indigo-50:#eef5ff;--color-indigo-100:#deebff;--color-indigo-200:#bfd8ff;--color-indigo-300:#94beff;--color-indigo-400:#5799f5;--color-indigo-500:#1677ed;--color-indigo-600:#0066df;--color-indigo-700:#0054b6;--color-indigo-800:#03448f}html[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--workbench-canvas:#14171a;--workbench-mist:#1d282d;--workbench-mint:#1d2925;--glass-edge:#ffffff17;--glass-shadow:0 1px 2px #0006, 0 14px 36px -8px #0000008c, inset 0 1px 0 #ffffff12;--glass-shadow-raised:0 1px 2px #00000080, 0 6px 18px -2px #00000073, 0 18px 44px -8px #000000a6, inset 0 1px 0 #ffffff12;background-color:var(--workbench-canvas);--color-white:oklch(22.5% 0 none);--color-neutral-50:oklch(19% 0 none);--color-neutral-100:oklch(27.5% 0 none);--color-neutral-200:oklch(32.5% 0 none);--color-neutral-300:oklch(39% 0 none);--color-neutral-400:oklch(62% 0 none);--color-neutral-500:oklch(70% 0 none);--color-neutral-600:oklch(78% 0 none);--color-neutral-700:oklch(85% 0 none);--color-neutral-800:oklch(90% 0 none);--color-neutral-900:oklch(94% 0 none);--color-neutral-950:oklch(97% 0 none);--color-indigo-50:oklch(24.5% .028 255);--color-indigo-100:oklch(32% .065 255);--color-indigo-200:oklch(40% .09 255);--color-indigo-300:oklch(50% .125 255);--color-indigo-400:oklch(62% .155 255);--color-indigo-500:oklch(68% .165 255);--color-indigo-600:oklch(70% .175 255);--color-indigo-700:oklch(80% .115 255);--color-indigo-800:oklch(86% .08 255);--color-red-50:oklch(24.5% .028 17.38);--color-red-100:oklch(32% .065 17.717);--color-red-200:oklch(40% .09 18.334);--color-red-400:oklch(62% .155 22.216);--color-red-600:oklch(73% .145 27.325);--color-red-700:oklch(80% .115 27.518);--color-amber-50:oklch(24.5% .028 95.277);--color-amber-100:oklch(32% .065 95.617);--color-amber-200:oklch(40% .09 95.746);--color-amber-300:oklch(50% .125 91.605);--color-amber-400:oklch(62% .155 84.429);--color-amber-500:oklch(68% .165 70.08);--color-amber-600:oklch(73% .145 58.318);--color-amber-700:oklch(80% .115 48.998);--color-amber-800:oklch(86% .08 46.201);--color-emerald-50:oklch(24.5% .028 166.113);--color-emerald-100:oklch(32% .065 163.051);--color-emerald-200:oklch(40% .09 164.15);--color-emerald-400:oklch(62% .155 163.223);--color-emerald-500:oklch(68% .165 162.48);--color-emerald-600:oklch(73% .145 163.225);--color-emerald-700:oklch(80% .115 165.612);--color-green-50:oklch(24.5% .028 155.826);--color-green-200:oklch(40% .09 155.995);--color-green-500:oklch(68% .165 149.579);--color-green-700:oklch(80% .115 150.069);--color-green-800:oklch(86% .08 151.328);--color-cyan-50:oklch(24.5% .028 200.873);--color-cyan-100:oklch(32% .065 203.388);--color-cyan-200:oklch(40% .09 205.041);--color-cyan-400:oklch(62% .155 211.53);--color-cyan-500:oklch(68% .165 215.221);--color-cyan-700:oklch(80% .115 223.128);--color-cyan-800:oklch(86% .08 224.283);--color-sky-50:oklch(24.5% .028 236.62);--color-sky-200:oklch(40% .09 230.902);--color-sky-500:oklch(68% .165 237.323);--color-sky-700:oklch(80% .115 242.749);--color-fuchsia-50:oklch(24.5% .028 320.058);--color-fuchsia-500:oklch(68% .165 322.15);--color-fuchsia-700:oklch(80% .115 323.949);--color-violet-50:oklch(24.5% .028 293.756);--color-violet-200:oklch(40% .09 293.283);--color-violet-700:oklch(80% .115 292.581);--color-blue-700:oklch(80% .115 264.376)}html{--glass-surface:#fffc;font-size:112.5%}@supports (color:color-mix(in lab, red, red)){html{--glass-surface:color-mix(in oklab, var(--color-white) 80%, transparent)}}html{--ease-surface:cubic-bezier(.2, .8, .2, 1);touch-action:pan-x pan-y}.text-\[9px\]{font-size:.5625rem}.text-\[10px\]{font-size:.625rem}.text-\[10\.5px\]{font-size:.65625rem}.text-\[11px\]{font-size:.6875rem}.text-\[11\.5px\]{font-size:.71875rem}.text-\[12px\]{font-size:.75rem}.text-\[12\.5px\]{font-size:.78125rem}.text-\[13px\]{font-size:.8125rem}.text-\[13\.5px\]{font-size:.84375rem}.text-\[14px\]{font-size:.875rem}.text-\[15px\]{font-size:.9375rem}.text-\[16px\]{font-size:1rem}.text-\[17px\]{font-size:1.0625rem}.text-\[20px\]{font-size:1.25rem}.thumbs>*{margin:0}main{--head-h:calc(3rem + 8px);grid-template-rows:minmax(0,1fr) auto auto auto;grid-template-columns:minmax(0,1fr);display:grid}main>*{grid-column:1}main>section,#turns{grid-row:1/-1}:is(#mobile-bar,#chat-header){grid-row:1;align-self:start}#queue-panel{grid-row:2}#recovery-panel{grid-row:3}#composer{grid-row:4}:is(#mobile-bar,#chat-header,#queue-panel,#recovery-panel,#composer){z-index:1;position:relative}#queue-panel,#recovery-panel{border:1px solid var(--glass-edge);width:calc(100% - 2rem);max-width:58rem;box-shadow:var(--glass-shadow);border-radius:1.25rem;margin-inline:auto}#queue-panel:not(.hidden)+#recovery-panel{margin-top:.5rem}@media (width>=48rem){body[data-rail=closed]{grid-template-columns:minmax(0,1fr)}body[data-rail=closed] #sidebar{display:none}#sidebar{border:1px solid var(--glass-edge);min-height:0;box-shadow:var(--glass-shadow);border-radius:20px;margin:8px}#rail-toggle{left:calc(12.375rem - 8px)}body:not([data-rail=closed]) #rail-toggle{top:calc(.625rem + 8px)}body[data-rail=closed] #rail-toggle{top:calc(.625rem + 8px);left:calc(.375rem + 8px)}body[data-rail=closed] #rail-toggle svg{transform:rotate(180deg)}body:not([data-rail=closed]) #rail-toggle .attention{display:none}body[data-rail=closed] :is(#chat-header,.pagehead){padding-left:2.75rem}.pagehead{flex-wrap:nowrap;padding-block:0}}@media not all and (width>=48rem){#sidebar{z-index:40;width:19rem;transition:transform .22s var(--ease-surface);inset-block:0;border-radius:0 20px 20px 0;position:fixed;left:0;transform:translate(-100%)}#drawer-scrim{opacity:1;visibility:visible;transition:opacity .22s var(--ease-surface), visibility .22s}#drawer-scrim.hidden{opacity:0;visibility:hidden;pointer-events:none;display:block}#sidebar[data-open]{box-shadow:var(--glass-shadow-raised);transform:translate(0)}body{overscroll-behavior:none}#composer,#session-list{padding-bottom:calc(.5rem + env(safe-area-inset-bottom))}body[data-kb] #composer{padding-bottom:.5rem}main,#sidebar{padding-top:env(safe-area-inset-top)}main>section{padding-top:var(--head-h)}}main{background:radial-gradient(ellipse 80% 65% at 100% 100%, var(--workbench-mist), transparent 75%), radial-gradient(ellipse 70% 65% at 0% 100%, var(--workbench-mint), transparent 75%)}#sidebar{font-size:.875rem;line-height:1.4}#sidebar :is(.session-open,#new-session,#open-palette),#console-section li button{min-height:2rem;padding-block:.25rem}@media not all and (width>=48rem){#sidebar{font-size:.9375rem;line-height:1.5}}#console-section ul,#session-list{padding-inline:.5rem}#console-section li button,#session-list li{border-radius:.625rem;margin-block:.125rem;transition:background-color .18s,color .18s}#console-section li button{padding-left:.75rem}#session-list li{padding-inline:.375rem}#session-list .session-open{padding-left:.25rem}#session-list :focus-visible{outline-offset:-2px}#session-list li:focus-within .session-more,#session-list .session-more[aria-expanded=true]{display:flex}@media (hover:hover) and (pointer:fine){#session-list li:hover .session-more{display:flex}}@media (hover:none),(pointer:coarse){#session-list li:has([aria-current=page]) .session-more{display:flex}}@media (pointer:coarse),(width<48rem){#sidebar :is(.session-open,.session-more,.icon-btn,#new-session,#open-palette),#console-section :is(summary,li button),.config-row{min-height:44px}#sidebar :is(.session-more,.icon-btn,#open-palette){min-width:44px}:is(#queue-panel,#recovery-panel) button{min-height:44px}#queue-panel button{min-width:44px}#queue-panel>div:first-child{height:auto}}#console-section button.bg-indigo-50,#session-list li.bg-indigo-50,.palette-row.bg-indigo-50{color:var(--color-indigo-700);background-color:var(--color-indigo-100);box-shadow:none;font-weight:500}#console-section button.bg-indigo-50 [data-icon]{color:inherit}:is(.glass,#sidebar,#mobile-bar,#chat-header,.pagehead){background:var(--glass-surface);border-color:var(--glass-edge);-webkit-backdrop-filter:blur(28px)saturate(1.4)}#queue-panel,#recovery-panel{background:#fffdf4}@supports (color:color-mix(in lab, red, red)){#queue-panel,#recovery-panel{background:color-mix(in oklab, var(--color-amber-50) 55%, var(--color-white))}}#queue-panel,#recovery-panel{border-color:var(--glass-edge)}.glass-menu{background:var(--color-white);box-shadow:var(--glass-shadow)}#rail-toggle{border-radius:50%;top:.625rem}#mobile-bar,#chat-header,.pagehead{border:1px solid var(--glass-edge);box-shadow:var(--glass-shadow);border-radius:18px;margin:8px 8px 0;font-size:.9375rem}#mobile-bar,#chat-header{height:3rem}.pagehead-hug{width:fit-content;max-width:calc(100% - 16px);margin-inline:auto}#turns{padding:calc(var(--head-h) + .75rem) max(1rem, calc((100% - 58rem) / 2)) calc(var(--dock-h,4rem) + .5rem);scroll-padding-block:calc(var(--head-h) + .75rem) calc(var(--dock-h,4rem) + .5rem);-webkit-mask-image:linear-gradient(#0000,#000 2.5rem calc(100% - 2rem),#0000);mask-image:linear-gradient(#0000,#000 2.5rem calc(100% - 2rem),#0000)}#turns>:is([data-kind=user],[data-kind=assistant],[data-kind=system],[data-kind=error]){overflow-wrap:anywhere;border-radius:1.375rem;width:fit-content;max-width:88%;margin-block:.875rem;padding:.75rem 1rem}#turns>[data-grouped]{margin-top:-.5rem}#turns>[data-kind=user]{background:var(--color-indigo-100);color:var(--color-neutral-900);box-shadow:inset 0 0 0 1px var(--color-indigo-300);border-bottom-right-radius:.375rem;margin-left:auto}#turns>[data-kind=assistant]{background:var(--color-white);box-shadow:0 2px 8px #00000009, inset 0 0 0 1px var(--color-neutral-200);border-bottom-left-radius:.375rem;margin-right:auto}#turns>:is([data-kind=system],[data-kind=error]){border-left-width:2px;max-width:100%}#turns>:is([data-kind=activity],[data-kind=background-run]){border-radius:1rem;margin-block:.75rem}#turns>.system-card{border-left-width:0}.system-card:before{content:"";border-left:3px solid;border-left-color:inherit;border-radius:99px;height:1.25rem;position:absolute;top:.75rem;left:0}.system-card{background:var(--color-neutral-100);box-shadow:inset 0 0 0 1px var(--color-neutral-300)}.run-label{background:currentColor;border-radius:.375rem;padding:.125rem .375rem}@supports (color:color-mix(in lab, red, red)){.run-label{background:color-mix(in oklab, currentColor 8%, transparent)}}#turns>[data-kind=system].system-card{border-radius:.75rem;width:auto;padding:.625rem .875rem}#turns>[data-kind=activity]{max-width:88%;margin-bottom:0}#turns>[data-kind=activity][data-adopted]+[data-kind=assistant]{margin-top:.375rem}#turns>[data-kind=user]:has(textarea){width:88%}.message-edit{color:var(--color-neutral-500);opacity:0;transition:opacity .16s}[data-editing]>.message-edit{visibility:hidden}[data-kind=user]:hover .message-edit,.message-edit:focus-visible{opacity:.85}.message-edit:hover{background:var(--color-indigo-100);opacity:1}@media (hover:none){.message-edit{opacity:.85}}@media (pointer:coarse){.message-edit{min-width:44px;min-height:44px}}@media (hover:hover){#turns>[data-time]:after{content:attr(data-time);font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--color-neutral-400);opacity:0;pointer-events:none;font-size:10.5px;line-height:1;transition:opacity .16s;position:absolute;bottom:.5rem}#turns>[data-kind=user][data-time]:after{right:calc(100% + .5rem)}#turns>[data-kind=user][data-time]:has(.message-edit):after{right:calc(100% + 2.5rem)}#turns>[data-kind=assistant][data-time]:after{left:calc(100% + .5rem)}#turns>:is([data-kind=system],[data-kind=error])[data-time]:after{bottom:-.6rem;right:.25rem}#turns>[data-time]:hover:after{opacity:1}}#composer{--composer-control-size:2rem;z-index:1;position:relative}#input{padding-block:max(0px, calc((var(--composer-control-size) - 1lh) / 2))}#composer>div{--glass-shadow:var(--glass-shadow-raised);max-width:58rem;margin-inline:auto}#composer>div:focus-within{box-shadow:0 0 0 3px var(--color-indigo-100), var(--glass-shadow)}#composer :is(#attach,#send,#stop){width:var(--composer-control-size);height:var(--composer-control-size);border-radius:50%}.glass{box-shadow:var(--glass-shadow)}@keyframes surface-in{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}#turns>[data-enter]{animation:surface-in .24s var(--ease-surface)}dialog[open]:not(#image-dialog){animation:.16s ease-out surface-fade}#palette{border-color:var(--glass-edge);box-shadow:var(--glass-shadow-raised)}.palette-row{transition:background-color .12s}.palette-row:not(.bg-indigo-50):hover{background-color:var(--color-neutral-100)}.palette-row.bg-indigo-50>span:first-child{background-color:#625fff2e}@supports (color:color-mix(in lab, red, red)){.palette-row.bg-indigo-50>span:first-child{background-color:color-mix(in oklab, var(--color-indigo-500) 18%, transparent)}}.palette-row.bg-indigo-50>span:first-child{color:inherit}@media (pointer:coarse){.palette-row{min-height:44px}#palette kbd,#palette-keys{display:none}}@keyframes turn-reveal{0%{outline:3px solid var(--color-indigo-400);outline-offset:3px}to{outline-offset:3px;outline:3px solid #0000}}#turns>[data-reveal]{animation:1.2s ease-out turn-reveal}.glass-menu{--menu-shift:translateY(-4px) scale(.97);transform-origin:top;opacity:1;transition:opacity .18s var(--ease-surface), transform .22s var(--ease-surface);transform:none}.glass-menu[data-presentation=sheet]{--menu-shift:translateY(1.25rem);transform-origin:bottom}.glass-menu[data-closing]{opacity:0;transform:var(--menu-shift);pointer-events:none;transition-duration:.12s}@starting-style{.glass-menu{opacity:0;transform:var(--menu-shift)}}#turns details::details-content{interpolate-size:allow-keywords;opacity:0;block-size:0;transition:block-size .18s var(--ease-surface), opacity .18s, content-visibility .18s allow-discrete;overflow:clip}#turns details[open]::details-content{opacity:1;block-size:auto}:is(.btn,.icon-btn,#composer button){transition:background-color .18s, box-shadow .18s, transform .18s var(--ease-surface)}:is(.btn,.icon-btn,#composer button):active:not(:disabled){transform:scale(.95)}@media (prefers-reduced-transparency:reduce),(prefers-contrast:more){:is(.glass,.glass-menu,#sidebar,#mobile-bar,#chat-header,#queue-panel,#recovery-panel,.pagehead){background:var(--color-white);-webkit-backdrop-filter:none;border-color:var(--color-neutral-400);box-shadow:none}}@media not all and (width>=48rem){#automation-tabs>button{padding-inline:.625rem;font-size:.75rem}#sidebar{max-width:calc(100vw - 2.5rem)}#composer{--composer-control-size:2.25rem;padding-inline:.75rem}#queue-panel,#recovery-panel{width:calc(100% - 1.5rem)}main{--bar-h:3rem;--head-h:calc(var(--bar-h) + 8px)}main:has(#chat-header:not(.hidden)):has(#session-meta[data-urgent]:not(.hidden)){--bar-h:4.5rem}#mobile-bar{height:var(--bar-h);grid-template-rows:minmax(0,1fr) auto;grid-template-columns:auto minmax(0,1fr) auto;row-gap:0;display:grid}#mobile-bar #session-meta{grid-area:2/2/auto/-1;height:1.5rem}#mobile-bar #session-meta:not([data-urgent]){display:none}main:has(#chat-header.hidden) #session-meta{display:none}#turns{padding-inline:.625rem}#turns>:is([data-kind=user],[data-kind=assistant]){max-width:92%}#turns>[data-kind=user]{max-width:min(92%,100% - 3rem)}#turns>[data-kind=user]:has(textarea){width:92%}#turns>[data-time]:after{content:none}#input{font-size:max(16px,1rem)}}@keyframes surface-fade{0%{opacity:0}to{opacity:1}}@media (prefers-reduced-motion:reduce){#turns>[data-enter],dialog[open]:not(#image-dialog){animation:.12s ease-out surface-fade}#turns>[data-reveal]{outline:3px solid var(--color-indigo-400);outline-offset:3px;animation:none}.glass-menu,.glass-menu[data-presentation=sheet]{--menu-shift:none;transition-duration:.12s}#sidebar{transition:none}#drawer-scrim{transition-duration:.12s}#turns details::details-content{transition:opacity .12s, content-visibility .12s allow-discrete}:is(.btn,.icon-btn,#composer button):active:not(:disabled){transform:none}}.automation-filters,.automation-list{border:1px solid var(--color-neutral-200);background:#ffffffbf;border-radius:1.25rem;margin:.75rem 1rem}@supports (color:color-mix(in lab, red, red)){.automation-filters,.automation-list{background:color-mix(in oklab, var(--color-white) 75%, transparent)}}.automation-filters,.automation-list{box-shadow:0 2px 8px #00000006}.automation-filters+.automation-list{margin-top:0}.automation-list>.toolbar{border-bottom:1px solid var(--color-neutral-200)}.automation-filters{flex:none;grid-template-columns:repeat(2,minmax(0,1fr));align-items:end;gap:.75rem;max-height:50dvh;padding:.875rem;display:grid;overflow-y:auto}.filter-field{flex-direction:column;gap:.375rem;min-width:0;display:flex}.field-label,.filter-field>span{color:var(--color-neutral-600);font-size:.71875rem;font-weight:500}.filter-field>span{padding-inline:.25rem}.filter-field>:is(input,select){background-color:var(--color-white);text-overflow:ellipsis;border-radius:.875rem;width:100%;min-width:0;height:2.5rem}.filter-field>select{padding-right:2.25rem}.filter-field>[data-active=true]{border-color:var(--color-indigo-200);background-color:var(--color-indigo-50);color:var(--color-indigo-700)}.filter-field>:is(input,select):focus{border-color:var(--color-indigo-400)}.filter-footer>.filter-action{white-space:nowrap;min-height:2.5rem;margin-left:auto}.task-filters>.filter-search,.run-filters>:is(.filter-wide,.filter-dates,.filter-footer){grid-column:1/-1}.filter-footer{flex-wrap:wrap;align-items:center;gap:.5rem 1rem;display:flex}.filter-date-fields{gap:.75rem;padding-top:.5rem;display:grid}@media (width>=48rem){.filter-date-fields{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=64rem){.task-filters{grid-template-columns:minmax(8rem,1fr) 8rem 9rem}.task-filters>.filter-search{grid-column:auto}.run-filters{grid-template-columns:repeat(3,minmax(0,1fr))}.run-filters>.filter-wide{grid-column:auto}}#image-stage[data-zoom]{touch-action:none;justify-content:flex-start;align-items:flex-start;overflow:auto}#image-stage[data-zoom] img{cursor:zoom-out;max-width:none;max-height:none}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
@@ -0,0 +1 @@
1
+ import{$ as e,G as t,H as n,R as r,S as i,Y as a,b as o,k as s,m as c,q as l,rt as u}from"./index-DzXDXra_.js";import{c as d,i as f,n as p,o as m,s as h}from"./task-runs-BCakxFk8.js";function g(g,_,v,y){let b=new URLSearchParams,x=[],S=``,C=n(`div`,`automation-list min-h-0 flex-1 overflow-auto`),w,T={selectedId:null,rawOpen:!1,scrollTop:0,drawn:``},E=(e,t)=>v(Object.fromEntries(e),t),D=e=>{g.querySelector(`[role=alert]`)?.remove();let t=n(`p`,`p-4 text-[13px] text-red-600`,e);t.setAttribute(`role`,`alert`),g.append(t)},O={openSession:_,openTask:y,openRun:e=>E(b,e),mutate:async e=>{let t=await a(e,`POST`,`Run update failed`);t?D(t):await k()}},k=t(async()=>{let e=T.selectedId;if(e)return f(C,e,()=>E(b),O,T);let t=b.toString(),n=await l(`/api/task-runs?${t}`,`Could not load runs`);if(t!==b.toString()||T.selectedId)return;if(!n.ok)return D(n.error);g.querySelector(`[role=alert]`)?.remove();let r=JSON.stringify(n.value);S!==t+r&&(S=t+r,P(n.value))});function A(e,t){let n=new URLSearchParams(b);t?n.set(e,t):n.delete(e),n.delete(`cursor`),E(n)}function j(){if(S=``,C=n(`div`,`automation-list min-h-0 flex-1 overflow-auto`),w=void 0,T.selectedId){g.replaceChildren(C);return}g.replaceChildren(N(),C)}function M(){let e=x.map(e=>[e.name+(e.archived?` (archived)`:``),e.id]),t=b.get(`taskId`);return t&&!x.some(e=>e.id===t)&&e.push([t,t]),[[`All tasks`,``],...e]}function N(){let t=n(`div`,`automation-filters run-filters`),r=(e,r,i)=>{let a=s(i,b.get(r)??``);return a.dataset.active=String(!!b.get(r)),a.setAttribute(`aria-label`,e),a.onchange=()=>A(r,a.value),t.append(n(`label`,`filter-field ${r===`taskId`?`filter-wide`:``}`,n(`span`,``,e),a)),a};r(`State`,`state`,[[`All states`,``],...[`queued`,`running`,`succeeded`,`failed`,`cancelled`,`interrupted`,`skipped`].map(e=>[e,e])]),r(`Source`,`source`,[[`All sources`,``],...[`manual`,`agent`,`cron`,`watch`,`task`].map(e=>[e,e])]),w=r(`Task`,`taskId`,M());let i=n(`details`,`filter-dates`),a=Number(b.has(`since`))+Number(b.has(`until`));i.open=a>0,i.append(n(`summary`,`flex cursor-pointer items-center gap-1.5 py-1 text-[12px] text-neutral-600`,e(u,`chev h-3 w-3`),a?`Date range (${a})`:`Date range`));let l=n(`div`,`filter-date-fields`);for(let[e,t]of[[`From`,`since`],[`Through`,`until`]]){let r=n(`input`,c);r.type=`datetime-local`,r.setAttribute(`aria-label`,e);let i=b.get(t);if(i){let e=new Date(Number(i));Number.isFinite(e.getTime())&&(r.value=new Date(e.getTime()-e.getTimezoneOffset()*6e4).toISOString().slice(0,16))}r.dataset.active=String(!!r.value),r.onchange=()=>A(t,r.value?String(new Date(r.value).getTime()):``),l.append(n(`label`,`filter-field`,n(`span`,``,e),r))}i.append(l);let d=n(`input`,`h-4 w-4 flex-none`);d.type=`checkbox`,d.checked=b.get(`showUnmatched`)===`true`,d.onchange=()=>A(`showUnmatched`,d.checked?`true`:``);let f=n(`label`,`flex min-h-10 cursor-pointer items-center gap-2 text-[11.5px] text-neutral-500`,d,`Show unmatched probes`),p=[...b.keys()].filter(e=>e!==`cursor`).length,m=o(p?`Reset filters (${p})`:`Reset filters`);return m.classList.add(`filter-action`),m.disabled=!p,m.onclick=()=>v({}),t.append(i,n(`div`,`filter-footer`,f,m)),t}function P(e){let t=n(`div`,`divide-y divide-neutral-100`);for(let r of e.runs){let e=n(`div`,`px-4 py-3 text-[12px] transition-colors hover:bg-neutral-50`),i=n(`button`,`grid w-full cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-x-4 gap-y-1 text-left md:grid-cols-[minmax(0,1fr)_12rem_5rem]`);i.setAttribute(`type`,`button`),i.onclick=()=>E(b,r.id),i.append(n(`span`,`flex min-w-0 items-center gap-2`,h(r),n(`span`,`min-w-0 truncate font-medium text-neutral-800`,r.context.definition.name)),n(`span`,`text-right font-mono text-[11.5px] text-neutral-400 md:order-2`,d(r)),n(`span`,`col-span-2 text-neutral-500 md:order-1 md:col-span-1`,p(r.queuedAt)),n(`span`,`col-span-2 break-all font-mono text-[11px] text-neutral-400 md:order-3 md:col-span-3`,`${r.id} · ${r.triggerSource}`)),e.append(i);let a=m(r);a&&e.append(n(`p`,`mt-1.5 inline-block break-words rounded-md bg-amber-50 px-2 py-0.5 text-[11.5px] text-amber-700 ring-1 ring-amber-200`,a));let o=n(`div`,`mt-1.5 flex flex-wrap gap-1.5 text-[11px] text-neutral-500`),s=`max-w-full break-all rounded-md bg-neutral-100 px-1.5 py-0.5 text-left`,c=(e,t)=>{let r=n(`button`,`${s} cursor-pointer transition-colors hover:bg-neutral-200 hover:text-neutral-800`,e);r.setAttribute(`type`,`button`),r.onclick=t,o.append(r)};if(r.parentRunId&&c(`Parent ${r.parentRunId}`,()=>E(b,r.parentRunId)),r.resumedFromRunId&&c(`Resumed from ${r.resumedFromRunId}`,()=>E(b,r.resumedFromRunId)),r.result?.type===`task`){let e=r.result.runId;c(`Child result ${e}`,()=>E(b,e))}r.groupId&&o.append(n(`span`,s,`Group ${r.groupId}`)),o.childElementCount&&e.append(o),t.append(e)}e.runs.length||t.append(n(`div`,`p-4`,i(`No matching runs.`)));let r=n(`div`,`flex items-center gap-3 border-t border-neutral-200 p-4`);if(b.has(`cursor`)){let e=o(`Newest`);e.onclick=()=>A(`cursor`,``),r.append(e)}if(e.nextCursor){let t=o(`Older runs`);t.onclick=()=>{let t=new URLSearchParams(b);t.set(`cursor`,JSON.stringify(e.nextCursor)),E(t)},r.append(t)}let a=C.scrollTop;C.replaceChildren(t,r),C.scrollTop=a}async function F(){let e=await l(`/api/tasks?kind=task`,`Could not load task filters`);if(!e.ok)return D(e.error);JSON.stringify(x)!==JSON.stringify(e.value)&&(x=e.value,!T.selectedId&&w?.isConnected&&(w.replaceChildren(...M().map(([e,t])=>new Option(e,t))),w.value=b.get(`taskId`)??``))}let I=r(g,(e,t)=>{b=new URLSearchParams(t),T.selectedId!==(e||null)&&(T.rawOpen=!1,T.scrollTop=0),T.selectedId=e||null,j(),k(),e||F()});return Object.assign(I,{refresh(){I.visible&&k()}})}export{g as createRunsView};
@@ -0,0 +1,5 @@
1
+ import{$ as e,A as t,C as n,D as r,E as i,F as a,H as o,I as s,K as c,L as l,M as u,N as d,O as f,Q as p,R as m,S as h,T as g,X as _,_ as v,a as y,b,d as x,f as S,g as C,h as w,it as T,j as E,k as D,l as O,m as k,n as A,nt as j,o as M,p as N,q as P,r as F,rt as I,s as ee,t as L,tt as R,v as te,w as z,x as B,y as V,z as H}from"./index-DzXDXra_.js";var ne=[[`path`,{d:`M15 3h6v6`}],[`path`,{d:`M10 14 21 3`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}]],re=[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`}],[`path`,{d:`M12 9v4`}],[`path`,{d:`M12 17h.01`}]],U={display_information:{name:`Pier`,description:`Coding agent sessions in Slack threads`,background_color:`#262626`},features:{bot_user:{display_name:`Pier`,always_online:!1},app_home:{messages_tab_enabled:!0,messages_tab_read_only_enabled:!1}},oauth_config:{scopes:{bot:[`chat:write`,`reactions:write`,`channels:history`,`channels:read`,`groups:history`,`groups:read`,`im:history`,`im:write`,`mpim:history`,`mpim:read`,`mpim:write`,`users:read`,`files:read`,`files:write`]}},settings:{event_subscriptions:{bot_events:[`message.channels`,`message.groups`,`message.im`,`message.mpim`]},interactivity:{is_enabled:!0},socket_mode_enabled:!0,token_rotation_enabled:!1}},W=()=>`https://api.slack.com/apps?new_app=1&manifest_json=${encodeURIComponent(JSON.stringify(U))}`,G=()=>z(`Getting a bot token`,[`Open [@BotFather](https://t.me/BotFather) in Telegram.`,"Send `/newbot`, pick a display name, then a username ending in `bot`.","Copy the token it prints (`123456789:AA…`) and paste it here.","Send `/setprivacy` → `Disable` if the bot should see plain group messages. Left enabled it only ever receives mentions, replies and commands — the usual reason a bot looks dead in a group.","Send `/setjoingroups` → `Enable`, then add the bot to your group or forum."]),K=(e=`left`)=>z(`Enabling topics on a group`,["In Telegram open the group → `Edit` → turn on `Topics`. Owner only; group size no longer matters.","The group becomes a forum supergroup and the existing chat becomes its `General` topic.","Make the bot an admin with `Manage Topics`. That is the one right topic creation needs — without it Pier logs the failure and answers in General instead.","Send one message in the group so Pier discovers it, then enable it under `Chats` below.","After that, a message in General opens its own topic with its own session. A reply, or anything starting with `/`, stays where it was sent."],e);function q(){let t=b(`Create Slack app`,!0);t.append(e(ne)),t.classList.add(`inline-flex`,`items-center`,`gap-1.5`),t.classList.add(`mt-1`,`w-fit`),t.onclick=()=>window.open(W(),`_blank`,`noreferrer`);let n=H(`btn w-fit text-[12.5px]`,()=>JSON.stringify(U,null,2));return z(`Creating a Slack app`,[a(`Opens Slack with every scope, event and Socket Mode already filled in. Pick your workspace → Create.`,t),"`Install to Workspace` → allow. Then `OAuth & Permissions` → copy the bot token (`xoxb-…`) into the field above.","`Basic Information` → `App-Level Tokens` → `Generate` with scope `connections:write`. Paste that `xapp-…` token below. The manifest cannot mint this one for you.","In Slack, invite the bot where you want it: `/invite @Pier`. It answers in threads only, so it never adds noise to the channel.",a(`Prefer to paste it yourself? Create the app from a manifest and use this:`,n)])}var ie=()=>z(`What agent access allows`,["Gives agent sessions a `slack` tool: read a channel's history for a time range, read one thread, and post, edit or delete a message.",`Editing and deleting reach only what Pier's own bot posted — Slack refuses either on anyone else's message.`,`Pier performs every call itself — the bot token is never given to the agent, and Slack's own membership rules still apply, so the bot reaches only channels it was invited to.`,`Every read fetches live from Slack — Pier keeps no message archive.`,`This includes sessions started by tasks and subagents. Switch it off if an agent should never post to your workspace on its own.`,`The tool is only given to sessions opened while Slack is connected and this is on, so an unused tool costs no context. A session opened earlier keeps it, and a call made after you switch it off is refused with the reason.`]),J=(e=`left`)=>z(`How Slack threads work here`,[`Pier never posts in a channel's main flow. A message in the channel is answered in *its own thread*; a message in a thread is answered in that thread.`,`Each thread is its own Pi session, so one channel hosts many parallel sessions.`,`The same applies in a DM: every new message you send there starts its own thread and its own session. Reply *inside* a thread to continue that conversation.`,"Inside a thread Pier already owns, no `@mention` is needed — continuing that thread is addressing it.","Commands are bare words after a mention: `@bot settings`, `@bot stop`, `@bot bind <code>`. Slack's client swallows an unregistered `/command` before it ever reaches an app."],e),ae=()=>z(`Creating a Feishu app`,["On [open.feishu.cn](https://open.feishu.cn/app) create a 企业自建应用 (custom app). `Credentials & Basic Info` shows the App ID (`cli_…`) and App Secret — paste both here.","`Add Features` → enable **Bot** (机器人).","`Permissions` (权限管理), add: `im:message` (read messages), `im:message:send_as_bot` (send), `im:resource` (attachments, both directions), `im:message.reactions:create` + `:read` + `:delete` (the 👀 receipt), `im:chat:readonly` (chat names for this page), `contact:user.base:readonly` (speaker names).","`Events & Callbacks` → set the mode to **长连接 (long connection)** — no public URL needed. Under Events subscribe `im.message.receive_v1` (接收消息); Callbacks gain `card.action.trigger` automatically once cards are sent, add it if listed.",`**Publish a version** (版本管理与发布 → 创建版本 → 申请发布). Nothing above takes effect until this is approved — the usual reason a configured bot stays silent.`,`Add the bot to a group (群设置 → 群机器人), or DM it directly.`]),Y=(e=`left`)=>z(`How Lark topics work here`,[`Pier never posts in a chat's main flow. A message in the chat is answered in *its own topic* (话题); a message inside a topic is answered there.`,`Each topic is its own Pi session, so one group hosts many parallel sessions.`,`The same applies in a DM: every new message starts its own topic and its own session. Reply *inside* a topic to continue that conversation.`,`Inside a topic Pier already owns, no @mention is needed — continuing that topic is addressing it.`,"Commands are slash words: `/stop`, `/settings`, `/bind <code>`. A bare @mention with nothing else also opens the settings panel."],e),oe=[[`telegram`,`Telegram`],[`slack`,`Slack`],[`lark`,`Lark`]],X=(e,t)=>o(`span`,`flex items-center gap-1.5 text-[13px] text-neutral-400`,o(`span`,``,e),t),Z={dm:`bg-sky-50 text-sky-700 ring-sky-200`,group:`bg-neutral-100 text-neutral-600 ring-neutral-200`,forum:`bg-violet-50 text-violet-700 ring-violet-200`},se=`pier.channelsPlatform`;function ce(t){let r=localStorage.getItem(se),i=oe.some(([e])=>e===r)?r:`telegram`,a=null,s=[],c=o(`div`,`ml-auto flex items-center gap-1.5 text-[11.5px]`),l=o(`div`,`pagehead pagehead-hug sticky top-[-8px] z-30`,c),u=o(`div`,`px-4 pb-5 pt-4`);t.append(o(`div`,`min-h-0 flex-1 overflow-y-auto`,l,u));function p(){l.replaceChildren(f(oe.map(([e,t])=>[t,e]),i,e=>{g&&O(),i=e,localStorage.setItem(se,e),k()}),c)}let g,y=!1,x=null;function S(t){if(c.replaceChildren(),t!==`clean`){if(c.className=`ml-auto flex items-center gap-1.5 text-[11.5px] ${v[t]}`,t===`saving`)c.append(e(j,`spinner`),o(`span`,``,`Saving…`));else if(t===`saved`)c.append(e(T),o(`span`,``,`Saved`)),setTimeout(()=>{c.textContent?.includes(`Saved`)&&S(`clean`)},2e3);else{let t=V(`Retry`,`cursor-pointer underline`);t.onclick=O,c.append(e(re),o(`span`,``,`Save failed`),t)}}}function C(){S(`saving`),clearTimeout(g),g=setTimeout(O,500)}let w=e=>t=>{e(t),C()};async function D(e){y=!0,S(`saving`);try{S((await _(`/api/channels/${e.platform}`,e.config,`PUT`)).ok?`saved`:`failed`)}catch{S(`failed`)}finally{y=!1;let e=x;x=null,e&&D(e)}}function O(){if(clearTimeout(g),g=void 0,!a)return;let e={platform:i,config:a};y?x=e:D(e)}async function k(){if(!s.length){let e=await P(`/api/models`,`Could not load the model catalog`);e.ok&&(s=e.value)}let e=await P(`/api/channels/${i}`,`Failed to load`);if(!e.ok){a=null,p(),u.replaceChildren(h(e.error));return}a=e.value,S(`clean`),R()}function A(e){let t=i===`slack`,r=i===`lark`,a=E(e.token,t?`xoxb-…`:r?`cli_…`:`123456789:AA…`,w(t=>e.token=t),!0),o=E(e.appToken,r?``:`xapp-…`,w(t=>e.appToken=t),!0),s=F(e.cwd,`(pier process cwd)`,w(t=>e.cwd=t));return B(`Connection`,t?`Pier connects over Socket Mode; no public URL or webhook needed.`:r?`Pier connects over Feishu's WebSocket long connection; no public URL or webhook needed.`:`Pier polls Telegram for updates; no public URL or webhook needed.`,d(`Enabled`,`Start the adapter when Pier boots.`,e.enabled,w(t=>{e.enabled=t,p()})),n(r?`App ID`:`Bot token`,a,{hint:`Stored locally, shown masked once saved.`,help:i===`telegram`?G():t?q():ae()}),...t?[n(`App-level token`,o,{hint:`Opens the Socket Mode connection. Needs connections:write.`}),d(`Agent access`,`Let agent sessions read channel history and post through the slack tool. Off makes the tool refuse; inbound messages are unaffected.`,e.agentTool,w(t=>e.agentTool=t),ie())]:[],...r?[n(`App Secret`,o,{hint:`From Credentials & Basic Info, beside the App ID.`})]:[],n(`Default working directory`,s.el,{hint:`Where sessions this channel opens start.`}))}function M(e){return B(`Defaults for new chats`,`Copied into a group the first time the bot sees it; changing them here never touches a group that already exists. DMs are always bound-users-only.`,d(`Require mention in groups`,`Ignore group messages that do not @mention or reply to the bot.`,e.requireMention,w(t=>e.requireMention=t)),d(`Require bound user`,`Only users bound with a code below can drive the agent.`,e.requireBind,w(t=>e.requireBind=t)),...i===`slack`?[X(`Thread mode: always on`,J())]:i===`lark`?[X(`Thread mode: always on`,Y())]:[d(`Topic mode`,`In a forum group, each new request opens its own topic and its own session.`,e.topicMode,w(t=>e.topicMode=t),K())],L(`Model & reasoning`,e,s,w(t=>{e.model=t.model,e.thinking=t.thinking,R()})))}function N(e){let t=o(`span`,`font-mono text-[15px] font-semibold tracking-widest`),n=o(`div`,`hidden items-center gap-2 rounded-lg bg-indigo-50 px-3 py-2 text-[12.5px] text-indigo-800`,t,o(`span`,`text-[11.5px] text-indigo-500`,`DM the bot /bind <code> · expires in 10 min`)),r=b(`Generate bind code`);r.onclick=async()=>{let e=await fetch(`/api/channels/${i}/bind-code`,{method:`POST`});if(!e.ok)return;let{code:r}=await e.json();t.textContent=r,n.classList.replace(`hidden`,`flex`)};let a=o(`div`,`flex flex-col`);e.users.length||a.append(h(`No bound users yet.`));for(let t of e.users){let e=V(`Remove`,`cursor-pointer text-[11.5px] text-neutral-400 opacity-0 transition-opacity hover:text-red-600 group-hover:opacity-100 pointer-coarse:opacity-100`);e.onclick=async()=>{await fetch(`/api/channels/${i}/users/${encodeURIComponent(t.id)}`,{method:`DELETE`}),await k()},a.append(o(`div`,`group flex items-center gap-2.5 border-b border-neutral-100 py-2 last:border-0`,o(`span`,`flex h-6 w-6 flex-none items-center justify-center rounded-full bg-neutral-100 text-[11px] font-semibold text-neutral-500`,(t.name[0]??`?`).toUpperCase()),o(`span`,`min-w-0 flex-1 truncate text-[13px] text-neutral-700`,t.name),o(`span`,`flex-none font-mono text-[11.5px] text-neutral-400`,t.id),e))}return B(`Bound users`,`A code is single-use and expires; redeeming it in a DM binds that account.`,a,o(`div`,`flex flex-col gap-2`,r,n))}function I(e,t){let r=o(`div`,`rounded-xl border px-3.5 py-3 transition-colors ${t.enabled?`border-neutral-200 bg-white`:`border-neutral-200 bg-neutral-50/60`}`),a=o(`div`,`flex items-center gap-2`,o(`span`,`min-w-0 flex-1 truncate text-[13px] font-medium ${t.enabled?`text-neutral-800`:`text-neutral-400`}`,t.name||t.id),te(t.kind,Z[t.kind]),o(`span`,`flex-none font-mono text-[11px] text-neutral-400`,t.id)),c=d(``,``,t.enabled,w(e=>{t.enabled=e,R()}));c.classList.add(`flex-none`,`items-center`),a.append(c);let l=o(`div`,`mt-3 flex flex-wrap items-center gap-x-6 gap-y-2`);t.kind===`dm`?l.append(o(`span`,`text-[13px] text-neutral-400`,i===`telegram`?`Direct message · bound users only, mention and topics not applicable`:`Direct message · bound users only, mention not applicable`)):l.append(d(`Require mention`,``,t.requireMention,w(e=>t.requireMention=e)),d(`Require bind`,``,t.requireBind,w(e=>t.requireBind=e)),i===`slack`?X(`Thread mode: always on`,J(`right`)):i===`lark`?X(`Thread mode: always on`,Y(`right`)):t.kind===`forum`?d(`Topic mode`,``,t.topicMode,w(e=>t.topicMode=e),K(`right`)):X(`Topic mode: forum groups only`,K(`right`)));let u=F(t.cwd,``,w(e=>t.cwd=e)),f=o(`div`,`mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2`,n(`Working directory`,u.el),L(`Model & reasoning`,t,s,w(e=>{t.model=e.model,t.thinking=e.thinking,R()})));return r.append(a,l,f),r}function ee(e){let t=o(`div`,`flex flex-col gap-2.5`);return e.chats.length?t.append(...e.chats.map(t=>I(e,t))):t.append(h(`None yet. Chats appear here after the bot sees a message in them.`)),B(i===`slack`?`Channels`:`Chats`,`Discovered from inbound traffic — no platform reliably lists every chat a bot is in.`,t)}function R(){if(!a)return;p();let e=o(`div`,`mx-auto flex max-w-3xl flex-col gap-4`);e.append(A(a),M(a),N(a),ee(a)),u.replaceChildren(e)}return m(t,()=>void k(),()=>{g&&O()})}function le(){let e=o(`div`,`min-h-0 min-w-0 flex-1 overflow-y-auto p-4`),r=o(`div`,`mx-auto flex max-w-3xl min-w-0 flex-col gap-4`),i=o(`p`,`text-[12px] break-words`),a=o(`section`,`flex min-w-0 flex-col gap-3 border-b border-neutral-200 pb-4`),s=o(`section`,`flex min-w-0 flex-col gap-3`);r.append(o(`h2`,`text-[14px] font-semibold text-neutral-700`,`Configuration sync`),i,a,s),e.append(r);let l=null,u=!1,f=!1,p=0,m=``,h=!1,g=e=>e?new Date(e).toLocaleString():`Never`;async function v(){let e=p,n=await P(`/api/config-sync`,`Could not load configuration sync`,{cache:`no-store`});if(!(f||e!==p)){if(!n.ok){t(i,`failed`,n.error);return}l=n.value,h||(m=l.sourceUrl),S()}}async function y(e){if(!u){++p,u=!0,S(),t(i,`saving`,`Working...`);try{let n=await _(`/api/config-sync`,{action:e,...e===`subscribe`?{url:m}:{}});if(!n.ok)throw Error(await c(n,`Configuration sync failed`));let r=await n.json();l=r,h=!1,m=r.sourceUrl,t(i,`saved`,r.result??`Saved`)}catch(e){t(i,`failed`,e instanceof Error?e.message:`Configuration sync failed`),await v()}finally{u=!1,f||S()}}}function x(e,t){let n=b(e);return n.disabled=u,n.onclick=()=>{y(t)},n}function S(){if(!l||f)return;if(a.replaceChildren(o(`h3`,`text-[13px] font-medium text-neutral-700`,`Publish`)),l.publishedPath){let e=`${l.publicUrl||window.location.origin}${l.publishedPath}`,t=E(e,``,()=>{},!0);t.readOnly=!0,t.setAttribute(`aria-label`,`Sharing URL`),a.append(t,o(`div`,`flex flex-wrap items-center gap-2`,H(`btn text-[12px]`,()=>e),x(`Revoke link`,`revoke`)))}else a.append(o(`div`,``,x(`Generate link`,`publish`)));a.append(o(`p`,`text-[12px] text-neutral-500`,`Anyone with the link can read shared prompts, model definitions, the default model and its reasoning effort. API keys, headers and endpoints stay private.`));let e=E(m,`https://example.com/config-sync/...`,e=>{m=e,h=!0},!0);e.type=`url`,e.setAttribute(`aria-label`,`Configuration source URL`),e.disabled=u||l.enabled;let t=d(`Automatic sync`,``,l.enabled,e=>{y(e?`subscribe`:`pause`)});t.querySelector(`input`).disabled=u;let r=o(`div`,`flex flex-wrap items-center gap-3`,t);l.enabled&&r.append(x(`Sync now`,`sync`)),s.replaceChildren(o(`h3`,`text-[13px] font-medium text-neutral-700`,`Source`),n(`Source URL`,e),r);let i=o(`dl`,`grid grid-cols-[auto_minmax(0,1fr)] gap-x-4 gap-y-1 text-[12px]`);for(let[e,t]of[[`Last checked`,g(l.lastChecked)],[`Last applied`,g(l.lastApplied)],[`Next check`,l.enabled?g(l.nextRunAt):`Paused`]])i.append(o(`dt`,`text-neutral-500`,e),o(`dd`,`min-w-0 break-words text-neutral-700`,t));if(s.append(i),l.error&&s.append(o(`p`,`text-[12px] break-words text-red-600`,l.error)),l.needsReload&&s.append(o(`p`,`text-[12px] text-amber-700`,`Reload pending; retry synchronization.`)),l.taskId){let e=o(`a`,`text-[12px] text-indigo-600 hover:underline`,`Sync task history`);e.href=`#/tasks/${encodeURIComponent(l.taskId)}`,s.append(e)}}v();let C=setInterval(()=>{!u&&!h&&v()},15e3);return{el:e,dispose:()=>{f=!0,clearInterval(C)}}}var ue=`${w} flex flex-col overflow-hidden`,de=`${C} flex flex-none items-center`;async function fe(e,t){let n;try{n=await _(`/api/settings`,e,`PUT`)}catch(e){return{outcome:{state:`failed`,text:`Could not save: ${String(e)}`}}}if(!n.ok)return{outcome:{state:`failed`,text:await c(n,`could not save`)}};let r;try{r=await n.json()}catch(e){return{outcome:{state:`failed`,text:`Saved, but the answer could not be read: ${String(e)}`}}}return r.toolsSync?.state===`refused`?{outcome:{state:`failed`,text:`Saved, but nothing will install it: ${r.toolsSync.reason}`},answer:r}:r.toolsSync?.state===`waiting`?{outcome:{state:`saved`,text:`Saved — a sync is already running; this change goes in the run right after it.`},answer:r}:{outcome:{state:`saved`,text:t},answer:r}}function pe(e,t){return e.enabled?{body:{tool:{name:e.name,on:!1}},saved:`Switched ${e.name} off — the next run uninstalls it. Remove it again once its binary is gone.`}:{body:{customTools:t.filter(t=>t.name!==e.name)},saved:`Removed ${e.name}.`}}function me(r,i){let a=`global`,s=null,u=0,f=0,p=``,g=null,v=[],y=``,b=null,C=null,w=()=>{C?.dispose(),C=null},T=()=>{w(),++f,C=le(),R.replaceChildren(C.el)},D=[],O=()=>v.filter(e=>e.kind===`extension`),A=e=>e.source===`binary`&&e.custom===!0,j=()=>v.filter(e=>e.kind===`tool`),M=document.createElement(`select`);M.className=`${k} select`,M.onchange=()=>{w(),a=M.value,s=null,J.clear(),U()};let F=o(`div`,`${de} flex-col items-stretch gap-1.5 px-3 py-2.5`);F.append(o(`span`,`field-label`,`Scope`),M);let ee=o(`div`,`min-h-0 flex-1 overflow-y-auto py-1.5`),L=o(`nav`,`${ue} w-64 flex-none text-[13px] leading-5 max-md:max-h-48 max-md:w-full`);L.append(F,ee);let R=o(`div`,`${ue} min-w-0 flex-1`),z=o(`div`,`flex min-h-0 flex-1 gap-3 px-4 pb-4 pt-1 max-md:flex-col`);z.append(L,R),r.append(z);let B=(e=``)=>`?scope=${encodeURIComponent(a)}${e}`;async function V(){if(a!==`global`){v=[],y=``;return}let e=await P(`/api/settings`,`could not be loaded`,{cache:`no-store`});if(!e.ok){v=[],y=e.error;return}H(e.value),y=``}function H(e){v=e.catalog,D=e.customTools,b=e.toolsTaskId}async function ne(e,t){let{outcome:n,answer:r}=await fe(e,t);return r&&(H(r),Y(g)),n}function re(e,t){let n={name:e,on:t};return v.find(t=>t.name===e)?.source===`binary`?{tool:n}:{extension:n}}async function U(){let e=++u;f++;let[t]=await Promise.all([P(`/api/config${B()}`,`failed to load config`,{cache:`no-store`}),V()]);if(e!==u)return;if(!t.ok){Y(null),X(t.error);return}let n=t.value;a===`global`&&n.dir&&(p=n.dir,ve()),g=n,Y(n),s?s.type===`sync`&&T():oe()}function W(e){return o(`div`,`px-3 pb-1 pt-3 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e)}let G=()=>{let e=o(`span`,`flex-none rounded bg-neutral-100 px-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500`,`link`);return e.title=`Reached through a symlink`,e},K=()=>o(`span`,`flex-none rounded bg-emerald-50 px-1 text-[10px] font-semibold uppercase tracking-wide text-emerald-700`,`on`);function q(e,t,n,r,i=0,a){let s=o(`button`,`config-row flex w-full cursor-pointer items-center gap-1.5 py-1.5 pr-3 text-left transition-colors hover:bg-neutral-100 ${t?`bg-indigo-50 font-medium hover:bg-indigo-50`:``} ${n?`text-neutral-400`:``}`);return s.append(o(`span`,`truncate`,e)),a&&s.append(a),s.style.paddingLeft=`${20+i*14}px`,s.title=e,s.onclick=r,s}function ie(e){let t={files:[],dirs:new Map,link:!0};for(let n of e){let e=n.name.split(`/`),r=t;for(let t of e.slice(0,-1)){let e=r.dirs.get(t);e||r.dirs.set(t,e={files:[],dirs:new Map,link:!0}),e.link&&=n.link,r=e}r.files.push({name:e[e.length-1],link:n.link})}return t}let J=new Set;function ae(t,n,r,i,a,s){let c=[];for(let[l,u]of n.dirs){let n=r?`${r}/${l}`:l,d=`${t}:${n}`,f=document.createElement(`details`);f.open=J.has(d),f.ontoggle=()=>f.open?J.add(d):J.delete(d);let p=o(`summary`,`flex cursor-pointer select-none items-center gap-1 truncate py-1 pr-3 hover:bg-neutral-100`);p.style.paddingLeft=`${20+i*14}px`,p.title=n,p.append(e(I,`chev h-3 w-3`),o(`span`,`truncate text-neutral-600`,l)),u.link&&p.append(G()),f.append(p,...ae(t,u,n,i+1,a,s)),c.push(f)}for(let e of n.files){let n={type:`resource`,kind:t,name:r?`${r}/${e.name}`:e.name};c.push(q(e.name,a(n),!1,()=>s(n),i,e.link?G():void 0))}return c}function Y(e){if(!e){ee.replaceChildren();return}let t=e=>JSON.stringify(e)===JSON.stringify(s),n=t=>{w(),s=t,Y(e),t.type===`file`?se(t.name):t.type===`bundled`?Q(t.name):t.type===`tools`?$():t.type===`sync`?T():_e(t.kind,t.name)},r=[];if(a===`global`){let e={type:`sync`};r.push(W(`Instance`),q(`Configuration sync`,t(e),!1,()=>n(e)))}r.push(W(`Files`));for(let i of e.files){let e={type:`file`,name:i.name};r.push(q(i.name,t(e),!i.exists,()=>n(e)))}if(a===`global`){r.push(W(`bundled with Pier`)),y?r.push(o(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-red-600`,y)):O().length||r.push(o(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-neutral-400`,`none`));for(let e of O()){let i={type:`bundled`,name:e.name};r.push(q(e.name,t(i),!1,()=>n(i),0,e.enabled?K():void 0))}if(!y){let e={type:`tools`},i=j().filter(e=>e.enabled).length;r.push(q(`command-line tools`,t(e),!1,()=>n(e),0,i?K():void 0))}}for(let i of[`extensions`,`skills`]){r.push(W(`${i} (read-only)`));let a=e.resources[i];a.length||r.push(o(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-neutral-400`,`none`)),r.push(...ae(i,ie(a),``,0,t,n))}ee.replaceChildren(...r)}function oe(){R.replaceChildren(o(`div`,`flex min-h-0 flex-1 items-center justify-center p-6`,h(`Select a file to edit, or browse extensions and skills.`)))}function X(e){R.replaceChildren(o(`p`,`px-4 py-3 text-[12.5px] leading-relaxed text-red-600`,e))}let Z=(e,...t)=>o(`div`,`${de} gap-3 px-4 py-2.5`,o(`span`,`font-mono text-[12.5px] text-neutral-500`,e),...t);async function se(e){let n=++f,r=await P(`/api/config/files/${encodeURIComponent(e)}${B()}`,`failed to load ${e}`,{cache:`no-store`});if(!r.ok){n===f&&X(r.error);return}if(n!==f)return;let{content:i}=r.value,a=i,s=o(`span`,`text-[11.5px] text-neutral-400`,``),l=o(`button`,`btn btn-primary text-[12.5px]`,`Save`),u=document.createElement(`textarea`);u.className=`block min-h-0 flex-1 resize-none bg-white p-4 font-mono text-[13px] leading-relaxed focus:outline-none`,u.spellcheck=!1,u.value=i;let d=async()=>{if(l.disabled)return;let n=u.value;l.disabled=!0,t(s,`saving`,`saving…`);try{let r=await _(`/api/config/files/${encodeURIComponent(e)}${B()}`,{content:n,expected:a},`PUT`);if(!r.ok)return t(s,`failed`,await c(r,`save failed`));let i=await r.json();a=i.content,u.value===n?(u.value=i.content,t(s,`saved`,`saved — applies to new sessions`)):t(s,`idle`,`saved; newer changes are unsaved`)}catch(e){t(s,`failed`,`save failed: ${String(e)}`)}finally{l.disabled=!1}},p=o(`button`,`btn text-[12.5px]`,`Edit`),m=o(`button`,`btn text-[12.5px]`,`View`),h=(...e)=>o(`div`,`ml-auto flex flex-none items-center gap-2`,...e),g=()=>{R.replaceChildren(Z(e,s,h(m,l)),u),u.focus()},v=async()=>{let t=await N(e);n===f&&R.replaceChildren(Z(e,s,h(p)),o(`div`,`min-h-0 flex-1 overflow-auto`,x(S(u.value),t)))};p.onclick=g,m.onclick=()=>void v(),l.onclick=()=>void d(),u.onkeydown=e=>{(e.metaKey||e.ctrlKey)&&e.key===`s`&&(e.preventDefault(),d())},u.oninput=()=>{t(s,`idle`,`unsaved changes`)},await v()}function ce(e){if(!b)return null;let t=o(`a`,`text-indigo-600 hover:underline`,e);return t.href=`#/tasks/${encodeURIComponent(b)}`,t}let me=()=>{let e=o(`a`,`text-indigo-600 hover:underline`,`ubix`);return e.href=`https://github.com/timqi/ubix`,e.target=`_blank`,e.rel=`noreferrer`,e};function he(e){if(e.source!==`binary`)return``;let{spec:t,error:n,installed:r,version:i,path:a}=e.binary;return n?`${t} — ${n}`:r?`${t} — ${i??`unknown version`} at ${a??`an unknown path`}`:`${t} — not installed`}function Q(e,n){f++;let r=v.find(t=>t.name===e&&t.kind===`extension`);if(!r)return X(`unknown extension: ${e}`);let i=o(`span`,`text-[11.5px] text-neutral-400`,``);n&&t(i,n.state,n.text);let a=ce(`every run of the update task`);R.replaceChildren(Z(r.name,o(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,r.source===`binary`?`installed by Pier`:`ships with Pier`)),o(`div`,`flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4`,o(`p`,`max-w-2xl text-[13px] leading-relaxed text-neutral-600`,r.summary),o(`dl`,`flex max-w-2xl flex-col gap-1.5`,...(r.source===`bundled`?r.adds:[]).flatMap(e=>[o(`dt`,`font-mono text-[12px] text-neutral-700`,e.name),o(`dd`,`text-[12px] leading-snug text-neutral-500`,`needs ${e.needs}`)]),...r.source===`binary`?[o(`dt`,`font-mono text-[12px] text-neutral-700`,`binary`),o(`dd`,`font-mono text-[12px] leading-snug ${r.binary.error?`text-red-600`:`text-neutral-500`}`,he(r))]:[]),d(`Enabled`,r.source===`binary`?`Installed into Pier's own bin directory, first on the PATH every session and task inherits; it registers its own Pi extension. Switching it off uninstalls both.`:`Loaded from inside Pier — nothing is installed and no update touches your own extensions. A session mid-turn keeps the tools it started with; the next message picks this up.`,r.enabled,t=>void ge(r.name,t,t=>Q(e,t))),o(`p`,`max-w-2xl text-[12px] leading-snug text-neutral-400`,...r.source===`binary`?a?[`A daily task installs and updates it — its history is `,a,`.`]:[`Its installs run as the daily update task.`]:[`An extension of your own that registers the same tool wins: this copy stands down and says so in the log.`]),i))}function $(e,r={name:``,toml:``}){f++;let i=o(`span`,`text-[11.5px] text-neutral-400`,``);e&&t(i,e.state,e.text);let a=j(),s=ce(`the update task`),c=e=>{let t=o(`div`,`flex min-w-0 flex-1 flex-col gap-0.5`,o(`span`,`flex items-center gap-2 text-[13px] text-neutral-700`,o(`span`,`font-mono`,e.name),...A(e)?[te(`yours`,`bg-neutral-50 text-neutral-500 ring-neutral-200`)]:[]),o(`span`,`text-[11.5px] leading-snug text-neutral-400`,e.summary||he(e)),...e.summary?[o(`span`,`font-mono text-[11px] leading-snug ${e.source===`binary`&&e.binary.error?`text-red-600`:`text-neutral-400`}`,he(e))]:[]),n=d(``,``,e.enabled,t=>void ge(e.name,t,e=>$(e))),r=o(`button`,`btn text-[12px] text-neutral-500 hover:text-red-600`,`Remove`);return r.onclick=()=>{r.disabled=!0;let t=pe(e,D);ne(t.body,t.saved).then(e=>$(e))},o(`div`,`flex max-w-2xl items-start gap-3 border-b border-neutral-100 py-2.5 last:border-0`,t,...A(e)?[r]:[],n)},l={...r},u=o(`span`,`font-mono text-[12px] text-neutral-500`,`[tools.<name>]`),p=E(l.name,`claude`,e=>{l.name=e,u.textContent=`[tools.${e.trim()||`<name>`}]`},!0),m=document.createElement(`textarea`);m.className=`${k} h-24 resize-y font-mono leading-snug`,m.spellcheck=!1,m.value=l.toml,m.placeholder=`spec = "github:owner/repo"
2
+ exe = "tool"`,m.oninput=()=>l.toml=m.value;let h=o(`button`,`btn btn-primary text-[12.5px]`,`Add`);h.onclick=()=>{let e={name:l.name.trim(),toml:l.toml.trim()};if(!e.name||!e.toml)return t(i,`failed`,`A custom tool needs a name and a block with a spec line.`);h.disabled=!0,ne({customTools:[...D,e],tool:{name:e.name,on:!0}},`Added ${e.name} — installing now.`).then(e=>$(e,e.state===`failed`?l:void 0))},R.replaceChildren(Z(`command-line tools`,o(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,`installed by Pier`)),o(`div`,`flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4`,o(`p`,`max-w-2xl text-[12.5px] leading-relaxed text-neutral-500`,`Pier writes no downloader: `,me(),` does the work — a declarative installer that resolves a spec like `,o(`span`,`font-mono text-[11.5px]`,`github:owner/repo`),` to the right release asset for this machine, verifies it, and upgrades in place. Pier bootstraps it, generates its config from the switches below, and keeps its files under Pier's own directory — your own ubix setup is untouched.`),y?o(`p`,`max-w-2xl text-[12.5px] text-red-600`,y):o(`div`,`flex max-w-2xl flex-col`,...a.map(c)),o(`div`,`flex max-w-2xl flex-col gap-2 border-t border-neutral-200 pt-4`,o(`span`,`text-[12.5px] font-medium text-neutral-600`,`Add one of your own`),n(`Name`,p),n(`The block Pier writes under the header`,m,{hint:`A line that opens a section of its own is refused, because it could rewrite the rest of the file.`}),o(`div`,`flex items-center gap-3`,u,h)),o(`p`,`max-w-2xl text-[12px] leading-snug text-neutral-400`,...s?[`Installs and daily updates run as `,s,` — output, failures and all.`]:[`Switching one on creates the daily task that installs it and keeps it current.`]),i))}async function ge(e,t,n){let r=v.find(t=>t.name===e);n(await ne(re(e,t),r?.source===`binary`?t?`Saved — installing now; watch the run.`:`Saved — uninstalling in the next run.`:`Saved — sessions take it on their next message.`))}async function _e(e,t){let n=++f,r=await P(`/api/config/resource${B(`&kind=${e}&name=${encodeURIComponent(t)}`)}`,`failed to load ${t}`,{cache:`no-store`});if(!r.ok){n===f&&X(r.error);return}if(n!==f)return;let{content:i}=r.value,a=await N(t);n===f&&R.replaceChildren(Z(t,o(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,`read-only`)),o(`div`,`min-h-0 flex-1 overflow-auto`,x(S(i),a)))}function ve(){M.replaceChildren(new Option(p?`Global (${p})`:`Global`,`global`),...i().map(e=>new Option(`${l(e)} — ${e}`,e))),[...M.options].some(e=>e.value===a)||(a=`global`),M.value=a}return m(r,()=>{ve(),U()},w)}var he=`medium`,Q=e=>`${e.provider}/${e.id}`,$=`Off — the first message is the title`,ge=[`hardest reasoning — architecture, gnarly debugging`,`long autonomous implementation runs`,`balanced default — implementation, review`,`cheap & fast — listings, extraction, simple checks`,`cross-vendor second opinion`];function _e(){let r=[],i=[],a=!1,s,l=o(`span`,`text-[11.5px]`,``),u=o(`span`,`text-[11.5px]`,``),d=o(`div`,`flex items-center gap-3`),f=b(`Save menu`,!0),m=o(`div`,`flex min-w-0 flex-col gap-2`),v=o(`div`,`flex items-center gap-2`),x=o(`div`,`mx-auto flex w-full max-w-3xl min-w-0 flex-col gap-6`);function S(){a=!0,t(l,`idle`,`unsaved changes`)}function C(e){let t=g(e.note??``);t.classList.remove(`w-full`),t.classList.add(`min-w-0`,`flex-1`),t.placeholder=`why this one — pick a preset or write your own`,t.setAttribute(`list`,`model-menu-notes`),t.oninput=()=>{e.note=t.value,S()};let n=D(O.map(e=>[`thinking: ${p(e)}`,e]),e.thinking);n.classList.replace(`w-full`,`w-44`),n.classList.add(`flex-none`),n.onchange=()=>{e.thinking=n.value,S()};let i=b(`Remove`);i.classList.add(`flex-none`),i.onclick=()=>{r=r.filter(t=>t!==e),S(),E()};let a=o(`span`,`w-52 flex-none truncate font-mono text-[12px] text-neutral-700`,Q(e));return a.title=Q(e),o(`div`,`flex min-w-0 items-center gap-2 rounded-lg border border-neutral-200 bg-white px-3 py-2 shadow-2xs max-md:flex-wrap`,a,n,t,i)}function w(){let t=i.filter(e=>!r.some(t=>Q(t)===Q(e))),n=b(`Pin model`);n.prepend(e(R)),n.classList.add(`inline-flex`,`items-center`,`gap-1.5`,`flex-none`,`whitespace-nowrap`),n.disabled=t.length===0,n.onclick=()=>{let e=he;M(n,A({models:t,current:null,thinkingLevel:e,thinkingLevels:[...O],onThinkingPick:t=>{e=t},onPick:t=>{y(),r.push({provider:t.provider,id:t.id,thinking:e}),S(),E()}}))},v.replaceChildren(n)}function T(){let e=s,n=e&&!i.some(t=>Q(t)===Q(e))?[e,...i]:i,r=V(e?e.id:$,`${k} flex min-w-0 flex-1 cursor-pointer items-center truncate text-left hover:bg-neutral-50 ${e?`text-neutral-700`:`text-neutral-400`}`);e&&(r.title=Q(e));let a=e=>{y(),(async()=>{t(u,`saving`,`saving…`);let n=await _(`/api/settings`,{titleModel:e&&{provider:e.provider,id:e.id}},`PUT`);if(!n.ok)return t(u,`failed`,await c(n,`Could not save`)),T();s=(await n.json()).titleModel,t(u,`saved`,s?`Saved — names the next new session after its first reply.`:`Off.`),T()})()};r.onclick=()=>{let t=A({models:n,current:e,thinkingLevel:`medium`,thinkingLevels:[],onThinkingPick:()=>{},onPick:a}),i=V($,`w-full cursor-pointer px-3 py-1.5 text-left text-[12.5px] text-neutral-500 hover:bg-neutral-100`);i.onclick=()=>a(null);let s=o(`div`,`flex flex-col`);s.append(t,o(`div`,`border-t border-neutral-200`),i),M(r,s)},d.replaceChildren(r,u)}function E(){m.replaceChildren(...r.length?r.map(C):[h(`Nothing pinned — every picker shows the curated catalog as is.`)]),w(),T()}async function j(){t(l,`saving`,`saving…`);let e=r.map(({provider:e,id:t,thinking:n,note:r})=>({provider:e,id:t,thinking:n,...r?.trim()?{note:r.trim()}:{}})),n=await _(`/api/settings`,{modelMenu:e},`PUT`);if(!n.ok)return t(l,`failed`,await c(n,`Could not save`));r=(await n.json()).modelMenu,a=!1,t(l,`saved`,`Saved — agents see it on their next models call.`),E()}f.onclick=()=>void j();function N(){a||(async()=>{let[e,n]=await Promise.all([P(`/api/settings`,`Could not load the menu`),P(`/api/models`,`Could not load the model catalog`)]);if(!e.ok)return t(l,`failed`,e.error);r=e.value.modelMenu,s=e.value.titleModel,i=n.ok?n.value:[],l.textContent=``,E()})()}let F=o(`datalist`,``);return F.id=`model-menu-notes`,F.append(...ge.map(e=>new Option(e))),x.append(B(`Model menu`,`Which few models this deployment favors, each with a usual reasoning level and one line of intent. Pinned entries lead every model picker, and agents delegating work match your notes against the task instead of guessing ids.`,n(`Pinned models`,m,{hint:`The note is what an agent matches a task against — say when to reach for it, not what it is.`}),n(`Add`,v,{hint:`The list is the live catalog — only models that exist right now can be pinned.`}),o(`div`,`flex items-center gap-3`,f,l),F),B(`Session titles`,`A session is titled by its first message unless a model names it: one short request after the first reply, on the model picked here — a small, cheap one is plenty. A failed request is reported in the session and the first message stays the title.`,n(`Title model`,d))),{el:x,load:N}}var ve=(e,t)=>{let n;try{n=new URL(e)}catch{return null}if(n.protocol!==`http:`&&n.protocol!==`https:`)return null;let r=o(`a`,`text-indigo-600 hover:underline`,t);return r.href=n.href,r.target=`_blank`,r.rel=`noreferrer`,r};function ye(e,t,n,r){let i=document.createElement(`dialog`);i.className=`m-auto w-[min(32rem,92vw)] rounded-lg border border-neutral-200 bg-white p-0 shadow-xl backdrop:bg-black/30`;let a=o(`div`,`flex flex-col gap-2`),s=o(`div`,`flex flex-col gap-2`),l=o(`p`,`text-[12.5px] text-neutral-400`,`Starting…`),u=b(`Cancel`),d=(e,t)=>{l.className=`text-[12.5px] ${v[e]}`,l.textContent=t};i.append(o(`div`,`border-b border-neutral-200 px-4 py-2.5 text-[14px] font-semibold`,t),o(`div`,`flex max-h-[65vh] flex-col gap-3 overflow-y-auto px-4 py-3`,a,s,l),o(`div`,`flex justify-end border-t border-neutral-200 px-4 py-2.5`,u)),document.body.append(i),i.showModal();let f=e.id,p=e.state,m,h,y=new Set,x=!1,S=!1,C=async e=>{if(!S){if(e&&p===`running`){S=!0,u.disabled=!0;try{let e=await _(`/api/providers/flows/${f}/cancel`,{});if(!e.ok&&e.status!==404){d(`failed`,await c(e,`Could not cancel authentication flow`));return}}catch(e){d(`failed`,`Could not cancel authentication flow: ${String(e)}`);return}finally{S=!1,u.disabled=!1}}clearTimeout(m),i.close()}};u.onclick=()=>void C(!0),i.oncancel=e=>{e.preventDefault(),C(!0)},i.onclose=()=>{x=!0,clearTimeout(m),i.remove()};let w=e=>{if(e.type===`auth_url`){let t=o(`div`,`flex flex-col gap-1 text-[12.5px] text-neutral-600`);return e.instructions&&t.append(o(`p`,``,e.instructions)),t.append(ve(e.url,`Open authorization page`)??o(`span`,`text-red-600`,`Invalid authorization URL`)),t}if(e.type===`device_code`){let t=o(`div`,`flex flex-col gap-2 text-[12.5px] text-neutral-600`);return t.append(o(`div`,`flex items-center gap-2`,o(`code`,`font-mono text-[17px] font-semibold text-neutral-800`,e.userCode),H(`btn text-[11px]`,()=>e.userCode))),t.append(ve(e.verificationUri,`Open verification page`)??o(`span`,`text-red-600`,`Invalid verification URL`)),t}let t=o(`div`,`text-[12.5px] text-neutral-600`,e.message);if(e.type===`info`)for(let n of e.links??[]){let e=ve(n.url,n.label??n.url);e&&t.append(` `,e)}return t},T=(e,t)=>{h=t.id;let n;if(t.type===`select`){let e=document.createElement(`select`);e.append(...t.options.map(e=>new Option(e.description?`${e.label} — ${e.description}`:e.label,e.id))),n=e}else{let e=g(``,t.type===`secret`?`password`:`text`);e.placeholder=t.placeholder??``,e.autocomplete=`off`,n=e}n.className=`${n.tagName===`SELECT`?`select `:``}w-full rounded-lg border border-neutral-300 bg-white px-2.5 py-1.5 text-[12.5px] focus:border-indigo-400 focus:outline-none`;let r=b(`Continue`,!0);r.type=`submit`;let i=o(`form`,`flex flex-col gap-2`,o(`label`,`text-[12.5px] font-medium text-neutral-700`,t.message),n,o(`div`,`flex justify-end`,r));i.onsubmit=i=>{i.preventDefault(),r.disabled=!0,(async()=>{try{let r=await _(`/api/providers/flows/${e.id}/respond`,{promptId:t.id,value:n.value});if(x)return;if(!r.ok){d(`failed`,await c(r,`Could not submit response`));return}y.add(t.id),h=void 0,s.replaceChildren(),d(`saving`,`Waiting for provider…`)}catch(e){x||d(`failed`,`Could not submit response: ${String(e)}`)}finally{r.disabled=!1}})()},s.replaceChildren(i),n.focus()},E=e=>{p=e.state,a.replaceChildren(...e.events.map(w));let t=e.prompt&&!y.has(e.prompt.id)?e.prompt:void 0;if(t?.id!==h&&(t?T(e,t):(h=void 0,s.replaceChildren())),e.state===`running`){d(`saving`,t?`Waiting for your response.`:`Waiting for provider…`);return}clearTimeout(m),s.replaceChildren(),e.state===`succeeded`?d(`saved`,`${n} configured.`):d(`failed`,e.state===`cancelled`?`Cancelled.`:e.error??`Authentication failed.`),u.textContent=`Close`,u.onclick=()=>void C(!1),e.state===`succeeded`&&r()},D=async()=>{if(!(x||p!==`running`))try{let e=await fetch(`/api/providers/flows/${f}`,{cache:`no-store`});if(x)return;if(!e.ok){d(`failed`,await c(e,`Authentication status unavailable`)),e.status===404?p=`failed`:m=setTimeout(()=>void D(),1e3);return}E(await e.json()),p===`running`&&(m=setTimeout(()=>void D(),500))}catch(e){if(x)return;d(`failed`,`Authentication status unavailable: ${String(e)}`),m=setTimeout(()=>void D(),1e3)}};E(e),p===`running`&&(m=setTimeout(()=>void D(),500))}var be=[`anthropic`,`openai`,`openai-codex`,`google`,`openrouter`,`deepseek`],xe=[[`OpenAI Chat Completions`,`openai-completions`],[`OpenAI Responses`,`openai-responses`],[`Anthropic Messages`,`anthropic-messages`],[`Google Generative AI`,`google-generative-ai`]],Se=`__custom__`;async function Ce(e){let n=b(`Add provider`,!0);n.classList.add(`ml-auto`);let r=o(`div`,`flex flex-none items-center gap-3 rounded-t-3xl ${C} px-4 py-2`,o(`h2`,`text-[13px] font-semibold text-neutral-700`,`Providers`),n),i=o(`div`,`min-h-0 flex-1 overflow-y-auto`);e.replaceChildren(r,i);let a=[],s=``,l=async()=>{i.replaceChildren(o(`p`,`px-4 py-3 text-[13px] text-neutral-400`,`Loading…`));try{let[e,t]=await Promise.all([P(`/api/providers`,`Could not load providers`,{cache:`no-store`}),P(`/api/models`,`the model catalog could not be read`,{cache:`no-store`})]);if(a=t.ok?t.value:[],s=t.ok?``:t.error,!e.ok){i.replaceChildren(h(e.error));return}let r=e.value;n.onclick=()=>Te(r,void 0,l),m(r)}catch(e){i.replaceChildren(h(`Could not load providers: ${String(e)}`))}},u=async e=>{if(window.confirm(`Remove the stored credential for ${e.name}?`))try{let t=await _(`/api/providers/${encodeURIComponent(e.id)}/logout`,{});if(!t.ok){window.alert(await c(t,`Could not remove credential`));return}await l()}catch(e){window.alert(`Could not remove credential: ${String(e)}`)}},d=e=>[...new Set([...(e.models??[]).map(e=>e.id),...a.filter(t=>t.provider===e.id).map(e=>e.id)])],f=(e,t)=>o(`div`,`flex flex-col gap-1`,o(`span`,`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),o(`pre`,`max-h-56 overflow-auto whitespace-pre-wrap break-all rounded-md bg-neutral-50 p-2 font-mono text-[11.5px] leading-relaxed text-neutral-600`,t)),p=async(e,t)=>{try{let n=await _(`/api/providers/${encodeURIComponent(e)}/check`,{model:t});return n.ok?await n.json():await c(n,`Could not test`)}catch(e){return`Could not test: ${String(e)}`}},m=e=>{let n=e.filter(e=>e.configured);if(!n.length){i.replaceChildren(h(`No providers configured.`));return}i.replaceChildren(...n.map(n=>{let r=o(`div`,`min-w-0 flex-1`,o(`div`,`truncate text-[13px] font-medium text-neutral-700`,n.name),o(`div`,`truncate font-mono text-[11px] text-neutral-400`,n.id)),i=n.stored===`api_key`?`API key`:n.stored===`oauth`?`OAuth`:n.source??`configured`,a=n.endpoint??`Default endpoint`,c=o(`div`,`flex min-w-32 flex-col items-start gap-1`,te(`configured`,`bg-emerald-50 text-emerald-700 ring-emerald-200`),o(`span`,`max-w-48 truncate text-[11px] text-neutral-500`,i),o(`span`,`max-w-48 truncate text-[11px] text-neutral-400`,a));c.title=a;let m=o(`span`,`text-[11.5px]`,``),h=o(`div`,`hidden flex-col gap-2 px-4 pb-3`,m),g=o(`div`,`flex flex-wrap justify-end gap-1.5`),_=d(n);if(!_.length)t(m,`idle`,s||`No models to test: none are configured here.`),h.classList.replace(`hidden`,`flex`);else{let e=D([[`Model to test…`,``],..._.map(e=>[e,e])],``);e.classList.add(`max-w-52`,`text-[12px]`);let r=b(`Test`);r.disabled=!0,e.onchange=()=>r.disabled=!e.value,r.onclick=()=>{let i=e.value;r.disabled=!0,h.replaceChildren(m),h.classList.replace(`hidden`,`flex`),t(m,`saving`,`asking ${i}…`),p(n.id,i).then(e=>{if(r.disabled=!1,typeof e==`string`)return t(m,`failed`,e);t(m,e.ok?`saved`:`failed`,`${e.model} ${e.ok?`answered`:`did not answer`} in ${e.ms} ms`),h.append(f(`sent`,e.request||`(the request was never made)`),f(e.ok?`answered`:`replied`,e.response))})},g.append(e,r)}if(n.builtin||n.api&&n.models){let t=b(`Edit`);t.onclick=()=>Te(e,n,l),g.append(t)}if(n.stored){let e=b(`Remove credential`);e.onclick=()=>void u(n),g.append(e)}return o(`div`,`border-b border-neutral-100`,o(`div`,`grid grid-cols-[minmax(8rem,1fr)_minmax(8rem,auto)_minmax(9rem,auto)] items-center gap-3 px-4 py-2.5 max-sm:grid-cols-[1fr_auto]`,r,c,g),h)}))};await l()}function we(e,t){let n=t.filter(e=>!e.configured&&e.methods.length&&(e.builtin||e.api!==void 0&&e.models!==void 0)),r=(t,n)=>{if(!n.length)return;let r=document.createElement(`optgroup`);r.label=t,r.append(...n.map(e=>new Option(e.name,e.id))),e.append(r)};r(`Common`,be.flatMap(e=>n.filter(t=>t.id===e))),r(`More providers`,n.filter(e=>e.builtin&&!be.includes(e.id)).sort((e,t)=>e.name.localeCompare(t.name))),r(`Custom providers`,n.filter(e=>!e.builtin).sort((e,t)=>e.name.localeCompare(t.name))),e.append(new Option(`Custom provider…`,Se))}function Te(e,t,r){let i=document.createElement(`dialog`);i.className=`m-auto w-[min(32rem,92vw)] rounded-lg border border-neutral-200 bg-white p-0 shadow-xl backdrop:bg-black/30`;let a=document.createElement(`select`);a.className=`${k} select`,t||we(a,e);let s=g(),l=g(),d=g(),f=document.createElement(`select`);f.className=`${k} select`,f.append(...xe.map(([e,t])=>new Option(e,t)));let p=u(``,4);p.placeholder=`model-id
3
+ another-model-id`;let m=document.createElement(`input`);m.type=`checkbox`;let h=D([[`Up to High`,`high`],[`Up to Extra high`,`xhigh`],[`Up to Max`,`max`]],`high`);h.classList.replace(`w-full`,`w-48`),m.onchange=()=>{h.disabled=!m.checked};let v=document.createElement(`select`);v.className=`${k} select`;let y=o(`div`,`flex flex-col gap-4`),x=o(`span`,`text-[11.5px] text-red-600`,``),S=b(`Cancel`),C=b(t?`Save`:`Add`,!0);C.type=`submit`;let w=()=>t??e.find(e=>e.id===a.value),T=()=>{let e=w(),r=e?!e.builtin:a.value===Se;s.value=e?.id??``,s.disabled=t!==void 0,l.value=e?.name??``,d.value=e?.endpoint??``,f.value=e?.api??`openai-completions`,p.value=e?.models?.map(e=>e.id).join(`
4
+ `)??``;let i=e?.models?.map(e=>e.reasoning)??[];m.checked=i.length?i.every(Boolean):!e,m.indeterminate=i.some(Boolean)&&!i.every(Boolean);let c=new Set((e?.models??[]).filter(e=>e.reasoning).map(e=>e.effort??`high`)),u=c.size>1;h.replaceChildren(...u?[new Option(`Keep as configured`,``)]:[],new Option(`Up to High`,`high`),new Option(`Up to Extra high`,`xhigh`),new Option(`Up to Max`,`max`)),h.value=u?``:[...c][0]??`high`,h.disabled=!m.checked&&!m.indeterminate;let g=[];e?.configured&&g.push(new Option(`Keep current authentication`,``));let _=e?.methods??[{type:`api_key`,name:`API key`}];for(let t of _.filter(t=>e?.builtin!==!1||t.type===`api_key`))g.push(new Option(t.name,t.type));v.replaceChildren(...g);let b=[];t||b.push(n(`Provider`,a)),r?b.push(n(`Provider ID`,s),n(`Display name`,l),n(`Endpoint`,d),n(`API format`,f),n(`Models`,p),n(`Model capabilities`,o(`div`,`flex flex-wrap items-center gap-3`,o(`label`,`flex items-center gap-2 text-[12.5px] text-neutral-600`,m,o(`span`,``,`Reasoning`)),h),{hint:`Extra high and Max reach the model only if it accepts them; every reasoning model has High.`})):(d.placeholder=`Provider default`,b.push(n(`Endpoint`,d))),b.push(n(`Authentication`,v)),y.replaceChildren(...b)};a.onchange=T,T();let E=o(`form`,`flex flex-col gap-4 px-4 py-3`,y,o(`div`,`flex items-center justify-end gap-2`,x,S,C)),O=!1;S.onclick=()=>{O||i.close()},i.oncancel=e=>{O&&e.preventDefault()},E.onsubmit=e=>{if(e.preventDefault(),O)return;x.textContent=``;let t=w(),n=(t?!t.builtin:a.value===Se)?{kind:`custom`,id:s.value.trim(),...l.value.trim()?{name:l.value.trim()}:{},endpoint:d.value.trim(),api:f.value,models:[...new Set(p.value.split(`
5
+ `).map(e=>e.trim()).filter(Boolean))].map(e=>{let n=t?.models?.find(t=>t.id===e),r=m.indeterminate?n?.reasoning??m.checked:m.checked,i=h.value?h.value:n?.effort;return{id:e,reasoning:r,...r&&i&&i!==`high`?{effort:i}:{}}})}:{kind:`builtin`,id:t.id,...d.value.trim()?{endpoint:d.value.trim()}:{}},o=v.value||null;O=!0,C.disabled=!0,S.disabled=!0,(async()=>{try{let e=await _(`/api/providers/setup`,{setup:n,authType:o});if(!e.ok){x.textContent=await c(e,`Could not configure provider`);return}if(i.close(),e.status===202){let t=v.selectedOptions[0]?.textContent??`Authentication`;ye(await e.json(),n.id,t,()=>void r())}else await r()}catch(e){x.textContent=`Could not configure provider: ${String(e)}`}finally{O=!1,C.disabled=!1,S.disabled=!1}})()},i.append(o(`div`,`border-b border-neutral-200 px-4 py-2.5 text-[14px] font-semibold`,t?`Edit ${t.name}`:`Add provider`),E),i.onclose=()=>i.remove(),document.body.append(i),i.showModal(),(t?d:a).focus()}var Ee=[[`models`,`Models`],[`files`,`Agent`],[`channels`,`Channels`],[`instance`,`Instance`],[`security`,`Security`]],De=e=>Ee.some(([t])=>t===e),Oe=`pier.settingsTopic`;function ke(e){return[/\bEdg\//.test(e)?`Edge`:/\b(Firefox|Chrome|Safari)\/[\d.]+/.exec(e)?.[1],/\(([^;)]+)/.exec(e)?.[1]?.trim()].filter(Boolean).join(` · `)||e||`unknown client`}function Ae(e,a,l){let u=localStorage.getItem(Oe)??void 0,d=De(u)?u:`models`,f=o(`header`,`pagehead`);function p(){f.replaceChildren(i(`Settings`),...Ee.map(([e,t])=>r(t,e===d,()=>l(e))))}let v=g();v.placeholder=`https://pier.example.com`,v.autocomplete=`off`;let y=o(`span`,`text-[11.5px]`,``),x=b(`Save`,!0);async function S(){t(y,`saving`,`saving…`);let e=await _(`/api/settings`,{publicUrl:v.value},`PUT`);if(!e.ok)return t(y,`failed`,await c(e,`Could not save`));let{publicUrl:n}=await e.json();v.value=n,t(y,`saved`,n?`Saved — boards link as ${n}/p/<slug>-<token>/`:`Cleared.`)}x.onclick=()=>void S(),v.onkeydown=e=>{e.key===`Enter`&&S()};let C=B(`Public URL`,`Where this Pier is reached from outside — the proxy's address, not the port it listens on.`,n(`Base URL`,v,{hint:`Agents read it to hand you a clickable board link instead of a path. Nothing here changes what Pier serves; leave it empty if Pier is only reachable locally.`}),o(`div`,`flex items-center gap-3`,x,y)),T=g(``,`password`),E=g(``,`password`),D=g(``,`password`);for(let e of[T,E,D])e.autocomplete=`off`;let O=o(`span`,`text-[11.5px]`,``),k=b(`Change password`,!0);async function A(){if(E.value!==D.value)return t(O,`failed`,`The two new passwords differ.`);t(O,`saving`,`changing…`);let e=await _(`/api/password`,{current:T.value,next:E.value});if(!e.ok)return t(O,`failed`,await c(e,`Could not change the password`));for(let e of[T,E,D])e.value=``;t(O,`saved`,`Changed. Sign in again with the new password.`),location.href=`/login`}k.onclick=()=>void A(),D.onkeydown=e=>{e.key===`Enter`&&A()};let j=B(`Password`,`One shared password guards every page and API route. Changing it signs out every signed-in browser, this one included.`,n(`Current password`,T),n(`New password`,E,{hint:`At least 10 characters.`}),n(`Repeat new password`,D),o(`div`,`flex items-center gap-3`,k,O)),M=b(`Reload`,!0),N=o(`span`,`text-[11.5px]`,``);M.onclick=()=>{M.disabled=!0,t(N,`saving`,`reloading…`),(async()=>{let e=await _(`/api/reload`,{});if(M.disabled=!1,!e.ok)return t(N,`failed`,await c(e,`Could not reload`));let{recycled:n,busy:r}=await e.json(),i=n?`Recycled ${n} session(s).`:`No idle session needed it.`,a=r?` ${r} still mid-turn — they take it when the turn ends.`:``;t(N,r?`idle`:`saved`,i+a)})()};let F=B(`Reload configuration`,`Re-reads channel configuration and lets go of idle sessions, so the next message opens them with the current agent files, skills and credentials. Saving here does this on its own — use it after something outside the Console changed a file.`,o(`div`,`flex items-center gap-3`,M,N)),I=o(`div`,`flex flex-col gap-2`),L=o(`span`,`text-[11.5px]`,``);async function R(e,n){t(L,`saving`,`signing out…`);try{let r=await _(e,{});if(r.ok)return!0;t(L,`failed`,await c(r,n))}catch(e){t(L,`failed`,`${n}: ${String(e)}`)}return!1}let z=b(`Sign out`);z.onclick=()=>{z.disabled=!0,R(`/logout`,`Could not sign out`).then(e=>{e?location.href=`/login`:z.disabled=!1})};function V(e){I.replaceChildren(...e.map(e=>{let n=b(e.current?`This browser`:`Sign out`);n.disabled=e.current,n.onclick=()=>{n.disabled=!0,R(`/api/devices/${encodeURIComponent(e.id)}/signout`,`Could not sign it out`).then(e=>{if(!e)return void(n.disabled=!1);t(L,`saved`,`Signed out.`),H()})};let r=o(`div`,`flex min-w-0 flex-col`,o(`span`,`truncate text-[12.5px] text-neutral-700`,ke(e.agent)));return r.title=e.agent,r.append(o(`span`,`truncate text-[11.5px] text-neutral-400`,`${e.ip} · seen ${s(e.seenAt)} · signed in ${s(e.createdAt)}`)),o(`div`,`flex items-center justify-between gap-3 rounded-lg border border-neutral-200 px-3 py-2`,r,n)}))}async function H(){let e=await P(`/api/devices`,`Could not load signed-in devices`);if(!e.ok){I.replaceChildren(h(e.error));return}V(e.value)}let ne=B(`Signed-in devices`,`One row per browser holding a session. Signing one out invalidates its cookie immediately; sessions expire on their own 7 days after last use.`,I,o(`div`,`flex items-center gap-3`,z,L)),re=o(`div`,`mx-auto flex max-w-2xl flex-col gap-6`,C,ee(),F),U=e=>o(`div`,`hidden min-h-0 flex-1 overflow-y-auto`,o(`div`,`px-4 pb-5 pt-1`,e)),W=_e(),G=o(`div`,`mx-auto flex w-full min-w-0 max-w-3xl flex-col ${w}`),K=o(`section`,`hidden min-h-0 flex-1 flex-col`),q=ce(K),ie=o(`section`,`hidden min-h-0 flex-1 flex-col`),J=me(ie,a);function ae(){(async()=>{let e=await P(`/api/settings`,`Could not load settings`);if(!e.ok)return t(y,`failed`,e.error);v.value=e.value.publicUrl,y.textContent=``})()}let Y=o(`div`,`mx-auto flex max-w-2xl flex-col gap-6`),oe=e=>Y.replaceChildren(e,j,ne);async function X(){O.textContent=``,L.textContent=``,H();let e=await P(`/api/secrets`,`Could not load key status`);if(!e.ok){oe(h(e.error));return}Z(e.value)}function Z(e,n){let r=e.state===`locked`,i=o(`span`,`text-[11.5px]`,``);n&&t(i,`saved`,n);let a=o(`div`,`flex items-center gap-2`,te(e.state,r?`bg-red-50 text-red-700 ring-red-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`),o(`span`,`text-[12.5px] text-neutral-600`,r?`Stored credentials cannot be read until the key is unlocked.`:e.mode===`vt`?`Key mode: vt:// — unlocking takes one vt approval per process start.`:`Key mode: file — the key sits raw in master.key; switch to vt:// to require an approval.`)),s=o(`a`,`text-indigo-600 hover:underline`,`vt`);s.href=`https://github.com/timqi/vt`,s.target=`_blank`,s.rel=`noreferrer`;let l=[a,o(`p`,`text-[12px] leading-snug text-neutral-500`,s,` is a small local KMS: it keeps the key wrapped and releases it only on an explicit approval — Touch ID on a Mac, a phone passkey on a headless host. Pier only stores the vt:// record, so master.key alone unlocks nothing.`)];if(r){l.push(o(`p`,`text-[12.5px] leading-snug text-red-600`,e.reason??`No reason reported.`));let n=b(`Unlock`,!0);n.onclick=()=>{t(i,`saving`,`unlocking… (vt mode waits on your approval)`),(async()=>{let e=await _(`/api/secrets/unlock`,{});if(!e.ok)return t(i,`failed`,await c(e,`Could not unlock`));Z(await e.json(),`Unlocked — channels are starting.`)})()},l.push(o(`div`,`flex items-center gap-3`,n,i))}else{let n=async(e,n,r)=>{if(!window.confirm(n))return;t(i,`saving`,e===`vt`?`rotating… (vt asks for an approval)`:`rotating…`);let a=await _(`/api/secrets/rotate`,{mode:e});if(!a.ok)return t(i,`failed`,await c(a,`Could not rotate`));Z(await a.json(),r)},r=e.mode??`file`,a=b(`Rotate key`,!0);a.onclick=()=>void n(r,`Generate a new master key? Stored credentials stay valid; the old key stops working.`,`Rotated.`);let s=r===`vt`?`file`:`vt`,u=b(s===`vt`?`Switch to vt://`:`Switch to file`);u.onclick=()=>void n(s,s===`vt`?`Move the master key into vt? Every process start will then wait on a vt approval.`:`Store the master key raw in master.key? Anyone who can read the file can read every credential.`,s===`vt`?`Switched to vt:// mode.`:`Switched to file mode.`),l.push(o(`div`,`flex items-center gap-3`,a,u,i))}if(r||e.mode===`vt`){let e=o(`pre`,`hidden overflow-x-auto rounded-lg bg-neutral-50 p-3 text-[11.5px] leading-snug text-neutral-700`),t=b(`vt doctor`);t.onclick=()=>{t.disabled=!0,e.classList.remove(`hidden`),e.textContent=`running vt doctor…`,(async()=>{let n=await P(`/api/secrets/doctor`,`Could not run vt doctor`);e.textContent=n.ok?n.value.report:n.error,t.disabled=!1})()},l.push(o(`div`,`flex items-center gap-3`,t),e)}oe(B(`Master key`,`Seals every credential Pier stores (channel tokens, API keys). Rotating rewraps the key file; no stored data is rewritten.`,...l))}let se=U(re),le=U(o(`div`,`flex flex-col gap-6`,G,W.el)),ue=U(Y),de=[[`instance`,se,ae],[`models`,le,()=>{Ce(G),W.load()}],[`security`,ue,()=>void X()]];e.append(f,se,le,K,ie,ue);function fe(e){De(e)&&(d=e),localStorage.setItem(Oe,d),p();for(let[e,t,n]of de){let r=e===d;t.classList.toggle(`hidden`,!r),r&&n()}d===`channels`?q.show():q.hide(),d===`files`?J.show():J.hide()}return m(e,fe)}export{Ae as createSettingsView};
@@ -0,0 +1,3 @@
1
+ import{$ as e,H as t,P as n,S as r,V as i,b as a,q as o,rt as s,v as c}from"./index-DzXDXra_.js";var l=e=>e===null?`-`:new Date(e).toLocaleString(),u=e=>e.startedAt===null?`-`:i((e.finishedAt??Date.now())-e.startedAt),d=e=>e.state===`succeeded`&&e.matched===!1?`No match`:e.state,f={queued:`bg-neutral-100 text-neutral-600 ring-neutral-200`,running:`bg-sky-50 text-sky-700 ring-sky-200`,succeeded:`bg-emerald-50 text-emerald-700 ring-emerald-200`,failed:`bg-red-50 text-red-700 ring-red-200`,cancelled:`bg-amber-50 text-amber-700 ring-amber-200`,interrupted:`bg-amber-50 text-amber-700 ring-amber-200`,skipped:`bg-neutral-100 text-neutral-600 ring-neutral-200`};function p(e){let t=d(e);return c(t,t===`No match`?f.skipped:f[e.state],e.state===`running`?`animate-pulse bg-sky-500`:void 0)}function m(e){return e.archived?c(`Archived`,`bg-neutral-50 text-neutral-400 ring-neutral-200`):e.trigger.type===`manual`?c(`Manual`,`bg-neutral-100 text-neutral-600 ring-neutral-200`):e.enabled?c(`Enabled`,`bg-emerald-50 text-emerald-700 ring-emerald-200`):c(`Paused`,`bg-amber-50 text-amber-700 ring-amber-200`)}var h=`px-4 pt-4 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,g=`m-4 mt-2 whitespace-pre-wrap break-words rounded-lg border border-black/[0.06] bg-black/[0.025] px-3 py-2 font-mono text-[12px] leading-snug dark:border-neutral-200 dark:bg-neutral-100`,_=e=>e.trigger.type===`manual`?`Manual`:e.trigger.type===`cron`?`${e.trigger.expression} (${e.trigger.timezone})`:`Every ${e.trigger.intervalSeconds}s · ${e.trigger.mode}`,v=e=>e.action.type===`agent`?`Agent · ${e.action.session.mode}`:e.action.type===`bash`?`Bash`:e.action.type===`system`?`System`:`Task`;function y(e,n){let r=t(`div`,`grid max-w-4xl grid-cols-[6rem_minmax(0,1fr)] gap-x-5 gap-y-3.5 p-4 text-[13px] md:grid-cols-[9.375rem_minmax(0,1fr)]`),i=[[`Status`,e.archived?`Archived`:e.trigger.type===`manual`?`Manual`:e.enabled?`Enabled`:`Paused`],[`Trigger`,_(e)],[`Action`,v(e)],[`Timeout`,`${e.timeoutSeconds}s`],[`Next run`,l(e.nextRunAt)],[`Revision`,String(e.revision)],[`Created by`,e.createdBySessionId??e.creator],[`Callback`,e.callback.type===`session`?e.callback.sessionId:e.callback.type],[`Description`,e.description||`-`]];e.action.type===`agent`&&(i.push([`Session policy`,e.action.session.mode]),e.action.session.mode===`reuse`&&i.push([`Session`,e.action.session.sessionId]),`cwd`in e.action.session&&i.push([`Directory`,e.action.session.cwd]),e.action.launch?.model&&i.push([`Model`,`${e.action.launch.model.provider}/${e.action.launch.model.id}`]),e.action.launch?.thinking&&i.push([`Thinking`,e.action.launch.thinking]),i.push([`Prompt`,e.action.prompt])),e.action.type===`bash`&&i.push([`Directory`,e.action.cwd],[`Script`,e.action.script]),e.action.type===`task`&&i.push([`Target task`,e.action.taskId]),e.action.type===`system`&&i.push([`System action`,e.action.name]),e.trigger.type===`watch`&&i.push([`Probe`,e.trigger.script]);for(let[e,n]of i)r.append(t(`span`,`pt-px text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),t(`pre`,`whitespace-pre-wrap break-words font-mono text-[12.5px] leading-snug`,n));if(e.action.type===`agent`&&e.action.session.mode===`reuse`){let{sessionId:i}=e.action.session,o=a(`Open session`);o.onclick=()=>n(i),r.append(t(`span`,``,``),o)}return r}function b(e){return[e.pendingDecisionId?`Awaiting decision`:``,e.callbackState&&e.callbackState!==`delivered`?`Callback not delivered (${e.callbackState})`:``,e.groupCallbackState&&e.groupCallbackState!==`delivered`?`Group callback not delivered (${e.groupCallbackState})`:``].filter(Boolean).join(` · `)}function x(e,n,i,a){let o=t(`div`,`divide-y divide-neutral-100`);for(let e of n){let n=t(`button`,`grid w-full cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1 px-4 py-2.5 text-left text-[12.5px] transition-colors hover:bg-neutral-50 md:grid-cols-[7.5rem_minmax(0,1fr)_7.5rem_6.25rem]`);n.setAttribute(`type`,`button`),n.append(t(`span`,`flex`,p(e)),t(`span`,`truncate text-neutral-500`,l(e.queuedAt)),t(`span`,`text-neutral-500`,e.triggerSource),t(`span`,`text-right font-mono text-[11.5px] text-neutral-400`,u(e))),n.onclick=()=>i(e.id),o.append(n)}n.length||o.append(t(`div`,`p-4`,r(`No runs yet.`))),e.replaceChildren(o),e.scrollTop=a.top,e.onscroll=()=>{a.top=e.scrollTop}}var S=e=>`Exit code: ${e.exitCode??`-`}\nstdout:\n${e.stdout}${e.stdoutTruncated?`
2
+ [stdout truncated]`:``}\nstderr:\n${e.stderr}${e.stderrTruncated?`
3
+ [stderr truncated]`:``}`;async function C(r,i,c,d,f){let m=String(Number(r.dataset.runRequest??0)+1);r.dataset.runRequest=m,r.onscroll=()=>{f.scrollTop=r.scrollTop};let _=a(`Runs`);_.className=`cursor-pointer text-neutral-500 hover:text-neutral-800 hover:underline`,_.onclick=()=>{f.selectedId=null,f.scrollTop=0,c()};let v=n(_,e(s,`h-3.5 w-3.5 text-neutral-400`),t(`span`,`min-w-0 truncate font-mono text-[12px] text-neutral-500`,i)),C=r.dataset.runId!==i;C&&(r.dataset.runId=i,r.replaceChildren(v,t(`p`,`p-4 text-[13px] text-neutral-500`,`Loading run...`)));let[w,T]=await Promise.all([o(`/api/task-runs/${i}`,`Could not load the run`),o(`/api/task-runs/${i}/messages`,`Could not load the run's messages`)]);if(!r.isConnected||r.dataset.runRequest!==m||f.selectedId!==i)return;if(!w.ok){let e=await o(`/api/task-groups/${i}`,w.error);if(!r.isConnected||r.dataset.runRequest!==m||f.selectedId!==i)return;if(f.drawn=``,!e.ok){r.replaceChildren(v,t(`p`,`p-4 text-[13px] text-red-600`,w.error));return}let{group:n,members:a}=e.value,s=t(`div`,`min-w-0`);r.replaceChildren(v,t(`div`,`border-b border-neutral-100 bg-neutral-50/60 px-4 py-3 text-[12.5px] text-neutral-600`,[`Task group \u00b7 join ${n.join}`,`${String(a.length)} runs`,n.callbackState?`callback ${n.callbackState}`:``].filter(Boolean).join(` · `)),s),x(s,a,d.openRun,{top:0});return}let E=w.value,D=T.ok?T.value:[],O=JSON.stringify([E,T]);if(!C&&f.drawn===O)return;if(f.drawn=O,E.targetSessionId){let e=a(`Open session`);e.classList.add(`ml-auto`),e.onclick=()=>d.openSession(E.targetSessionId),v.append(e)}if(E.state===`queued`||E.state===`running`){let e=a(`Stop run`);e.onclick=()=>{window.confirm(`Stop this run of "${E.context.definition.name}"?`)&&d.mutate(`/api/task-runs/${E.id}/cancel`)},v.append(e)}let k=t(`div`,`min-w-0`),A=b(E);k.append(t(`div`,`flex flex-wrap items-center gap-x-5 gap-y-2 border-b border-neutral-100 bg-neutral-50/60 px-4 py-3 text-[12.5px]`,t(`span`,`flex items-center gap-2`,p(E),t(`span`,`font-medium`,E.context.definition.name)),...A?[t(`span`,`rounded-md bg-amber-50 px-2 py-0.5 text-[12px] text-amber-700 ring-1 ring-amber-200`,A)]:[],t(`span`,`text-neutral-500`,l(E.queuedAt)),t(`span`,`text-neutral-500`,E.triggerSource),t(`span`,`font-mono text-[11.5px] text-neutral-400`,u(E))));let j=t(`div`,`flex flex-wrap items-center gap-2 border-b border-neutral-100 px-4 py-3 text-[12px]`),M=(e,t)=>{let n=a(e);n.classList.add(`max-w-full`,`break-all`,`!whitespace-normal`),n.onclick=t,j.append(n)};if(E.context.definition.kind===`task`&&M(`Task: ${E.context.definition.name}`,()=>d.openTask(E.taskId)),E.parentRunId&&M(`Parent: ${E.parentRunId}`,()=>d.openRun(E.parentRunId)),E.resumedFromRunId&&M(`Resumed from: ${E.resumedFromRunId}`,()=>d.openRun(E.resumedFromRunId)),E.result?.type===`task`){let e=E.result.runId;M(`Child result: ${e}`,()=>d.openRun(e))}E.groupId&&j.append(t(`span`,`break-all font-mono text-[11.5px] text-neutral-500`,`Group: ${E.groupId}`)),k.append(j);for(let e of[E.error,E.skipReason,E.callbackError])e&&k.append(t(`p`,`m-4 whitespace-pre-wrap break-words rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-[12.5px] text-red-700`,e));if(E.result){let e=E.result,n=e.type===`agent`||e.type===`system`?e.text:e.type===`bash`?S(e):e.type===`task`?`Child run: ${e.runId}`:`Watch did not match.`;k.append(t(`h3`,h,`Result`),t(`pre`,g,n||`No output.`))}E.probe&&k.append(t(`h3`,h,`Watch probe: ${E.matched===null?`not evaluated`:E.matched?`matched`:`not matched`}`),t(`pre`,g,S(E.probe)));let N=t(`details`,`border-t border-neutral-200`);if(N.append(t(`summary`,`flex cursor-pointer items-center gap-1.5 px-4 py-3 text-[12px] text-neutral-500 hover:text-neutral-800`,e(s,`chev h-3 w-3`),`Configuration snapshot (revision ${E.taskRevision})`),y(E.context.definition,d.openSession)),k.append(N),T.ok||k.append(t(`p`,`m-4 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-[12.5px] text-red-700`,T.error)),D.length){let e=t(`div`,`mt-2 divide-y divide-neutral-100 border-t border-neutral-100`);for(let n of D){let r=t(`div`,`grid grid-cols-[auto_1fr] gap-3 px-4 py-2 text-[12px] md:grid-cols-[6.25rem_6.25rem_minmax(0,1fr)]`);r.append(t(`span`,`font-medium`,n.kind),t(`span`,`text-neutral-500`,n.state),t(`span`,`col-span-2 whitespace-pre-wrap break-words md:col-span-1`,n.content)),n.error&&r.append(t(`span`,`col-span-2 break-words text-red-600 md:col-span-3`,n.error)),e.append(r)}k.append(t(`div`,`border-t border-neutral-200`,t(`div`,h,`Messages`),e))}let P=t(`details`,`border-t border-neutral-200`);P.open=f.rawOpen,P.ontoggle=()=>{P.isConnected&&(f.rawOpen=P.open)},P.append(t(`summary`,`flex cursor-pointer items-center gap-1.5 px-4 py-3 text-[12px] text-neutral-500 hover:text-neutral-800`,e(s,`chev h-3 w-3`),`Raw record`),t(`pre`,g,JSON.stringify(E,null,2))),k.append(P),r.replaceChildren(v,k),r.scrollTop=f.scrollTop,r.onscroll=()=>{f.scrollTop=r.scrollTop}}export{x as a,u as c,C as i,m as l,l as n,b as o,y as r,p as s,v as t,_ as u};
@@ -0,0 +1,4 @@
1
+ import{$ as e,C as t,G as n,H as r,K as i,M as a,O as o,P as s,Q as c,R as l,S as u,T as d,X as f,Y as p,b as m,k as h,l as g,m as _,q as v,rt as y,u as b,v as x}from"./index-DzXDXra_.js";import{a as S,c as C,l as w,n as T,r as E,s as D,t as O,u as k}from"./task-runs-BCakxFk8.js";function A(e,t){let n=e.map(e=>[`${e.title??`Untitled`} · ${e.cwd}`,e.id]);return t&&!n.some(([,e])=>e===t)&&n.push([`Current session · ${t}`,t]),n}function j(e,n){let i=document.createElement(`dialog`);i.className=`m-auto w-[38.75rem] max-w-[94vw] rounded-lg border border-neutral-200 p-0 shadow-xl backdrop:bg-black/20`;let o=document.createElement(`form`);o.className=`flex max-h-[88vh] flex-col`;let s=r(`span`,`mr-auto text-[12px] text-red-600`),l=r(`header`,`flex h-11 flex-none items-center border-b border-neutral-200 px-4 font-medium`,n?`Edit task`:`New task`),u=r(`div`,`grid min-h-0 flex-1 grid-cols-2 gap-3 overflow-y-auto p-4`),f=d(n?.name??``);f.required=!0;let p=d(n?.description??``),_=d(String(n?.timeoutSeconds??3600),`number`);_.min=`1`,_.max=`86400`;let v=h([[`Manual`,`manual`],[`Scheduled`,`cron`],[`Watch`,`watch`]],n?.trigger.type??`manual`),y=h([[`Bash`,`bash`],[`Agent`,`agent`],[`Task`,`task`]],n?.action.type??`bash`),x=h([[`No callback`,`none`],[`Invoking session`,`origin`],[`Specific session`,`session`]],n?.callback.type??`none`),S=n?.callback.type===`session`?n.callback.sessionId:null,C=h(A(e.sessions(),S),S??``),w=t(`Callback session`,C);w.classList.toggle(`hidden`,x.value!==`session`),x.onchange=()=>w.classList.toggle(`hidden`,x.value!==`session`),u.append(t(`Name`,f),t(`Description`,p),t(`Trigger`,v),t(`Action`,y),t(`Callback`,x),w,t(`Timeout (seconds)`,_));let T=r(`div`,`col-span-2 grid grid-cols-2 gap-3 border-t border-neutral-200 pt-3`);u.append(T);let E=()=>{T.replaceChildren();let l,u,m,S,w,E;if(v.value===`cron`)l=d(n?.trigger.type===`cron`?n.trigger.expression:`0 9 * * *`),u=d(n?.trigger.type===`cron`?n.trigger.timezone:Intl.DateTimeFormat().resolvedOptions().timeZone),T.append(t(`Cron`,l),t(`Timezone`,u));else if(v.value===`watch`){m=a(n?.trigger.type===`watch`?n.trigger.script:``,4),E=d(n?.trigger.type===`watch`?n.trigger.cwd:e.sessions()[0]?.cwd??``),S=d(String(n?.trigger.type===`watch`?n.trigger.intervalSeconds:60),`number`),w=h([[`Continue after matches`,`repeat`],[`Stop after first match`,`once`]],n?.trigger.type===`watch`?n.trigger.mode:`repeat`);let r=t(`Probe script (0=match, 1=no match)`,m);r.classList.add(`col-span-2`),T.append(r,t(`Probe directory`,E),t(`Interval (seconds)`,S),t(`Mode`,w))}let D,O,k,j,N,P,F,I,L,R;if(y.value===`bash`){O=d(n?.action.type===`bash`?n.action.cwd:e.sessions()[0]?.cwd??``),D=a(n?.action.type===`bash`?n.action.script:``,6);let i=t(`Bash script`,D);i.classList.add(`col-span-2`),T.append(t(`Working directory`,O),r(`span`,``),i)}else if(y.value===`agent`){let r=e.sessions(),i=n?.action.type===`agent`?n.action:null,o=i?.session.mode===`reuse`?i.session.sessionId:``,s=A(r,o||null);k=h([[`Reuse session`,`reuse`],[`Fresh child per run`,`fresh`]],i?.session.mode===`reuse`?`reuse`:`fresh`),j=h(s,o||s[0]?.[1]||``);let l=i&&`cwd`in i.session?i.session.cwd??``:``;N=d(l||r[0]?.cwd||``),P=a(i?.prompt??``,6),F=h([[`Project default`,``],...g.map(e=>[c(e),e])],i?.launch?.thinking??``),I=d(i?.launch?.model?.provider??``),L=d(i?.launch?.model?.id??``);let u=t(`Session`,j),f=t(`Child directory`,N),p=[t(`Thinking`,F),t(`Model provider (optional)`,I),t(`Model id (optional)`,L)],m=()=>{let e=k?.value===`reuse`;u.classList.toggle(`hidden`,!e),f.classList.toggle(`hidden`,e);for(let t of p)t.classList.toggle(`hidden`,e)};k.onchange=m,m();let _=t(`Prompt`,P);_.classList.add(`col-span-2`),T.append(t(`Session policy`,k),u,f,...p,_)}else R=h(e.tasks().filter(e=>e.id!==n?.id&&!e.archived).map(e=>[e.name,e.id]),n?.action.type===`task`?n.action.taskId:``),T.append(t(`Target task`,R));o.onsubmit=t=>{t.preventDefault();let r=v.value===`manual`?{type:`manual`}:v.value===`cron`?{type:`cron`,expression:l.value,timezone:u.value}:{type:`watch`,script:m.value,cwd:E.value,intervalSeconds:Number(S.value),mode:w.value},a=y.value===`agent`&&k.value!==`reuse`?{...b(F.value)?{thinking:F.value}:{},...I.value.trim()&&L.value.trim()?{model:{provider:I.value.trim(),id:L.value.trim()}}:{}}:void 0,o=y.value===`bash`?{type:`bash`,cwd:O.value,script:D.value}:y.value===`agent`?{type:`agent`,prompt:P.value,session:k.value===`reuse`?{mode:`reuse`,sessionId:j.value}:{mode:`fresh`,cwd:N.value},...a?{launch:a}:{}}:{type:`task`,taskId:R.value},c=x.value===`origin`?{type:`origin`}:x.value===`session`?{type:`session`,sessionId:C.value}:{type:`none`},d={name:f.value,description:p.value,trigger:r,action:o,callback:c,timeoutSeconds:Number(_.value)};s.textContent=``,M(n?.id,d,i,s,e.onSaved)}};v.onchange=E,y.onchange=E,E();let D=m(`Cancel`);D.onclick=()=>i.close();let O=m(`Save`,!0);O.type=`submit`;let k=r(`footer`,`flex flex-none justify-end gap-2 border-t border-neutral-200 px-4 py-3`);k.append(s,D,O),o.append(l,u,k),i.append(o),i.addEventListener(`close`,()=>i.remove()),document.body.append(i),i.showModal(),f.focus()}async function M(e,t,n,r,i){let a=await f(e?`/api/tasks/${e}`:`/api/tasks`,t,e?`PATCH`:`POST`);if(!a.ok){r.textContent=(await a.json()).error??`Task save failed`;return}let o=await a.json(),s=`task`in o?o.task:o;n.close(),i(s.id)}function N(t,a,c,d,g,b,A){let M=[],N=[],P=null,F=`active`,I=`all`,L=``,R=`runs`,z={top:0},B=0,V=0,H=``,U=n(async()=>{if(P||!$.visible)return;let e=B,t=`${F}:${I}`,n=await v(`/api/tasks?state=${F}&kind=task`,`Failed to load tasks`);if(!$.visible||e!==B||t!==`${F}:${I}`)return;if(!n.ok)return H=``,K(n.error);let r=JSON.stringify(n.value);t+r!==H&&(H=t+r,M=n.value,I!==`all`&&(M=M.filter(e=>e.trigger.type===I)),X())}),W=n(async()=>{P&&$.visible&&await ae(P)});function G(){return P?W():U()}function K(e){t.querySelector(`[role=alert]`)?.remove();let n=r(`p`,`flex-none p-4 text-[13px] text-red-600`,e);n.setAttribute(`role`,`alert`),t.append(n)}async function q(){let e=P,t=await v(`/api/tasks?state=active`,`Failed to load tasks`);return!t.ok&&$.visible&&P===e&&K(t.error),t.ok?t.value:N}let J={sessions:a,tasks:()=>N,onSaved:e=>{Y(e),R=`definition`,A(e)}},ee=(e,t)=>s(...e,r(`div`,`ml-auto flex flex-wrap items-center gap-2 max-md:w-full`,...t));function Y(e){P=e,B++,R=`runs`,z.top=0}function te(){P=null,B++,X()}function ne(){!$.visible||P!==null||Promise.all([c(),q()]).then(([,e])=>{!$.visible||P!==null||(N=e,j(J))})}function X(){let e=[],n=(t,n,i,a)=>{let o=h(n,i);o.setAttribute(`aria-label`,t),o.dataset.active=String(i!==n[0]?.[1]),o.onchange=()=>{o.dataset.active=String(o.value!==n[0]?.[1]),a(o.value),V=0,G()},e.push(r(`label`,`filter-field`,r(`span`,``,t),o))},i=r(`input`,_);i.type=`search`,i.placeholder=`Search tasks`,i.setAttribute(`aria-label`,`Search tasks`),i.value=L,i.dataset.active=String(!!L),i.oninput=()=>{L=i.value,i.dataset.active=String(!!L),s()},e.push(r(`label`,`filter-field filter-search`,r(`span`,``,`Search`),i)),n(`Status`,[[`Current`,`active`],[`Archived`,`archived`]],F,e=>{F=e}),n(`Trigger`,[[`All triggers`,`all`],[`Manual`,`manual`],[`Scheduled`,`cron`],[`Watching`,`watch`]],I,e=>{I=e});let a=document.createElement(`table`);a.className=`w-full table-fixed text-left text-[12.5px]`,a.innerHTML=`<thead class="sticky top-0 bg-neutral-50 text-[10.5px] uppercase tracking-wide text-neutral-400 shadow-[inset_0_-1px_0_var(--color-neutral-200)]"><tr>
2
+ <th class="w-[42%] px-4 py-2 font-semibold md:w-[24%]">Name</th><th class="hidden w-[10%] px-2 py-2 font-semibold md:table-cell">Action</th>
3
+ <th class="hidden w-[23%] px-2 py-2 font-semibold md:table-cell">Trigger</th><th class="hidden w-[17%] px-2 py-2 font-semibold md:table-cell">Next</th>
4
+ <th class="px-2 py-2 font-semibold md:w-[14%]">Last result</th><th class="w-[6rem] px-2 py-2 font-semibold"></th></tr></thead>`;let o=document.createElement(`tbody`),s=()=>{let e=M.filter(e=>`${e.name} ${e.description??``}`.toLowerCase().includes(L.toLowerCase()));o.replaceChildren(...e.map(re)),c.classList.toggle(`hidden`,e.length>0)};a.append(o);let c=r(`div`,`p-4`,u(`No matching tasks.`)),l=r(`div`,`automation-list min-h-0 flex-1 overflow-auto`,a,c);s(),l.onscroll=()=>{V=l.scrollTop},t.replaceChildren(r(`div`,`automation-filters task-filters`,...e),l),l.scrollTop=V}function re(e){let t=document.createElement(`tr`);t.className=`cursor-pointer border-b border-neutral-100 transition-colors hover:bg-neutral-50`,t.onclick=()=>A(e.id);let n=m(e.name);n.className=`min-w-0 cursor-pointer truncate text-left font-medium text-neutral-800`,n.title=e.name,t.append(r(`td`,`py-2.5 pl-4 pr-2`,r(`div`,`flex flex-wrap items-center gap-x-2 gap-y-1`,n,w(e),...ie(e)),r(`div`,`truncate text-[11px] text-neutral-400`,e.description||``),r(`div`,`truncate text-[11px] text-neutral-400 md:hidden`,k(e))));for(let n of[O(e),k(e),T(e.nextRunAt)]){let e=r(`td`,`hidden truncate px-2 py-2.5 text-neutral-600 md:table-cell`,n);e.title=n,t.append(e)}t.append(r(`td`,`px-2 py-2.5`,e.lastRun?r(`div`,`flex`,D(e.lastRun)):r(`div`,`text-neutral-400`,`–`),r(`div`,`mt-0.5 font-mono text-[11px] text-neutral-400`,e.lastRun?C(e.lastRun):``)));let i=m(`Run now`);return i.disabled=e.archived,i.onclick=t=>{t.stopPropagation(),Z(e.id)},t.append(r(`td`,`px-2 py-1 text-right`,i)),t}function ie(e){if(!e.createdBySessionId)return[];let t=x(`agent`,`bg-violet-50 text-violet-700 ring-violet-200`);return t.title=`Created by session ${e.createdBySessionId}`,[t]}async function ae(n){let i=++B,a=t.querySelector(`[data-task-detail]`),[l,u]=await Promise.all([v(`/api/tasks/${n}`,`Failed to load task`),v(`/api/tasks/${n}/runs`,`Failed to load the task's runs`)]);if(!$.visible||i!==B||P!==n)return;if(!l.ok)return K(l.error);if(!u.ok)return K(u.error);let f=l.value,p=u.value,h=m(`Tasks`);h.className=`cursor-pointer text-neutral-500 hover:text-neutral-800 hover:underline`,h.onclick=()=>A();let g=r(`span`,`flex min-w-0 items-center gap-2`,h,e(y,`h-3.5 w-3.5 text-neutral-400`),r(`span`,`truncate font-medium`,f.name),w(f)),_=m(`Run now`,!0);_.disabled=f.archived,_.onclick=()=>void Z(f.id);let x=m(f.enabled?`Pause schedule`:`Resume schedule`);x.disabled=f.archived||f.action.type===`system`||f.trigger.type===`manual`,x.onclick=()=>void Q(`/api/tasks/${f.id}/${f.enabled?`pause`:`resume`}`);let C=m(`Edit`);C.disabled=f.archived||f.action.type===`system`,C.onclick=()=>{!$.visible||P!==f.id||Promise.all([c(),q()]).then(([,e])=>{!$.visible||P!==f.id||(N=e,j(J,f))})};let T=m(`Archive`);T.disabled=f.archived||f.action.type===`system`,T.onclick=()=>void Q(`/api/tasks/${f.id}/archive`);let D=s(),O=r(`div`,`automation-list min-h-0 flex-1 overflow-auto`);O.dataset.taskDetail=n;let k=m(`All runs`);k.onclick=()=>b({taskId:f.id});let M=()=>{D.replaceChildren(o([[`Recent runs (${p.length})`,`runs`],[`Definition`,`definition`]],R,e=>{R=e,M()}),r(`span`,`ml-auto`,k)),R===`runs`?S(O,p,e=>b({},e),z):(O.onscroll=null,O.replaceChildren(E(f,d)))},F=a?.scrollTop??0;t.replaceChildren(ee([g],[_,...f.trigger.type===`manual`?[]:[x],C,T]),D,O),M(),O.scrollTop=F}async function Z(e){try{let t=await f(`/api/tasks/${e}/run`,{sourceSessionId:g()});if(!t.ok)return K(await i(t,`Failed to run task`));b({},(await t.json()).runId)}catch(e){K(`Failed to run task: ${String(e)}`)}}async function Q(e){let t=await p(e,`POST`,`Task update failed`);if(t)return K(t);await G()}let $=l(t,e=>{e&&e!==P&&Y(e),e||te(),t.childElementCount||X(),G()});return Object.assign($,{create:ne,refresh(e){$.visible&&(!P||!e||P===e)&&G()}})}export{N as createTasksView};