@overlordai/server 1.0.164 → 1.0.166

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 (161) hide show
  1. package/dist/adapters/adapter.interface.d.ts +8 -5
  2. package/dist/adapters/adapter.interface.d.ts.map +1 -1
  3. package/dist/adapters/adapter.interface.js.map +1 -1
  4. package/dist/adapters/lark/lark-card.builder.js +2 -2
  5. package/dist/adapters/lark/lark-card.builder.js.map +1 -1
  6. package/dist/adapters/lark/lark.adapter.d.ts +16 -7
  7. package/dist/adapters/lark/lark.adapter.d.ts.map +1 -1
  8. package/dist/adapters/lark/lark.adapter.js +128 -32
  9. package/dist/adapters/lark/lark.adapter.js.map +1 -1
  10. package/dist/adapters/lark/lark.controller.d.ts.map +1 -1
  11. package/dist/adapters/lark/lark.controller.js +3 -5
  12. package/dist/adapters/lark/lark.controller.js.map +1 -1
  13. package/dist/adapters/slack/slack-block.builder.d.ts.map +1 -1
  14. package/dist/adapters/slack/slack-block.builder.js +5 -2
  15. package/dist/adapters/slack/slack-block.builder.js.map +1 -1
  16. package/dist/adapters/slack/slack.adapter.d.ts +1 -0
  17. package/dist/adapters/slack/slack.adapter.d.ts.map +1 -1
  18. package/dist/adapters/slack/slack.adapter.js +61 -15
  19. package/dist/adapters/slack/slack.adapter.js.map +1 -1
  20. package/dist/dispatcher/task-creation.service.d.ts.map +1 -1
  21. package/dist/dispatcher/task-creation.service.js +19 -9
  22. package/dist/dispatcher/task-creation.service.js.map +1 -1
  23. package/dist/dispatcher/task-lifecycle.service.d.ts +2 -0
  24. package/dist/dispatcher/task-lifecycle.service.d.ts.map +1 -1
  25. package/dist/dispatcher/task-lifecycle.service.js +50 -0
  26. package/dist/dispatcher/task-lifecycle.service.js.map +1 -1
  27. package/dist/notifier/card-actions.d.ts +11 -0
  28. package/dist/notifier/card-actions.d.ts.map +1 -0
  29. package/dist/notifier/card-actions.js +20 -0
  30. package/dist/notifier/card-actions.js.map +1 -0
  31. package/dist/notifier/notification-consumer.d.ts.map +1 -1
  32. package/dist/notifier/notification-consumer.js +9 -3
  33. package/dist/notifier/notification-consumer.js.map +1 -1
  34. package/dist/notifier/notifier.service.d.ts +1 -1
  35. package/dist/notifier/notifier.service.d.ts.map +1 -1
  36. package/dist/notifier/notifier.service.js +2 -2
  37. package/dist/notifier/notifier.service.js.map +1 -1
  38. package/dist/notifier/template.service.d.ts +10 -5
  39. package/dist/notifier/template.service.d.ts.map +1 -1
  40. package/dist/notifier/template.service.js +75 -4
  41. package/dist/notifier/template.service.js.map +1 -1
  42. package/dist/web/frame-handlers/stage-confirm.handler.d.ts +9 -1
  43. package/dist/web/frame-handlers/stage-confirm.handler.d.ts.map +1 -1
  44. package/dist/web/frame-handlers/stage-confirm.handler.js +90 -3
  45. package/dist/web/frame-handlers/stage-confirm.handler.js.map +1 -1
  46. package/dist/web/task.controller.d.ts +1 -0
  47. package/dist/web/task.controller.d.ts.map +1 -1
  48. package/dist/web/task.controller.js +13 -4
  49. package/dist/web/task.controller.js.map +1 -1
  50. package/dist/web/worker-channel.gateway.js +1 -1
  51. package/dist/web/worker-channel.gateway.js.map +1 -1
  52. package/package.json +4 -4
  53. package/public/assets/{AccessTokensPage-D_7YDp_V.js → AccessTokensPage-BGCTBtnS.js} +1 -1
  54. package/public/assets/{AdminPage-DdFXx0Xj.js → AdminPage-C3bkaQfU.js} +1 -1
  55. package/public/assets/{AgentCliPage-P5kTmePw.js → AgentCliPage-cbbNvIVh.js} +1 -1
  56. package/public/assets/{ApiReferencePage-BqWGBZ_O.js → ApiReferencePage-Dl3szXej.js} +1 -1
  57. package/public/assets/{ArchitecturePage-BL4siOHt.js → ArchitecturePage-CeJCvHOO.js} +1 -1
  58. package/public/assets/{AuditLogPage-pRql2nQ7.js → AuditLogPage-DZ7lTNZe.js} +1 -1
  59. package/public/assets/{AutomationCreatePage-DJQaYP_m.js → AutomationCreatePage-BhTa8X7N.js} +1 -1
  60. package/public/assets/{AutomationDetailPage-DqFl-wOt.js → AutomationDetailPage-vL5NdOD5.js} +1 -1
  61. package/public/assets/{AutomationEditPage-DGAGgkUC.js → AutomationEditPage-D-JIVF7y.js} +1 -1
  62. package/public/assets/{AutomationListPage-DZg8R_6o.js → AutomationListPage-yAPq7YGs.js} +1 -1
  63. package/public/assets/{AutomationRunDetailPage-CCW8q96K.js → AutomationRunDetailPage-CUrjN0ru.js} +1 -1
  64. package/public/assets/{BindPlatformPage-CZl5-Iy1.js → BindPlatformPage-SZjEpxLM.js} +1 -1
  65. package/public/assets/{BotIntegrationPage-DLkm33Yu.js → BotIntegrationPage-CxlKRS86.js} +1 -1
  66. package/public/assets/{BotManage-BLDeztU9.js → BotManage-D0N_YDie.js} +1 -1
  67. package/public/assets/{BotSetupPage-CdkW57x3.js → BotSetupPage-CoWn4EVN.js} +1 -1
  68. package/public/assets/ChangelogPage-DeqTi2vt.js +1 -0
  69. package/public/assets/Checkbox-MszKFKP5.js +1 -0
  70. package/public/assets/{CliReferencePage-oiI83DWp.js → CliReferencePage-BELtla-b.js} +1 -1
  71. package/public/assets/{ConfirmStageDialog-BvAwtj3E.js → ConfirmStageDialog-B6GWCClQ.js} +1 -1
  72. package/public/assets/{DeploymentPage-BDVB924W.js → DeploymentPage-BX0bJ84s.js} +1 -1
  73. package/public/assets/{DevWorkflowPage-DbQmdO2_.js → DevWorkflowPage-F4dPunD_.js} +1 -1
  74. package/public/assets/{DeveloperManage-CglSKeKS.js → DeveloperManage-Ch5Cuhb0.js} +1 -1
  75. package/public/assets/{DeveloperSetupPage-BnSTEmg5.js → DeveloperSetupPage-DezO-dy9.js} +1 -1
  76. package/public/assets/{DocsIndexPage-DlcO-07d.js → DocsIndexPage-mz6j61H9.js} +1 -1
  77. package/public/assets/{DocsLayout-Bt1aVPLh.js → DocsLayout-ByC0rFb9.js} +1 -1
  78. package/public/assets/{DocsPrimitives-Beo_PA0s.js → DocsPrimitives-Sl_VYTFo.js} +1 -1
  79. package/public/assets/{EditProjectPage-BvbqOa-5.js → EditProjectPage-Co7Mmqr-.js} +1 -1
  80. package/public/assets/{EmptyState-DtQh3oGP.js → EmptyState-BA9x5xQN.js} +1 -1
  81. package/public/assets/{EnvVariablesPage-ChGB0--u.js → EnvVariablesPage-BB8UDIHK.js} +1 -1
  82. package/public/assets/{HomePage-RIo62sIo.js → HomePage-iL4h_KbB.js} +1 -1
  83. package/public/assets/{InfoRow-BAw0Cqao.js → InfoRow-BcJ15QpV.js} +1 -1
  84. package/public/assets/{InstallationPage-BfFP3JL6.js → InstallationPage-3Mg3EwDu.js} +1 -1
  85. package/public/assets/{LandingPage-D1nwz0j2.js → LandingPage-BjaDEysn.js} +1 -1
  86. package/public/assets/{LocalDevelopmentPage-C9FttUSM.js → LocalDevelopmentPage-D4hmOnyv.js} +1 -1
  87. package/public/assets/{LoginPage-BSeNMZVK.js → LoginPage-Dim7DvNx.js} +1 -1
  88. package/public/assets/{MetricBar-DRasIPu8.js → MetricBar-BKYj77zw.js} +1 -1
  89. package/public/assets/{MultiSelect-CeoEM-97.js → MultiSelect-COkT47FA.js} +1 -1
  90. package/public/assets/{NotFoundPage-CxACXVzS.js → NotFoundPage-Diq4DFT7.js} +1 -1
  91. package/public/assets/{OnboardingGuide-DV4KLWmI.js → OnboardingGuide-BdvsQUOR.js} +1 -1
  92. package/public/assets/{PermissionsPage-Buj2dHal.js → PermissionsPage-CuZ4R205.js} +1 -1
  93. package/public/assets/{PipelineConfigPage-BH4Jn2yV.js → PipelineConfigPage-Bc59v8FH.js} +1 -1
  94. package/public/assets/{PipelineEditorPage-CClFLl4j.js → PipelineEditorPage-BYMUgYAp.js} +1 -1
  95. package/public/assets/{PlanPage-D4DXpDvR.js → PlanPage-Cad0WoFq.js} +1 -1
  96. package/public/assets/{ProfilePage-DvehWXam.js → ProfilePage-CAONXEJn.js} +1 -1
  97. package/public/assets/{ProjectDetailPage-Bqe31-ln.js → ProjectDetailPage-Dz2MtkqV.js} +1 -1
  98. package/public/assets/{ProjectListPage-Ct8ZMMx4.js → ProjectListPage-QLDq1Cd0.js} +1 -1
  99. package/public/assets/{PtyTerminal-DShTbNdS.js → PtyTerminal-DZZw0V7P.js} +1 -1
  100. package/public/assets/{QuickAuth-DihfVcAD.js → QuickAuth-DB27kLvg.js} +1 -1
  101. package/public/assets/{RemoveMemberConfirmDialog-CqG8IOTw.js → RemoveMemberConfirmDialog-DZ2BIQVO.js} +1 -1
  102. package/public/assets/{ReviewAggregatePage-DpWf-Ze2.js → ReviewAggregatePage-BiNX4CLc.js} +1 -1
  103. package/public/assets/{ReviewPage-CYQsaOf6.js → ReviewPage-Ggq_3chi.js} +1 -1
  104. package/public/assets/{Select-CHmz_Qig.js → Select-tnanVDGG.js} +1 -1
  105. package/public/assets/{SettingsPage-K6tggt6C.js → SettingsPage-BufRJ5IF.js} +1 -1
  106. package/public/assets/{Skeleton-BgqnK2cB.js → Skeleton-Dv9dOtKo.js} +1 -1
  107. package/public/assets/{SkillPage-CNyesq7O.js → SkillPage-nwAKYwKF.js} +1 -1
  108. package/public/assets/TaskDetailPage-COMP6EC1.js +21 -0
  109. package/public/assets/{TaskGuidePage-BWSwJgc7.js → TaskGuidePage-v3d8H2Rw.js} +1 -1
  110. package/public/assets/{TaskListPage-UYdmtrj3.js → TaskListPage-dV0t-q8c.js} +1 -1
  111. package/public/assets/{TaskStatusBadge-Corb-4yR.js → TaskStatusBadge-BbcEINkn.js} +1 -1
  112. package/public/assets/{TerminalHomePage-DRbOLOsa.js → TerminalHomePage-252i-Ub-.js} +1 -1
  113. package/public/assets/{TokenManage-Dl7fNQVT.js → TokenManage-BCoS8_VA.js} +1 -1
  114. package/public/assets/{Tooltip-BE58Ef5C.js → Tooltip-BzmNCQBI.js} +1 -1
  115. package/public/assets/{TotpSetupPage-CzPs5R1n.js → TotpSetupPage-onfqQ2Tg.js} +1 -1
  116. package/public/assets/{WorkerDetailPage-Db-WRfx3.js → WorkerDetailPage-DzDX_IED.js} +1 -1
  117. package/public/assets/{WorkerListPage-DDXGCmUJ.js → WorkerListPage-DyQqRYyL.js} +1 -1
  118. package/public/assets/{WorkerOperationsPage-vAaRESDJ.js → WorkerOperationsPage-M05K6-Uh.js} +1 -1
  119. package/public/assets/{WorkerSetupGuidePage-C7p9pa6K.js → WorkerSetupGuidePage-Dsvy4cWd.js} +1 -1
  120. package/public/assets/{WorkerSetupPage-Cxv2yPLI.js → WorkerSetupPage-QfPSikXC.js} +1 -1
  121. package/public/assets/{agent-type-options-CuEUrpd3.js → agent-type-options-D5TWJHLL.js} +1 -1
  122. package/public/assets/{arrow-left-DOpqosft.js → arrow-left-DB4r4i1M.js} +1 -1
  123. package/public/assets/{arrow-right-CNUsZnIR.js → arrow-right-D2JA1tPb.js} +1 -1
  124. package/public/assets/{bot-BaIIvmh0.js → bot-DxIEfbm7.js} +1 -1
  125. package/public/assets/{chevron-down-BKGOt_gM.js → chevron-down-DfH1OlZR.js} +1 -1
  126. package/public/assets/{chevron-left-i2pNLJ7H.js → chevron-left-HX8XUd9Z.js} +1 -1
  127. package/public/assets/{chevron-right-D45D0HpI.js → chevron-right-QFYBmRJj.js} +1 -1
  128. package/public/assets/{chevron-up-Bd6Oui4J.js → chevron-up-BKrbfyCk.js} +1 -1
  129. package/public/assets/{circle-alert-ClJNCLug.js → circle-alert-DkXfme-N.js} +1 -1
  130. package/public/assets/{clock-yzYGdAPO.js → clock-BesNqyTN.js} +1 -1
  131. package/public/assets/{copy-mNrO3LXa.js → copy-DYDGVR2b.js} +1 -1
  132. package/public/assets/{download-DDHXuzR3.js → download-4aSi3sMZ.js} +1 -1
  133. package/public/assets/{external-link-cxXMgt6V.js → external-link-CgFswils.js} +1 -1
  134. package/public/assets/{git-fork-BGP19woV.js → git-fork-DkBwDY6U.js} +1 -1
  135. package/public/assets/{index-D1osv3VP.css → index-B40ZH6vh.css} +1 -1
  136. package/public/assets/{index-CuZrCrRX.js → index-OBVbDpAB.js} +2 -2
  137. package/public/assets/{key-C__WciFk.js → key-Kz42y-uQ.js} +1 -1
  138. package/public/assets/{loader-circle-dFBBOOuB.js → loader-circle-Dy8GY3V5.js} +1 -1
  139. package/public/assets/{pencil-C61WAtwR.js → pencil-3qtLy37N.js} +1 -1
  140. package/public/assets/{play-BHSy19KT.js → play-CU_iG5kJ.js} +1 -1
  141. package/public/assets/{plus-DXUBGb2Z.js → plus-D8LQpkpb.js} +1 -1
  142. package/public/assets/{rotate-ccw-DWFriik8.js → rotate-ccw-_DB8ITHt.js} +1 -1
  143. package/public/assets/{scroll-text-B_kZuKoH.js → scroll-text-EAFmJm7K.js} +1 -1
  144. package/public/assets/{settings-C72xeZrh.js → settings-CZcnVo6Q.js} +1 -1
  145. package/public/assets/{skip-forward-D5_4gYCC.js → skip-forward-mTKsd11B.js} +1 -1
  146. package/public/assets/{status-colors-Bq7c453S.js → status-colors-DripE1Ev.js} +1 -1
  147. package/public/assets/{task-agent-DnayHp_f.js → task-agent-DuXLBDpr.js} +1 -1
  148. package/public/assets/{task-constants-CeedMrvc.js → task-constants-_gH05-lN.js} +1 -1
  149. package/public/assets/{task.store-BxwSVv-p.js → task.store-BfXY08-9.js} +1 -1
  150. package/public/assets/{timer-BFpvSXFd.js → timer-BrmpjJhI.js} +1 -1
  151. package/public/assets/{trash-2-5FJOu4Ud.js → trash-2-DoiDLdk5.js} +1 -1
  152. package/public/assets/{useFetch-CoPiRYNS.js → useFetch-BJHAN5c6.js} +1 -1
  153. package/public/assets/{users-BI6dc6Ci.js → users-D_2oemG4.js} +1 -1
  154. package/public/assets/{wifi-Ooku276B.js → wifi-CanKStX-.js} +1 -1
  155. package/public/assets/{workflow-CvwIjZCH.js → workflow-BDFil6MC.js} +1 -1
  156. package/public/assets/{zap-Cv_baXfa.js → zap-DhI_j1gt.js} +1 -1
  157. package/public/index.html +2 -2
  158. package/public/sw.js +1 -1
  159. package/public/assets/ChangelogPage-Dh-ZKMy7.js +0 -1
  160. package/public/assets/Checkbox-CZd7073E.js +0 -1
  161. package/public/assets/TaskDetailPage-DRc65k88.js +0 -21
@@ -1,4 +1,4 @@
1
- import{j as e}from"./index-CuZrCrRX.js";import{a as t}from"./DocsPrimitives-Beo_PA0s.js";import"./copy-mNrO3LXa.js";const c=[{command:"develop",alias:"dev",example:'@bot develop "fix login bug" --project WEB',description:"create a new task"},{command:"develop",alias:"dev",example:'@bot develop "fix login bug" --agent cursor',description:"create a task with specific agent"},{command:"develop",alias:"dev",example:'@bot develop "fix login bug" --type fix --branch fix-login',description:"specify task type and branch slug"},{command:"develop",alias:"dev",example:'@bot develop "deploy" --on worker-1',description:"create a task on a specific worker"},{command:"show",alias:"progress / logs / workspace / ws",example:"@bot show #42",description:"view task details"},{command:"cancel",alias:"",example:"@bot cancel #42",description:"cancel a running task"},{command:"retry",alias:"",example:"@bot retry #42",description:"retry a failed/cancelled task"},{command:"fork",alias:"",example:"@bot fork #42",description:"fork a completed/failed/cancelled task"},{command:"fork",alias:"",example:"@bot fork #42 --agent codex",description:"fork with a different agent"},{command:"fork",alias:"",example:'@bot fork #42 "extra detail"',description:"fork and append extra detail to the original description"},{command:"fork",alias:"",example:'@bot fork #42 "new desc" --replace',description:"fork and replace the original description"},{command:"list",alias:"ls",example:"@bot list --project WEB",description:"list recent tasks"},{command:"confirm",alias:"",example:"@bot confirm #42",description:"confirm a pending stage"},{command:"projects",alias:"proj",example:"@bot projects",description:"list your projects"},{command:"status",alias:"",example:"@bot status",description:"show cluster status"},{command:"workers",alias:"",example:"@bot workers",description:"list all workers (admin only)"},{command:"search",alias:"",example:"@bot search login",description:"search tasks, workers, projects"},{command:"bind",alias:"",example:"@bot bind",description:"link your chat account to your overlord account"},{command:"info",alias:"",example:"@bot info",description:"show chat id, user id, and link status"},{command:"help",alias:"",example:"@bot help",description:"show available commands"}];function o(){return e.jsx("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// overview"}),e.jsxs("p",{className:"mt-2 text-xs text-[var(--text-muted)]",children:["overlord supports creating tasks via chat bots. users can ",e.jsx("code",{className:"text-[var(--accent)]",children:'@bot develop "fix the login bug"'})," in a group chat, and overlord dispatches the task automatically. notifications are sent back through the same channel."]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// lark setup"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> 1. create a lark app"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["on ",e.jsx("span",{className:"text-[var(--text-secondary)]",children:"lark open platform"})," (open.larksuite.com) → custom app:"]}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— note the ",e.jsx("span",{className:"text-[var(--accent)]",children:"app id"})," and ",e.jsx("span",{className:"text-[var(--accent)]",children:"app secret"})]}),e.jsxs("li",{children:["— event subscriptions: ",e.jsx("code",{className:"text-[var(--accent)]",children:"im.message.receive_v1"})]}),e.jsxs("li",{children:["— event request url: ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:"https://your-overlord-server.com/webhook/lark"})]}),e.jsxs("li",{children:["— callback configuration → request url: ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:"https://your-overlord-server.com/webhook/lark"})]}),e.jsx("li",{children:"— enable bot capability"}),e.jsxs("li",{children:["— permissions: ",e.jsx("code",{className:"text-[var(--accent)]",children:"im:message.group_at_msg:readonly"}),", ",e.jsx("code",{className:"text-[var(--accent)]",children:"im:message.p2p_msg:readonly"}),", ",e.jsx("code",{className:"text-[var(--accent)]",children:"im:message:send_as_bot"})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> 2. register in overlord"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"via admin → bot management → add bot, or via the api:"}),e.jsx(t,{code:`curl -X POST https://your-server:9000/api/admin/bots \\
1
+ import{j as e}from"./index-OBVbDpAB.js";import{a as t}from"./DocsPrimitives-Sl_VYTFo.js";import"./copy-DYDGVR2b.js";const c=[{command:"develop",alias:"dev",example:'@bot develop "fix login bug" --project WEB',description:"create a new task"},{command:"develop",alias:"dev",example:'@bot develop "fix login bug" --agent cursor',description:"create a task with specific agent"},{command:"develop",alias:"dev",example:'@bot develop "fix login bug" --type fix --branch fix-login',description:"specify task type and branch slug"},{command:"develop",alias:"dev",example:'@bot develop "deploy" --on worker-1',description:"create a task on a specific worker"},{command:"show",alias:"progress / logs / workspace / ws",example:"@bot show #42",description:"view task details"},{command:"cancel",alias:"",example:"@bot cancel #42",description:"cancel a running task"},{command:"retry",alias:"",example:"@bot retry #42",description:"retry a failed/cancelled task"},{command:"fork",alias:"",example:"@bot fork #42",description:"fork a completed/failed/cancelled task"},{command:"fork",alias:"",example:"@bot fork #42 --agent codex",description:"fork with a different agent"},{command:"fork",alias:"",example:'@bot fork #42 "extra detail"',description:"fork and append extra detail to the original description"},{command:"fork",alias:"",example:'@bot fork #42 "new desc" --replace',description:"fork and replace the original description"},{command:"list",alias:"ls",example:"@bot list --project WEB",description:"list recent tasks"},{command:"confirm",alias:"",example:"@bot confirm #42",description:"confirm a pending stage"},{command:"projects",alias:"proj",example:"@bot projects",description:"list your projects"},{command:"status",alias:"",example:"@bot status",description:"show cluster status"},{command:"workers",alias:"",example:"@bot workers",description:"list all workers (admin only)"},{command:"search",alias:"",example:"@bot search login",description:"search tasks, workers, projects"},{command:"bind",alias:"",example:"@bot bind",description:"link your chat account to your overlord account"},{command:"info",alias:"",example:"@bot info",description:"show chat id, user id, and link status"},{command:"help",alias:"",example:"@bot help",description:"show available commands"}];function o(){return e.jsx("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// overview"}),e.jsxs("p",{className:"mt-2 text-xs text-[var(--text-muted)]",children:["overlord supports creating tasks via chat bots. users can ",e.jsx("code",{className:"text-[var(--accent)]",children:'@bot develop "fix the login bug"'})," in a group chat, and overlord dispatches the task automatically. notifications are sent back through the same channel."]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// lark setup"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> 1. create a lark app"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["on ",e.jsx("span",{className:"text-[var(--text-secondary)]",children:"lark open platform"})," (open.larksuite.com) → custom app:"]}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— note the ",e.jsx("span",{className:"text-[var(--accent)]",children:"app id"})," and ",e.jsx("span",{className:"text-[var(--accent)]",children:"app secret"})]}),e.jsxs("li",{children:["— event subscriptions: ",e.jsx("code",{className:"text-[var(--accent)]",children:"im.message.receive_v1"})]}),e.jsxs("li",{children:["— event request url: ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:"https://your-overlord-server.com/webhook/lark"})]}),e.jsxs("li",{children:["— callback configuration → request url: ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:"https://your-overlord-server.com/webhook/lark"})]}),e.jsx("li",{children:"— enable bot capability"}),e.jsxs("li",{children:["— permissions: ",e.jsx("code",{className:"text-[var(--accent)]",children:"im:message.group_at_msg:readonly"}),", ",e.jsx("code",{className:"text-[var(--accent)]",children:"im:message.p2p_msg:readonly"}),", ",e.jsx("code",{className:"text-[var(--accent)]",children:"im:message:send_as_bot"})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> 2. register in overlord"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"via admin → bot management → add bot, or via the api:"}),e.jsx(t,{code:`curl -X POST https://your-server:9000/api/admin/bots \\
2
2
  -H "Authorization: Bearer $TOKEN" \\
3
3
  -H "Content-Type: application/json" \\
4
4
  -d '{
@@ -0,0 +1 @@
1
+ import{j as e}from"./index-OBVbDpAB.js";const s=[{version:"1.0.165",date:"2026-03-28",sections:[{title:"features",items:["Interactive confirm/reject buttons on stage confirmation cards (Lark/Slack)","Review button on completed develop task cards","Single-reviewer auto-fix (no manual confirmation needed)","Review task completion cards show findings summary","Review agent auto-inferred from source task"]},{title:"fixes",items:["Unified permissions across web and platform (owner + executor + admin)","Skip stage button only visible when task is SUSPENDED","Checkbox check icon visibility fixed","Automation terminal noise filtered from findings","Dismissed reviews skip auto-fix"]}]},{version:"1.0.164",date:"2026-03-26",sections:[{title:"features",items:["Bot notifications show task mode (develop/plan/review/automation)","ChatBinding notify_default setting for notification routing","Structured automation findings with summary/highlights/watchlist","Automations inbox shows project, task status, worker"]},{title:"fixes",items:["Bot silent on mention-only group chat messages","Plan spec push cleans up remote temp branch and logs result","CI digest uses valid critical severity instead of error","Automation highlights prioritized by severity before truncation","Token refresh retry before session expired popup"]}]},{version:"1.0.163",date:"2026-03-26",sections:[{title:"features",items:["Automations inbox shows project, task status, and worker name","Per-project notify-default chat for automation summaries in bot bindings"]},{title:"fixes",items:["Long natural-language task descriptions no longer truncated by NLU","SQL ambiguous column error on automation run status filter","Token refresh retries once before showing session expired","Standup and automation findings now parse structured output instead of showing raw JSON blobs"]}]},{version:"1.0.162",date:"2026-03-25",sections:[{title:"fixes",items:["ChatBindingModal height constrained with scrollable body"]}]},{version:"1.0.161",date:"2026-03-25",sections:[{title:"improvements",items:["Deduplicated notification helpers and group chat DM logic","Unified findings count across all automation pages","Automation tasks excluded from dashboard statistics"]}]},{version:"1.0.160",date:"2026-03-25",sections:[{title:"features",items:["Group chat tasks now send personal DM to creator","Reply hint on stage confirmation cards (chat platforms)","Automation notifications as structured cards with color coding","PlanPage confirm dialog for suspended plan tasks","Pipeline MR defaults to draft mode with auto-delete source branch"]},{title:"fixes",items:["Slack fallback text uses full notification content","Slack slash command group chat detection fixed","PlanPage confirm button gated on actual pending confirmation","Card field truncation for oversized findings/errors","Auto-expand nested JSON findings in notifications and web UI","Reply hint kept in card only, not in web/CLI text"]}]},{version:"1.0.159",date:"2026-03-25",sections:[{title:"fixes",items:["Card message quoting now works correctly (retry/cancel/show via quoted card)"]}]},{version:"1.0.158",date:"2026-03-25",sections:[{title:"features",items:["Infer taskId from quoted card messages for retry/cancel/show/confirm commands","Mode filter on tasks page","Multi-word unquoted descriptions now work with develop command"]},{title:"fixes",items:["NLU LLM timeout increased from 10s to 60s","Full-width colon support in taskType prefix (feat:xxx)","Avoid duplicate failed notifications in direct chats"]}]},{version:"1.0.157",date:"2026-03-25",sections:[{title:"features",items:["Mobile review page: two-line pending task layout with worker name display","Mobile nav: removed Plan tab, added +plan button to review page"]},{title:"fixes",items:["Quoted-only replies now prompt for task description instead of silent ignore","Truncate long worker names in review pending task row"]},{title:"improvements",items:["Removed dead nluResolvedFromQuote field from NLU fallback interface","Help text clarifies that quoted replies still need a command or description"]}]},{version:"1.0.156",date:"2026-03-24",sections:[{title:"improvements",items:["Review report parsing: support RESULT marker, cleanOutput fallback, fenced JSON, bare JSON extraction; malformed reports surface as warning issue","Review pipeline prompt uses RESULT progress marker instead of deprecated review_report frame","Confirm timeout end-to-end: stage config timeout flows through onConfirmRequest and Redis TTL"]}]},{version:"1.0.155",date:"2026-03-24",sections:[{title:"features",items:["Automation findings extraction: readonly and writable automations extract findings from agent output; readonly falls back to raw output when no RESULT marker","Automation text-only notifications: completion and failure notifications send plain text with findings; automation tasks no longer emit task lifecycle notifications"]},{title:"improvements",items:["Writable automations merge MR link finding with worker-reported findings","Notification text truncated to 3000 chars; readonly raw-output fallback detail capped at 4000 chars","All notification delivery paths handle card:null by sending text","Removed dead hasFindings/findingsCount fields from event payload"]},{title:"fixes",items:["Fix Lark quote fetch blocking message on permission error — now gracefully degrades without quoted content","Fix writable automation findings pollution: raw terminal output no longer overwrites structured findings","Remove description tooltip overlay on automation detail page"]}]},{version:"1.0.154",date:"2026-03-24",sections:[{title:"features",items:["Multi-project automations: Automations can now target multiple projects via projectKeys[] with new MultiSelect component",'Worker tasks pagination: Renamed "current tasks" to "tasks" with pagination on worker detail page']},{title:"improvements",items:["Docs nav: add changelog tab to horizontal tab bar","Automation detail: shorten notify labels, nowrap trigger button","Daily bug scan template: simplify phase scoped to files with actual fixes only"]},{title:"fixes",items:["Replace /simplify skill reference in bug scan template with inline instructions",'Fix "in 0m" edge case in formatFutureTime (now shows "in <1m")',"Unify AutomationEditPage dropdowns with custom Select component","Automation detail page UI polish: description truncation, button styles, timezone display","Fix automation toggle switch style, next run time display"]}]},{version:"1.0.153",date:"2026-03-24",sections:[{title:"fixes",items:["Fix workspace:* references in package.json preventing npm install"]}]},{version:"1.0.152",date:"2026-03-24",sections:[{title:"fixes",items:["Fix workspace:* references in package.json preventing npm install"]}]},{version:"1.0.151",date:"2026-03-24",sections:[{title:"features",items:["Automation template overhaul: 30 builtin templates across 6 categories, template browser UI with one-click create dialog, agent defaults follow project config","Remove mobile companion mode: Unified PtyTerminal everywhere, removed ~1400 lines of companion code","Bot notifications restricted to creator + source chat: Removed project chat fan-out to reduce noise","Enriched task_created notification: Full-detail card with description, project name, queue info via notification pipeline","Web changelog page: Complete version history with navigation"]},{title:"improvements",items:["Cursor/Codex prompt detection tightened to prevent false idle completion","PtyTerminal: token fetch retry with exponential backoff, keystroke buffering during takeover","Automation template dialog: agent type follows project default, long content scrolling","Migration 015: safely preserves custom template→automation links during category taxonomy change"]},{title:"fixes",items:["Fix suspended notification docs method column","Fix task_failed test missing assertion","Preserve source-chat ack for delegated task creation","Keep Slack slash command response_url path"]}]},{version:"1.0.150",date:"2026-03-24",sections:[{title:"fixes",items:["Fix Claude prompt detection: remove bypass permissions from negative filter, detect › (U+203A) prompt character, use multiline matching for status bar below prompt","Auto-dismiss Claude theme selection prompt on first launch in new worktree HOME"]}]},{version:"1.0.149",date:"2026-03-24",sections:[{title:"fixes",items:["Detect Claude prompt character › (U+203A) used in Claude Code 2.1.x, multiline regex for > prompt with status bar below"]}]},{version:"1.0.148",date:"2026-03-24",sections:[{title:"fixes",items:["Auto-dismiss Claude theme selection prompt on first launch"]}]},{version:"1.0.147",date:"2026-03-24",sections:[{title:"fixes",items:["Detect Claude > prompt with multiline flag when status bar follows, match bypass permissions as prompt-ready signal"]}]},{version:"1.0.146",date:"2026-03-23",sections:[{title:"fixes",items:["Initialize database in constructor instead of onModuleInit to prevent startup crashes when NestJS module init ordering changes"]}]},{version:"1.0.145",date:"2026-03-23",sections:[{title:"features",items:["Automations system: Cron and task_event triggers, execution lock with UUID ownership, Inbox with badge, template library, findings reporting, seed data","Bot/CLI `--target-branch`: Specify MR target branch for develop and plan commands","Bot notification Agent field: Task notification cards now show which agent type was used","Plan mode spec push: Automatically push spec document to defaultBranch after document stage, with docs/specs/ path safety check"]},{title:"improvements",items:['Auth error detection: Split patterns into startup-only ("Authentication failed") and runtime-safe ("Invalid API key", etc.) — prevents false kills from git/tool auth errors during pipeline execution',"Modal close behavior: Prevent accidental close via ESC/backdrop on form modals; confirm dialogs keep ESC as cancel; SessionExpiredDialog allows refresh; auto-focus for keyboard accessibility","Terminal Enter key: Fix takeover Enter not working (termReady state); IME composition compatibility","Automation correctness: Atomic cron updates (schedule before DB), Redis lock with Lua CAS, timezone-aware template variables, dedup bypass, base64 cursor parsing, IANA timezone validation, cron schedule restoration on failure","Automation real-time: Inbox live refresh via WebSocket, abort/dedup on fetchRuns, reconnect reload, SKIPPED run events, badge count for all unread runs, inbox status broadcast on read/archive","Plan confirm flow: SPEC_PUSH_FAILED prompt surfaces in Web UI dialog, inline banner, and bot notifications; rebase --abort cleanup on failure","Test coverage: 163 automation tests (scheduler, validation, templates, controller, executor, trigger) + 17 source file coverage improvements","Documentation: Bot commands (reject, plan, review, NLU, latest-task), environment variables (NLU), stage confirmation via text commands"]},{title:"fixes",items:["Fix false `binary_missing` detection — only during agent startup, not pipeline execution","Fix cron-to-cron update leaving old repeatable active — removeJob before registerJob","Fix removeJob errors silently swallowed — now propagate, DB unchanged on failure","Fix plan confirm gate timing — always route through push-aware path regardless of push completion order","Fix automation run detail page not refreshing (subscribe to eventSeq for non-terminal runs)","Fix automation detail page stale after reconnect (subscribe to eventWs.onStatus)","Fix ListAutomationRunsQuery.cursor type from number to string (matches wire format)"]}]},{version:"1.0.144",date:"2026-03-23",sections:[{title:"fixes",items:["Fix `workspace:*` reference in server package.json that broke npm install","Remove invalid `stage_change` SSE event check from TaskDetailPage"]}]},{version:"1.0.143",date:"2026-03-23",note:"broken — use 1.0.144",sections:[{title:"features",items:['"Last task" shortcut — reference latest task via `last`/`latest`/`上一个` in bot commands, stored in Redis with 7-day TTL',"Review page project and developer filters across all tabs (pending/in-progress/history)","Cursor-based pagination for Review page with server-side source task grouping","Notify task creator when review round completes (when creator differs from executor)","Review list hover tooltips showing source task description","Bot command flags are now case-insensitive (`--Project`, `--AGENT`, etc.)","Bot confirm/reject commands for stage confirmations via reply","NLU intent detection on quoted message replies","Project key normalization — forced lowercase across all read/write paths"]},{title:"fixes",items:["Pipeline stage display: plan shows analyze→discuss→document→confirm, review shows review→report→fix","Added missing `rebase` stage to pipeline docs page","Stage monitor auto-pauses `requireConfirm` stages when agent skips `WAIT_CONFIRM` marker","Fixed re-confirm loop: approved stages no longer re-enter `waiting_confirm` on subsequent `DONE`",'Review notification "no issues found" — re-read round data before aggregating issue counts',"Review tab developer filter now matches source task assignee, not review launcher","Terminal page input no longer loses focus on task list refresh","Pagination StrictMode compatibility — pure state updaters using refs","Review command cache write is now best-effort (Redis errors don't fail successful commands)","Latest-task description preservation — position-based token skip prevents stripping words from descriptions"]},{title:"improvements",items:["Extracted shared NLU fallback logic into `nlu-fallback.utils.ts` (Lark/Slack dedup)","Unified dispatcher develop/plan into `handleCreateTaskCommand` + `handleTaskError`","Extracted `ENRICHED_SELECT` constant for task repository SQL queries","Extracted `useCursorPagination` hook for Review page","Mobile review button shows icon only, text on desktop","Updated test coverage spec with fresh baseline data"]}]},{version:"1.0.142",date:"2026-03-22",sections:[{title:"fixes",items:["Fix false `binary_missing` detection during pipeline execution — `command not found` from agent-run commands (e.g. missing tools like `make`, `yarn`) no longer kills the task. Detection now only applies during agent startup before the prompt is detected."]}]},{version:"1.0.141",date:"2026-03-22",sections:[{title:"features",items:["Plan Mode: Interactive planning sessions that produce spec documents, with decompose-or-save decision point","Review Mode: Cross-model parallel code review with structured reports, round tracking, and optional fix stage","Review-only mode: Skip fix stage with `skipFix` option for report-only reviews","Default reviewers: Project-level `defaultReviewers` config, `--agent` flag optional in CLI/bot","sourceCommitSha pinning: Reviews pin to the exact commit the develop task completed at","Aggregated fix feedback: Fix agent receives all review reports from the round, not just its own","Bot notifications: Review round completion notifications pushed to source chat platform","CLI commands: `ov task plan` and `ov task review` with full flag support","NLU support: Natural language parsing for plan and review bot commands","Web UI: Plan page, Review page, Review aggregate page with progress/report views, embedded PTY terminals","Navigation: Plan and Review in sidebar under `// loop` section, mobile nav updated","Task detail: TaskMode badge, full relation chain visualization (plan→develop→review), Launch Review button"]},{title:"improvements",items:["Durable review history: `review_report` and `review_round` persisted to DB with Redis→DB fallback","Round-scoped approveFix/skipFix: concurrent review rounds no longer interfere","Platform-aware branch validation: GitLab/GitHub/Gitea API support for source branch existence check",'`plan_decompose` confirm type with proper pipeline termination on "save only"',"`code_review` rejection terminates worker immediately (emits `pipeline_completed`)","SUSPENDED→RUNNING transition on stage confirm approval","Composite database indexes: `(project_key, task_mode, status)` and `(task_mode, status)`","Schema constraints: UNIQUE on `projects.repo_url`, partial UNIQUE on `projects.is_default`","Migration 012 fails fast on dirty data with actionable diagnostic queries","Maintainer project updates restricted from admin-only fields (repoUrl, isDefault)","PTY stage responses switched from Chinese to English","Review report JSON.parse wrapped in try/catch to prevent 500 on malformed data","React hooks ordering fix in ReviewAggregatePage (useMemo before early returns)","Round `expectedCount` prevents early completion when workers report before all tasks are created"]},{title:"fixes",items:["NLU: preserve project key casing, restore Slack help for unlinked users","Review: block review of non-develop tasks, validate agent types, reject temporary branches","Review: fix commitSha captured on all completion paths, updated on source task after fix","Dispatcher: PLAN/REVIEW command handlers with proper bot response rendering","Worker: `ReviewReportFrame.taskId` changed from string to number for protocol consistency"]}]},{version:"1.0.140",date:"2026-03-21",sections:[{title:"features",items:['Mobile dashboard UI: rename "Worker Status" to "Workers", add back buttons to Workers/Projects/ProjectDetail pages',"ProjectDetailPage: responsive card layout for members and tasks tables on mobile","Support `--worker` and `--machine` as aliases for `--on` in bot develop command"]},{title:"fixes",items:["Consolidate takeover controls, remove duplicate denial message","Prevent mobile keyboard from collapsing companion terminal layout"]}]},{version:"1.0.139",date:"2026-03-21",sections:[{title:"features",items:["Add Claude auth preflight check to fail fast on expired credentials instead of 180s timeout"]},{title:"fixes",items:["Consolidate takeover controls: remove duplicate hand button from terminal header, keep only TakeoverStatusBar","TakeoverStatusBar: icon-only buttons (Hand for take over, RotateCcw for restore) — no text",'Remove duplicate "takeover denied" message in companion terminal',"Prevent mobile keyboard from collapsing companion terminal layout","Sync fork `--replace/-r` and `--agent` flags across help text and bot-usage docs"]}]},{version:"1.0.138",date:"2026-03-21",sections:[{title:"fixes",items:["Deduplicate mobile terminal status info: hide stage/agent/worker from toolbar on mobile, show in dedicated row below","Merge mobile status row and stage progress into one compact section","Sync fork `--replace/-r` short form and `--agent` flag across help text and bot-usage docs"]}]},{version:"1.0.137",date:"2026-03-21",sections:[{title:"features",items:["Multi-project chat bindings: a single chat room can now associate with multiple Overlord projects with default selection","Fork command enhancements: `--replace` flag for description replacement, `--agent` flag for agent type override","Mobile companion terminal with lightweight text streaming, takeover controls, and full-terminal fallback","Companion terminal stream reducer for ANSI-stripped text rendering","Auto-skip Codex update prompts during agent startup"]},{title:"improvements",items:["Upgrade xterm to v6","Switch internal package references to workspace:* for better monorepo DX","Deduplicate ForkDescriptionMode type across server files into protocol package","Remove redundant type aliases (TaskWithTargetBranch, ForkCommandArgs, etc.)","Rename detectTrustPrompt to detectStartupPrompt with tighter update prompt regex","Use matchMedia API for mobile viewport detection (only fires on breakpoint crossing)","Add agentType runtime validation to fork endpoint and chat bot handler","Stabilize sidebar collapse user card layout"]},{title:"fixes",items:["Fix migration 009 is_default uniqueness: only mark first binding per (bot, chat) as default to prevent UNIQUE constraint failure on upgrade","Fix cross-platform chat routing by adding platform filter to findBindingByChatId","Fix CompanionTerminal infinite retry: exponential backoff with max 5 attempts","Scope worker binary_missing detection to recent stage output to prevent stale error misclassification","Eliminate TOCTOU race in createBinding by relying on DB constraints","Cancel stale xterm open frames and skip mobile PTY sessions for finished tasks","Surface ChatBindingModal removeBinding errors instead of silent catch","Harden mobile terminal takeover flows and session race conditions"]}]},{version:"1.0.136",date:"2026-03-20",sections:[{title:"features",items:["Support task-level target branches for version branch workflows","Add auto/default agent selection in the terminal task form","Show pipeline stage labels in task status displays"]},{title:"improvements",items:["Improve worker diagnostics and retry branch detection","Extract branch slug helpers into the protocol package for shared reuse"]},{title:"fixes",items:["Preserve Rust toolchain state in worktree environments so agent-executed `cargo` commands keep working","Separate source and target branch handling in the scheduler and task submit flow","Fall back to a fresh branch when an expected remote branch no longer exists","Send a newline when confirming Claude bypass-permissions prompts","Redirect legacy token settings routes and prompts to `/access-tokens`","Remove the extra `//` prefix from mobile status text"]}]},{version:"1.0.135",date:"2026-03-20",sections:[{title:"features",items:["Refresh worker capabilities at runtime and push immediate heartbeat updates when agent availability changes"]},{title:"improvements",items:["Smooth the desktop sidebar collapse animation and reorder bot help agent output"]},{title:"fixes",items:["Detect stripped Claude bypass prompts so permission confirmation is still auto-accepted","Keep runtime capability changes visible without restarting workers after installing new agents"]}]},{version:"1.0.134",date:"2026-03-20",sections:[{title:"features",items:["Add worker capability degradation tracking with UI badges, worker detail visibility, and manual restore controls","Add a task detail overview tab and mobile dashboard project section"]},{title:"improvements",items:["Reorder and relabel agent type options, shorten UI labels, and remove unused translation keys","Refactor MR URL parsing helpers, worker detail components, and task detail subcomponents for cleaner shared behavior"]},{title:"fixes",items:["Preserve generic stage `RESULT` payloads while sanitizing MR URLs, including TUI line-wrap and rendering artifact cases","Persist capability degradation state across server restarts and prevent stale task completions from clearing newer degradations","Recompute capability auto-recovery timing after repeated degraded failures and persist fallback agent selection into task config snapshots","Accurately label task descriptions, remove the worker port from detail pages, and continue symlink setup after recoverable filesystem errors"]}]},{version:"1.0.133",date:"2026-03-19",sections:[{title:"fixes",items:["Prevent Claude trust dialogs from being mistaken for ready prompts, and harden Cursor/Codex ready detection against trust or login transcripts"]},{title:"improvements",items:["Add regression tests using real stripped PTY transcripts for Claude, Cursor, and Codex trust/login flows"]}]},{version:"1.0.132",date:"2026-03-19",sections:[{title:"features",items:["Show agent type and running worker name in task details","Reorganize the desktop sidebar into tasks and management sections"]},{title:"improvements",items:["Reduce platform notifications to key lifecycle events","Lock the PWA to portrait orientation and remove the redundant mobile dashboard title"]},{title:"fixes",items:["Restore `--on` as a worker alias and resolve worker names to IDs","Let Codex shells inherit env vars for GitLab auth and align Codex flags with the current CLI","Auto-accept Claude bypass-permissions prompts and restore trust-prompt guarding","Raise the worker disk auto-drain threshold from 90% to 95%","Reply with explicit error messages when Lark and Slack bot commands fail"]}]},{version:"1.0.131",date:"2026-03-19",sections:[{title:"features",items:["Add a `rebase` stage before `submit` in the default pipeline"]},{title:"fixes",items:["Restore execute permissions on macOS `node-pty` spawn-helper binaries to avoid `posix_spawnp failed`","Isolate Claude and Codex config handling inside worktree homes while preserving real user auth state","Detect Cursor CLI login bootstrap flows as `auth_failure`","Use a model-agnostic ready-state pattern for Codex prompt detection","Remove the extra slash from the mobile dashboard title"]}]},{version:"1.0.130",date:"2026-03-19",sections:[{title:"fixes",items:["Use bracketed paste only for Cursor/Codex prompt injection while keeping Claude on plain PTY writes"]},{title:"improvements",items:["Add agent-specific PTY prompt writer test coverage for Claude, Cursor, and Codex"]}]},{version:"1.0.129",date:"2026-03-19",sections:[{title:"fixes",items:["Soften worker project affinity so new workers can receive a first task without losing reuse preference for familiar projects","Make `overlord doctor` aware of worker-only installs and validate worker connectivity via local health checks","Defer adapter registration to `onModuleInit` to avoid startup ordering races","Preserve terminal content while typing on the terminal home page","Skip unpushed source branches when dispatching forked tasks","Handle blank task display names safely","Wrap Claude PTY stdin writes in bracketed paste mode","Fix throttled source-branch fetch authentication","Fix branch ancestry and diagnostics regressions found in review"]}]},{version:"1.0.128",date:"2026-03-19",sections:[{title:"fixes",items:["URL-encode branch name segments in `buildBranchUrl` (fixes broken links for branches with `#`)","Reorder bot help commands to match documentation layout"]}]},{version:"1.0.127",date:"2026-03-19",sections:[{title:"fixes",items:["Enrich failed task notifications with project info (name, repo URL)","Notify DM and project chats on task failure (previously only completed tasks triggered these)","Preserve launchd PATH for worker CLI detection on macOS"]}]},{version:"1.0.126",date:"2026-03-19",sections:[{title:"fixes",items:["Revert Cursor/Codex `detectPrompt` to tail-search — last-line-only broke TUI detection because status bar text appears after the prompt character"]}]},{version:"1.0.125",date:"2026-03-18",sections:[{title:"features",items:["Server-side cursor pagination for task list (replace client-side fake pagination)","Display task execution time cost on completion","Show agent type in task cards","Show original task descriptions on hover","Show total task count in success rate chart tooltips","Deliver DM notifications for web-created tasks","Support retry and fork for cancelled tasks"]},{title:"fixes",items:["PTY relay WebSocket ping keepalive (prevent CDN idle disconnect)","PTY relay reconnect: fix listener leak (N+1x data) and missing stdin/resize handlers","Unify trust-prompt detection into single `detectTrustPrompt()` with agent-aware keystrokes","Tighten Codex `detectPrompt` to last-line only (prevent false positives)","Use active Node bin in PATH instead of scanning all nvm/fnm versions","Random worker selection when all candidates are lightly loaded","Accurate disk usage via `df` on Linux","sourceAppId passthrough for Lark/Slack message updates","Workspace root cleanup path validation"]},{title:"security",items:["Project access control for task mutations and project API","PTY and worker-channel gateway worker assignment validation","Workspace path traversal prevention in workspace-manager","Task store race condition fix with request-ID tracking","Stale WebSocket connection guard in worker-connection manager"]}]},{version:"1.0.124",date:"2026-03-18",sections:[{title:"fixes",items:["Update bot help text to show `--type`, `--agent`, `--branch` flags","Add 15 unit tests for `parseDevelop` and `buildHelpText`","Update bot-integration docs with new flags"]}]},{version:"1.0.123",date:"2026-03-18",sections:[{title:"fixes",items:["Fix Cursor Agent prompt detection — match `→` arrow prompt, not just `?`","Fix Codex prompt detection — search tail 500 chars for `>` instead of requiring end-of-string"]}]},{version:"1.0.122",date:"2026-03-18",sections:[{title:"features",items:["`overlord backup` / `overlord backup worker` — backup server/worker config and database","`overlord upgrade` now prompts to backup before upgrading (default: yes)","Auto-accept workspace trust prompts for Claude, Cursor, and Codex agents","Fork tasks base new branch on parent's branch (preserves parent commits)"]},{title:"fixes",items:["Fork tasks generate own branch name (`fix/#150-slug`) instead of inheriting parent's, avoiding git worktree conflicts",'Web UI loading text changed to "thinking..."',"CLI reference and deploy guide updated with backup commands"]}]},{version:"1.0.121",date:"2026-03-18",sections:[{title:"fixes",items:["Fix Cursor Agent `--trust` flag error — only valid in headless mode, removed from interactive PTY args"]}]},{version:"1.0.120",date:"2026-03-18",sections:[{title:"fixes",items:["Fix Cursor Agent auth failure — symlink `~/.config/cursor` and `~/.cursor` into worktree so agent finds login credentials when HOME is overridden","Log last 500 chars of PTY output when agent exits before prompt is detected, for easier startup failure diagnosis"]}]},{version:"1.0.119",date:"2026-03-18",sections:[{title:"fixes",items:["Fix `setup worker` deleting JWT unnecessarily — only remove when server URL or token actually changes, preventing re-registration failure when modifying non-auth settings like slots","Fix LLM base URL placeholder in install wizard — remove `/v1` suffix for Anthropic"]}]},{version:"1.0.118",date:"2026-03-18",sections:[{title:"features",items:["Fork command in developer CLI","`--agent`, `--branch`, `--type` flags for bot and CLI task creation","Agent CLI integration guide and web docs page"]},{title:"fixes",items:["Delta-based CPU sampling instead of boot-average for accurate hardware metrics","Align Cursor/Codex executor flags with CLI and Claude executor"]}]},{version:"1.0.117",date:"2026-03-18",sections:[{title:"features",items:["Fork task — create new task from completed/failed task, preserving branch and config (bot, web, API)","Queue position display — QUEUED tasks show position in bot cards, notifications, and web detail page","Dashboard improvements — merged active/queued stats, completed-by-you-today counter","Task page filters — project and developer dropdown filters","Chart tooltips — hover tooltips on Task Success Rate chart bars","Create task from existing — support specifying branch from another task"]},{title:"improvements",items:["Lazy-cached ky import in TaskNameService — avoids dynamic import on every LLM call","Extracted TaskNotificationExtra interface and getQueueInfoForTask helper","Optimized queue position queries","Unified developer field labels, added git name/email to edit modal"]},{title:"fixes",items:["Fix TS type narrowing for dashboard stat cards","Fix TS import type for ESM ky module in CJS context","Fix protocol CommandType member count test (15 with FORK)","Remove dead agentType field, catch ForbiddenException in fork","Fix banner color, mobile dashboard width alignment","Reset page on filter change, skip redundant fetch"]}]},{version:"1.0.116",date:"2026-03-17",sections:[{title:"features",items:['Native Anthropic Claude API support in TaskNameService — auto-detects based on LLM_BASE_URL containing "anthropic"',"Bot permission docs clarified for DM delivery"]}]},{version:"1.0.115",date:"2026-03-17",sections:[{title:"features",items:["Dynamic card header colors — Lark card headers now match task status (green=completed, red=failed, orange=suspended/interactive, grey=queued/cancelled)","AI-generated task names and branch slugs — TaskNameService generates concise display names","Notification routing with creator/executor split — executor gets DM, creator gets important events","Interactive stage cards — CHOOSE/INPUT stage modes with bot card actions","Stage confirm timeout — auto-fail tasks after Redis TTL expires","Lark/Slack sendDM — direct message delivery for private notifications","Simplify stage in default pipeline","Minimum task description length (20 chars) enforcement"]},{title:"improvements",items:["Extract shared status-display.ts — single source of truth for status colors/emojis with CardColor type safety","Consolidate progress/logs/workspace into unified show command","Refetch all data on WebSocket reconnect to prevent stale UI","Standardized WebSocket communication in submitChoice/submitInput methods","Enhanced input validation in TaskController endpoints"]},{title:"fixes",items:["Code hardening and docs consistency (3 rounds of deep review)","Fix failed event project chats column in web docs","Fix Lark updateMessage failure — rethrow so consumer falls back to new message","Handle NotFoundException/BadRequestException in retry and cancel commands","Send error feedback on Lark card action failure","Remove unused server_url setting"]}]},{version:"1.0.114",date:"2026-03-17",sections:[{title:"features",items:["Quote/reply message + @mention developer — Lark/Slack adapters support quoting messages as task descriptions and @mentioning developers for task assignment","Task completion bot notifications — send bot message to project-bound chats when tasks complete","Timezone-aware dashboard — statistics adjust to browser timezone","reuseWorkspace retry — retry tasks with option to skip worktree recreation","Custom Tooltip component — 100ms fast tooltips replace native title attributes","Helpful project hint — show available projects when develop command is missing project"]},{title:"improvements",items:["Extract shared parser utilities to `command-parser.utils.ts`","Extract shared help text to `help-text.ts`","Unify mention resolution pattern across Lark and Slack adapters","Remove custom agent type entirely (code, enums, docs, executor)","Cache timezone-aware stats with 60s TTL to reduce DB load","Reduce DB reads in progress handler (updateStage returns previous value)"]},{title:"fixes",items:["Fix branch URL double-slash when repoUrl ends with `/`","Fix mobile pipeline process section text clipping","Fix real-time status updates for workers and task stages (WebSocket currentStage push)","Fix ChatBindingModal bindings list not refreshing after add","Fix timezone offset range validation (max ±840 minutes)","Remove dead CHOOSE/INPUT parser code","Defer quote fetch to after command parsing (avoid wasted API calls)","Fix claude-executor test for simplified permission strategy"]}]},{version:"1.0.113",date:"2026-03-17",sections:[{title:"features",items:["Add reuseWorkspace option for retry to skip worktree recreation"]},{title:"fixes",items:["Address MR review issues for reuseWorkspace feature"]}]},{version:"1.0.112",date:"2026-03-17",sections:[{title:"features",items:["Add 7 new bot commands (projects, status, show, workers, search, choose, input) and remove drain/undrain","Fix ChatBindingModal refresh after successful add","Prevent mobile PTY terminal from jumping to top of page"]},{title:"fixes",items:["Add Lark and Slack controller unit tests","Fix async Lark message processing and Slack webhookToken decryption","Verify webhookToken is encrypted on create and update"]}]},{version:"1.0.111",date:"2026-03-17",sections:[{title:"fixes",items:["Encrypt webhookToken before storing in database"]}]},{version:"1.0.110",date:"2026-03-17",sections:[{title:"fixes",items:["Improve truncation consistency and responsive layout"]}]},{version:"1.0.109",date:"2026-03-17",sections:[{title:"fixes",items:["Handle Feishu encrypted webhook body with AES-256-CBC decryption","Use Encrypt Key for Lark webhook signature verification"]}]},{version:"1.0.108",date:"2026-03-16",sections:[{title:"features",items:["Task detail page improvements and responsive layout"]}]},{version:"1.0.107",date:"2026-03-16",sections:[{title:"features",items:["Pipeline editor and stage management"]}]},{version:"1.0.106",date:"2026-03-16",sections:[{title:"features",items:["Slack adapter integration"]}]},{version:"1.0.105",date:"2026-03-16",sections:[{title:"features",items:["Mobile adaptation and PWA install banner"]}]},{version:"1.0.104",date:"2026-03-16",sections:[{title:"features",items:["Bot configuration and docs center"]}]},{version:"1.0.103",date:"2026-03-16",sections:[{title:"fixes",items:["Viewport utility updates"]}]},{version:"1.0.102",date:"2026-03-16",sections:[{title:"fixes",items:["Viewport and layout adjustments"]}]},{version:"1.0.101",date:"2026-03-16",sections:[{title:"fixes",items:["Hardcode body background card values instead of reading CSS variables","PwaUpdateBanner polls every 30s, fix light mode background"]}]},{version:"1.0.100",date:"2026-03-16",sections:[{title:"fixes",items:["Align theme-color and manifest background_color with bg-card"]}]},{version:"1.0.99",date:"2026-03-16",sections:[{title:"fixes",items:["Revert to fixed inset-0 layout — h-dvh caused mobile layout issues"]}]},{version:"1.0.98",date:"2026-03-16",sections:[{title:"improvements",items:["Axiom-style layout — replace fixed inset-0 with h-dvh, add safe area nav wrapper"]},{title:"fixes",items:["Apply PWA body background after React render to get correct theme color","Revert bottom nav to 48px with items-center"]}]},{version:"1.0.97",date:"2026-03-16",sections:[{title:"fixes",items:["Make bottom nav more compact, reduce height from 48px to 40px","Remove debug banner, adapt PwaInstallBanner for light mode"]}]},{version:"1.0.96",date:"2026-03-16",sections:[{title:"fixes",items:["Apply body background via inline style for iOS PWA home indicator","Update main.tsx initialization"]}]},{version:"1.0.94",date:"2026-03-16",sections:[{title:"fixes",items:["Set no-cache headers for service worker files so browsers check for updates"]}]},{version:"1.0.93",date:"2026-03-16",sections:[{title:"fixes",items:["Use JS detection for PWA standalone mode instead of CSS media query","Fix storage event listener leak in useOnboardingData"]}]},{version:"1.0.92",date:"2026-03-16",sections:[{title:"fixes",items:["AppLayout safe-area adjustments"]}]},{version:"1.0.91",date:"2026-03-16",sections:[{title:"fixes",items:["AppLayout safe-area tweaks"]}]},{version:"1.0.90",date:"2026-03-16",sections:[{title:"fixes",items:["Safe-area layout adjustments"]}]},{version:"1.0.89",date:"2026-03-16",sections:[{title:"fixes",items:["Safe-area and global style adjustments"]}]},{version:"1.0.88",date:"2026-03-16",sections:[{title:"fixes",items:["Adjust bottom nav safe-area and global styles"]}]},{version:"1.0.87",date:"2026-03-16",sections:[{title:"fixes",items:["Add safe-area diagnostic overlay for iOS debugging"]}]},{version:"1.0.86",date:"2026-03-16",sections:[{title:"fixes",items:["Add SafeAreaDebug overlay for iOS safe-area diagnosis"]}]},{version:"1.0.85",date:"2026-03-16",sections:[{title:"fixes",items:["Let bottom nav extend into safe area via padding instead of fixed height","Set body background to bg-card in PWA standalone mode for home indicator area"]}]},{version:"1.0.84",date:"2026-03-16",sections:[{title:"fixes",items:["Move bottom nav safe-area handling from inline style to CSS class for iOS PWA"]}]},{version:"1.0.83",date:"2026-03-16",sections:[{title:"improvements",items:["Simplify stage-monitor mutation and PullToRefresh event handling"]},{title:"fixes",items:["Use env() directly for bottom safe area and add background fallback for tab bar gap"]}]},{version:"1.0.82",date:"2026-03-16",sections:[{title:"fixes",items:["Don't store completion message as errorMessage for COMPLETED tasks"]}]},{version:"1.0.81",date:"2026-03-16",sections:[{title:"fixes",items:["Update default pipeline stages to match actual DEFAULT_PIPELINE"]}]},{version:"1.0.80",date:"2026-03-16",sections:[{title:"fixes",items:["Normalize marker action to uppercase for case-insensitive regex match","Use fixed positioning instead of 100dvh to prevent iOS WebView bottom gap"]}]},{version:"1.0.79",date:"2026-03-16",sections:[{title:"features",items:["Add Skill tab to docs navigation bar","Support specifying agent type when creating tasks"]},{title:"fixes",items:["Case-insensitive marker regex, Chinese label resolution, CAS exception handling","Hoist module-level constants, fix test mock and TDZ in waitForActiveTasks","Move hooks before early return in LandingPage, fix TDZ risk in timer declarations","Handle task completion in progress handler for tasks stuck in RUNNING"]}]},{version:"1.0.78",date:"2026-03-16",sections:[{title:"features",items:["Improve sidebar nav and fix mobile UI issues"]},{title:"fixes",items:["Detect task completion when agent doesn't output OVERLORD markers","Force TUI redraw after page refresh via resize trick","Add Google Fonts to CSP connect-src, update deprecated meta tag","Use Hand icon instead of Zap for take over button","Replace snake_case labels with i18n keys in pipeline sidebar","Propagate MR URL from stage monitor through progress frame to task table"]},{title:"documentation",items:["Add IDE tunnel team setup guide with GitHub auth and shared account"]}]},{version:"1.0.77",date:"2026-03-16",sections:[{title:"features",items:["Add placeholder message behind blank terminal canvas"]},{title:"fixes",items:["Only match vscode.dev URLs for tunnel, skip license/docs URLs","Correct VS Code CLI download URL in deploy guide"]},{title:"documentation",items:["Add links for AI agent CLIs and VS Code CLI in prerequisites"]}]},{version:"1.0.76",date:"2026-03-16",sections:[{title:"features",items:["Make branch name a clickable link to the git platform branch page"]},{title:"improvements",items:['Rename "cursor tunnel" to "IDE tunnel" across codebase']},{title:"fixes",items:["Show toast with error message when tunnel start fails","Add worktree .local/bin to PTY PATH and document VS Code CLI setup"]}]},{version:"1.0.75",date:"2026-03-16",sections:[{title:"improvements",items:["Remove unnecessary `as any` i18n casts and add missing keys","Replace docs sidebar with 4-tab navigation (cli/api/bot/all)"]},{title:"fixes",items:["Update task.branch when worker reports branch via progress frame","Replace snake_case placeholder values with proper English text","Re-apply Zap icon after merge from main","Update TaskDetailPage test mock for icon change","Filter project list by membership for non-admin users","Mobile UI improvements across all pages","Add logout button to profile page for mobile users"]}]},{version:"1.0.74",date:"2026-03-16",sections:[{title:"fixes",items:["Git token UI labels — use readable text instead of snake_case keys","Remove screen clear reset from replay buffer, increase to 256KB for TUI replay"]}]},{version:"1.0.73",date:"2026-03-16",sections:[{title:"features",items:["PTY relay auto-reconnection via channel token renewal"]},{title:"fixes",items:["Onboarding guide shows stale developer_count after creating a developer","Reset PTY replay buffer on screen clear to prevent blank terminal after refresh"]}]},{version:"1.0.72",date:"2026-03-16",sections:[{title:"fixes",items:["Use 'code tunnel' instead of 'cursor --remote-tunnel' for headless servers","Unify take_over/release button styles with TaskDetailPage","Add 500ms delay before Enter to let TUI process pasted text","Use \\r instead of \\n to submit prompt in PTY"]},{title:"documentation",items:["Update deployment docs to reflect web URL in install wizard"]}]},{version:"1.0.71",date:"2026-03-16",sections:[{title:"fixes",items:["Clean up debug log in pipeline prompt writer","Reset cleanOutput after trust confirm to prevent false prompt detection"]}]},{version:"1.0.70",date:"2026-03-16",sections:[{title:"fixes",items:["Use Hand icon for take_over and RotateCcw for release across both pages"]}]},{version:"1.0.69",date:"2026-03-15",sections:[{title:"improvements",items:["Simplify docs pages with shared DocsPrimitives component"]},{title:"fixes",items:["Use useT from @/i18n instead of react-i18next, fix useRef initial value","Unify take-over/release icons between terminal and task detail pages","Replay PTY output buffer on web client reconnect","Show PWA install banner for logged-in mobile users","Use i18n for CopyButton title instead of hardcoded string","Restore DocsLayout lazy loading and move DocsPrimitives to shared location"]}]},{version:"1.0.68",date:"2026-03-15",sections:[{title:"features",items:["Add documentation center with categorized sidebar navigation and 12 doc pages","Redesign bot form with platform-specific fields and webhook URLs"]},{title:"fixes",items:["Trust auto-confirm with \\r and \\s* patterns, detect prompt in tail of output","Escape >= symbols in JSX text content","Strip webhookToken from bot API responses","Remove incorrect webhookToken null-check from Lark webhook verification"]}]},{version:"1.0.67",date:"2026-03-15",sections:[{title:"fixes",items:["Move trust auto-confirm to PTY data handler for earliest detection"]}]},{version:"1.0.66",date:"2026-03-15",sections:[{title:"fixes",items:["Check initial accumulated output for trust prompt before registering checkReady listener"]}]},{version:"1.0.65",date:"2026-03-15",sections:[{title:"features",items:["Add PWA install banner for mobile Landing Page"]},{title:"improvements",items:["Simplify mobile adaptation code after review"]},{title:"fixes",items:["Symlink settings.json from real home for Claude trust — use lstatSync to detect project settings","Audit log mobile cards truncate long UUIDs","Task detail mobile title wrapping, metadata wrap, stage progress scroll","Ensure all tab bars and admin tab bar are scrollable on mobile","Terminal Home mobile layout — stack tabs and getting started vertically","Fix xterm terminal rendering on mobile Safari with retry fit","Prevent long URL/text overflow in InfoRow on mobile"]}]},{version:"1.0.64",date:"2026-03-15",sections:[{title:"fixes",items:["Check accumulated output for trust patterns instead of per-chunk"]}]},{version:"1.0.63",date:"2026-03-15",sections:[{title:"fixes",items:["Trust prompt — write trustedDirectories to worktree settings.json, fix auto-confirm patterns"]}]},{version:"1.0.61",date:"2026-03-15",sections:[{title:"features",items:["Add task type selector and branch slug input to task creation UI","Parse task type prefix (feat:/fix:/etc) in bot commands","Add --type flag to developer CLI task create","Generate meaningful branch names from task type and description","Add task_type and branch_slug to DB schema and task creation flow","Add TaskType enum and branchSlug to protocol types","Report worktree path from worker to server for workspace tracking","Inject project context into pipeline prompt"]},{title:"improvements",items:["Replace require() with ESM imports where possible","Extract shared PATH helper, deduplicate task type options"]},{title:"fixes",items:["Update database service, worker, and setup-worker tests for renames and new behavior","Use shared TASK_TYPE_OPTIONS and ESM imports in safe-env","Revert protocol dependency to exact version for npm publishing","Treat task as completed if last pipeline stage is done regardless of exit code","Add ~/.local/bin to tunnel spawn PATH for cursor binary","Auto-confirm trust prompts, use accumulated output, increase timeout to 180s","Pre-trust workspace root in Claude settings to prevent trust prompt blocking"]}]},{version:"1.0.60",date:"2026-03-15",sections:[{title:"documentation",items:["Remove manual OVERLORD_WEB_URL setup from deploy guide"]}]},{version:"1.0.54",date:"2026-03-15",sections:[{title:"features",items:["Terminal-centric homepage with live task switching and inline confirmations","Slack adapter support (webhook controller, message parser, Block Kit cards, signature verification)","Collapsible desktop sidebar with toggle button and UI store","Mobile search — replace Profile tab with Search in bottom nav","Tunnel crash recovery, event emission, and machine cleanup","PWA infrastructure, responsive hooks, and mobile viewport support","Mobile adaptation across all pages","Platform bind self-service flow (web page, API endpoint, bot commands, CLI whoami)","Bot setup and all-role onboarding steps","Platform account editing to developer management UI","Info command to show chat and user IDs in bot adapters","Pipeline V2: compiler with variable substitution, stage monitor with passive marker parsing, takeover support","PTY relay client for worker-to-server output streaming","Agent executor environment preparation (Claude, Codex, Cursor, Custom)","Git token support for HTTPS-based repo cloning","Rewrite PipelineEditor for new pipeline config","Wire git token and defaultReviewers through dispatcher with token API","Unified CommandParser with --reviewer support"]},{title:"improvements",items:["Deep simplify — shared types, event-driven dismiss, ref safety","Full codebase simplify — deduplicate, optimize, and clean up","Extract WorkerAuthService from DispatcherService","Extract TunnelService from WorkspaceController","Centralize repositories in global RepositoryModule","Remove DispatcherService facade — callers inject sub-services directly","Extract CommandParser into packages/command-parser","Create packages/validation with shared password rules","Replace TypeScript enums with as-const objects in protocol","Architecture improvements — BaseRepository, useFetch, types, cache, async git","Rename machine to worker across entire codebase","Rename PipelineConfigV2/StageConfigV2 to canonical names","Remove legacy pipeline-runner and pipeline-parser","Consolidate status colors, add useIsAdmin hook","Extract OnboardingGuide strings to i18n locale","Deduplicate maskToken, token blacklisting, and cache helpers"]},{title:"fixes",items:["Mobile responsiveness for EditDeveloperModal and BindPlatformPage","Complete TOTP bind redirect in LoginPage, fix slash command parser call","Secure group bind, merge admin platformUids, allow bind during TOTP setup","Rate limit, token validation, and platformUids string check","Force-offline transaction, BotActions reconciliation, and PtyTerminal reconnect","Replace health check write probe with read-only SELECT 1","Replace regex with startsWith in config-writer to avoid regex injection","Race conditions, unhandled errors, and resource leaks across server and web","Escape backslash in sanitizeForLike and add ESCAPE clause","Align installer password validation with validation package rules","Timer leak, dead code, stringly-typed token status, and i18n gaps","Three PTY relay race conditions causing blank terminals","Cap relay send buffer, fix TOCTOU symlink races in executors","Paginate efficiency, tunnel memory leak, and type-safe roles","Unify password validation rules across server and web","Filter active tasks client-side — API only supports single status"]},{title:"tests",items:["Comprehensive tests for terminal homepage and UI polish","Complete protocol test coverage (100%)","Developer-CLI, Worker, CLI test coverage to 95-100%","Server test coverage to 93%, Web test coverage to 93%","E2E tests for developer CLI commands","Platform bind flow integration test","Integration tests verifying passwordHash/totpSecret never leak","PTY relay E2E tests","Agent environment integration tests","Slack adapter and Lark adapter integration tests"]},{title:"documentation",items:["Comparison analysis between Overlord and Happy Coder","Update API and CLI reference pages","Sync README and architecture.md with actual implementation","Bot integration guide and deployment docs updates"]},{title:"security",items:["Enable Content-Security-Policy via helmet","Comprehensive security hardening across codebase"]}]},{version:"1.0.28",date:"2026-03-13",sections:[{title:"features",items:["full task orchestration platform with multi-agent support (claude code, cursor, codex)","real-time pty terminal streaming via xterm.js in web dashboard","skill pipeline system with confirmation, choice, and input stages","multi-machine worker fleet with intelligent task routing","lark bot integration with interactive message cards","developer cli (ov) for task management and terminal attachment","operations cli (overlord) for server/worker lifecycle management","role-based access control (developer, lead, admin)","totp two-factor authentication","personal access tokens for api/cli authentication","cursor remote tunnel support for workspace access","project-level configuration with pipeline definitions","audit logging for all administrative actions","cloudflare zero trust deployment support","sqlite database with wal mode","redis-backed task queue via bullmq","comprehensive web dashboard with dark/light theme"]}]}];function n(){return e.jsxs("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// changelog"}),e.jsx("p",{className:"mt-2 text-xs text-[var(--text-muted)]",children:"release history and notable changes."})]}),e.jsx("div",{className:"space-y-6",children:s.map(t=>e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-baseline gap-3",children:[e.jsxs("h2",{className:"text-sm text-[var(--accent)]",children:["> v",t.version]}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:t.date}),t.note&&e.jsxs("span",{className:"text-xs text-[var(--text-muted)]",children:["(",t.note,")"]})]}),t.sections.map(i=>e.jsxs("div",{className:"space-y-1",children:[e.jsx("h3",{className:"text-xs text-[var(--text-primary)]",children:i.title}),e.jsx("div",{className:"space-y-1 text-xs text-[var(--text-secondary)]",children:i.items.map((o,a)=>e.jsxs("p",{children:["- ",o]},a))})]},i.title))]},t.version))})]})}export{n as default};
@@ -0,0 +1 @@
1
+ import{r as l,j as e,C as j}from"./index-OBVbDpAB.js";const h=l.forwardRef(function({checked:r,defaultChecked:a,disabled:t,label:i,className:p,containerClassName:u,indicatorClassName:x,labelClassName:d,onChange:s,onCheckedChange:c,...b},f){const[m,v]=l.useState(!!a),n=r??m;return e.jsxs("label",{className:`group inline-flex items-center gap-2 select-none ${t?"cursor-not-allowed opacity-60":"cursor-pointer"} ${u??""}`,children:[e.jsx("input",{...b,ref:f,type:"checkbox",checked:r,defaultChecked:a,disabled:t,onChange:o=>{r===void 0&&v(o.target.checked),s==null||s(o),c==null||c(o.target.checked)},className:`peer sr-only ${p??""}`}),e.jsx("span",{"data-state":n?"checked":"unchecked","aria-hidden":"true",className:`flex h-4 w-4 shrink-0 items-center justify-center rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] text-black transition-all duration-150 ${t?"cursor-not-allowed":"cursor-pointer group-hover:border-[var(--accent)]/70"} peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-[var(--accent)] peer-checked:border-[var(--accent)] peer-checked:bg-[var(--accent)] ${x??""}`,children:e.jsx(j,{className:`h-3 w-3 transition-opacity duration-150 ${n?"opacity-100":"opacity-0"}`})}),i&&e.jsx("span",{className:`text-xs text-[var(--text-primary)] ${d??""}`,children:i})]})});export{h as C};
@@ -1,4 +1,4 @@
1
- import{f as d,a as i,x as l,r as p,j as e,L as m}from"./index-CuZrCrRX.js";import{C as a}from"./DocsPrimitives-Beo_PA0s.js";import{Q as x}from"./QuickAuth-DihfVcAD.js";import{P as v}from"./plus-DXUBGb2Z.js";import"./copy-mNrO3LXa.js";const u=[{command:"ov setup",description:"quick setup — configure server connection and authenticate in one step",usage:"ov setup [--server <url>] [--token <token>]",flags:[{flag:"--server <url>",desc:"overlord server url"},{flag:"--token <token>",desc:"personal access token (skips prompt)"}],example:`ov setup
1
+ import{f as d,a as i,x as l,r as p,j as e,L as m}from"./index-OBVbDpAB.js";import{C as a}from"./DocsPrimitives-Sl_VYTFo.js";import{Q as x}from"./QuickAuth-DB27kLvg.js";import{P as v}from"./plus-D8LQpkpb.js";import"./copy-DYDGVR2b.js";const u=[{command:"ov setup",description:"quick setup — configure server connection and authenticate in one step",usage:"ov setup [--server <url>] [--token <token>]",flags:[{flag:"--server <url>",desc:"overlord server url"},{flag:"--token <token>",desc:"personal access token (skips prompt)"}],example:`ov setup
2
2
  > Overlord server URL: http://localhost:9000
3
3
  > Personal Access Token: ov_pat_xxxxx
4
4
  ✓ Connected to http://localhost:9000
@@ -1 +1 @@
1
- import{a as C,v as E,r as l,h as F,j as e,G as I,M as P,O as R}from"./index-CuZrCrRX.js";import{a as z}from"./date-CmcdoD87.js";import{C as D}from"./clock-yzYGdAPO.js";function H({isOpen:t,onClose:n,taskId:u,stageName:r,timeoutSeconds:d,confirmType:a="confirm",prompt:k,onSubmitted:i}){const{t:s}=C();E(t);const[v,_]=l.useState(d),[m,f]=l.useState(!1),[p,h]=l.useState(""),x=a==="plan_review"||a==="code_review",b=a==="plan_decompose";l.useEffect(()=>{if(!t)return;_(d),h("");const c=setInterval(()=>{_(o=>o<=1?(clearInterval(c),0):o-1)},1e3);return()=>clearInterval(c)},[t,d]),l.useEffect(()=>{v===0&&t&&n()},[v,t,n]);const g=l.useCallback(async c=>{f(!0);try{const o={stageName:r,approved:c};x&&!b&&p.trim()&&(o.feedback=p.trim()),await F.post(`web/tasks/${u}/confirm-stage`,{json:o}),i==null||i(),n()}catch{}finally{f(!1)}},[u,r,p,x,b,n,i]);if(!t)return null;const j=a==="plan_review"||a==="plan_decompose"?I:a==="code_review"?P:R,w=a==="plan_review"?s("tasks.plan_review_message",{name:r}):a==="plan_decompose"?s(k==="SPEC_PUSH_FAILED"?"tasks.plan_decompose_push_failed_message":"tasks.plan_decompose_message"):a==="code_review"?s("tasks.code_review_message",{name:r}):s("tasks.confirm_stage_message",{name:r}),y=s(a==="plan_review"?"tasks.approve_plan":a==="plan_decompose"?"tasks.approve_plan_decompose":a==="code_review"?"tasks.approve_review":"tasks.confirm_and_proceed"),N=s(a==="plan_decompose"?"tasks.reject_plan_decompose":x?"tasks.request_changes":"tasks.reject");return e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",style:{backdropFilter:"blur(2px)"},children:[e.jsx("div",{className:"fixed inset-0 bg-[var(--modal-backdrop)]"}),e.jsxs("div",{className:"relative z-10 w-full max-w-[480px] rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] font-mono",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(j,{className:"h-4 w-4 text-[var(--accent)]"}),e.jsxs("h3",{className:"text-sm text-[var(--text-primary)]",children:["// stage: ",r]})]}),d>0&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-[var(--text-muted)]",children:[e.jsx(D,{className:"h-3.5 w-3.5"}),z(v)]})]}),e.jsxs("div",{className:"space-y-4 px-5 py-5",children:[e.jsx("p",{className:"whitespace-pre-wrap text-xs text-[var(--text-primary)]",children:w}),x&&!b&&e.jsx("textarea",{className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-primary)] px-3 py-2 text-xs text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:border-[var(--accent)] focus:outline-none resize-y",rows:4,placeholder:s("tasks.feedback_placeholder"),value:p,onChange:c=>h(c.target.value)})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2 border-t border-[var(--border)] px-5 py-4",children:[e.jsx("button",{type:"button",className:"rounded-[4px] border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors disabled:opacity-50",disabled:m,onClick:()=>g(!1),children:N}),e.jsx("button",{type:"button",className:"rounded-[4px] bg-[var(--accent)] px-3 py-1.5 text-xs text-black hover:opacity-90 transition-opacity disabled:opacity-50",disabled:m,onClick:()=>g(!0),children:m?s("tasks.stage_submitting"):y})]})]})]})}export{H as C};
1
+ import{a as C,v as E,r as l,h as F,j as e,G as I,M as P,O as R}from"./index-OBVbDpAB.js";import{a as z}from"./date-CmcdoD87.js";import{C as D}from"./clock-BesNqyTN.js";function H({isOpen:t,onClose:n,taskId:u,stageName:r,timeoutSeconds:d,confirmType:a="confirm",prompt:k,onSubmitted:i}){const{t:s}=C();E(t);const[v,_]=l.useState(d),[m,f]=l.useState(!1),[p,h]=l.useState(""),x=a==="plan_review"||a==="code_review",b=a==="plan_decompose";l.useEffect(()=>{if(!t)return;_(d),h("");const c=setInterval(()=>{_(o=>o<=1?(clearInterval(c),0):o-1)},1e3);return()=>clearInterval(c)},[t,d]),l.useEffect(()=>{v===0&&t&&n()},[v,t,n]);const g=l.useCallback(async c=>{f(!0);try{const o={stageName:r,approved:c};x&&!b&&p.trim()&&(o.feedback=p.trim()),await F.post(`web/tasks/${u}/confirm-stage`,{json:o}),i==null||i(),n()}catch{}finally{f(!1)}},[u,r,p,x,b,n,i]);if(!t)return null;const j=a==="plan_review"||a==="plan_decompose"?I:a==="code_review"?P:R,w=a==="plan_review"?s("tasks.plan_review_message",{name:r}):a==="plan_decompose"?s(k==="SPEC_PUSH_FAILED"?"tasks.plan_decompose_push_failed_message":"tasks.plan_decompose_message"):a==="code_review"?s("tasks.code_review_message",{name:r}):s("tasks.confirm_stage_message",{name:r}),y=s(a==="plan_review"?"tasks.approve_plan":a==="plan_decompose"?"tasks.approve_plan_decompose":a==="code_review"?"tasks.approve_review":"tasks.confirm_and_proceed"),N=s(a==="plan_decompose"?"tasks.reject_plan_decompose":x?"tasks.request_changes":"tasks.reject");return e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",style:{backdropFilter:"blur(2px)"},children:[e.jsx("div",{className:"fixed inset-0 bg-[var(--modal-backdrop)]"}),e.jsxs("div",{className:"relative z-10 w-full max-w-[480px] rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] font-mono",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(j,{className:"h-4 w-4 text-[var(--accent)]"}),e.jsxs("h3",{className:"text-sm text-[var(--text-primary)]",children:["// stage: ",r]})]}),d>0&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-[var(--text-muted)]",children:[e.jsx(D,{className:"h-3.5 w-3.5"}),z(v)]})]}),e.jsxs("div",{className:"space-y-4 px-5 py-5",children:[e.jsx("p",{className:"whitespace-pre-wrap text-xs text-[var(--text-primary)]",children:w}),x&&!b&&e.jsx("textarea",{className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-primary)] px-3 py-2 text-xs text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:border-[var(--accent)] focus:outline-none resize-y",rows:4,placeholder:s("tasks.feedback_placeholder"),value:p,onChange:c=>h(c.target.value)})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2 border-t border-[var(--border)] px-5 py-4",children:[e.jsx("button",{type:"button",className:"rounded-[4px] border border-[var(--border)] px-3 py-1.5 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors disabled:opacity-50",disabled:m,onClick:()=>g(!1),children:N}),e.jsx("button",{type:"button",className:"rounded-[4px] bg-[var(--accent)] px-3 py-1.5 text-xs text-black hover:opacity-90 transition-opacity disabled:opacity-50",disabled:m,onClick:()=>g(!0),children:m?s("tasks.stage_submitting"):y})]})]})]})}export{H as C};
@@ -1,4 +1,4 @@
1
- import{j as e}from"./index-CuZrCrRX.js";import{a as s}from"./DocsPrimitives-Beo_PA0s.js";import"./copy-mNrO3LXa.js";function c(){return e.jsx("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// architecture"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"deploy overlord on an ubuntu server (main server + worker) and additional machines (workers), exposed via cloudflare zero trust."}),e.jsx(s,{code:`internet
1
+ import{j as e}from"./index-OBVbDpAB.js";import{a as s}from"./DocsPrimitives-Sl_VYTFo.js";import"./copy-DYDGVR2b.js";function c(){return e.jsx("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// architecture"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"deploy overlord on an ubuntu server (main server + worker) and additional machines (workers), exposed via cloudflare zero trust."}),e.jsx(s,{code:`internet
2
2
  |
3
3
  v
4
4
  cloudflare zero trust (access + tunnel)
@@ -1,4 +1,4 @@
1
- import{j as e}from"./index-CuZrCrRX.js";import{a as s}from"./DocsPrimitives-Beo_PA0s.js";import"./copy-mNrO3LXa.js";function d(){return e.jsxs("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// development workflow"}),e.jsx("p",{className:"mt-2 text-xs text-[var(--text-muted)]",children:"this guide is for contributing to overlord's source code. if you're looking to use overlord, see the getting started guide."})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> prerequisites"}),e.jsxs("div",{className:"space-y-1 text-xs text-[var(--text-secondary)]",children:[e.jsx("p",{children:"- node.js >= 20"}),e.jsx("p",{children:"- pnpm >= 9"}),e.jsx("p",{children:"- redis (running locally)"}),e.jsx("p",{children:"- git >= 2.20"})]})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> development setup"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"clone the repository and install dependencies:"}),e.jsx(s,{code:`git clone https://github.com/overlord-run/overlord.git
1
+ import{j as e}from"./index-OBVbDpAB.js";import{a as s}from"./DocsPrimitives-Sl_VYTFo.js";import"./copy-DYDGVR2b.js";function d(){return e.jsxs("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// development workflow"}),e.jsx("p",{className:"mt-2 text-xs text-[var(--text-muted)]",children:"this guide is for contributing to overlord's source code. if you're looking to use overlord, see the getting started guide."})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> prerequisites"}),e.jsxs("div",{className:"space-y-1 text-xs text-[var(--text-secondary)]",children:[e.jsx("p",{children:"- node.js >= 20"}),e.jsx("p",{children:"- pnpm >= 9"}),e.jsx("p",{children:"- redis (running locally)"}),e.jsx("p",{children:"- git >= 2.20"})]})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> development setup"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"clone the repository and install dependencies:"}),e.jsx(s,{code:`git clone https://github.com/overlord-run/overlord.git
2
2
  cd overlord
3
3
  pnpm install`}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"build the shared protocol package and server:"}),e.jsx(s,{code:`pnpm --filter @overlordai/protocol build
4
4
  pnpm --filter @overlordai/server build`})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> seed test data"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"populate the database with sample developers, projects, and machines:"}),e.jsx(s,{code:"pnpm dev:seed"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"this creates the following test accounts:"}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"username"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"role"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"password"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"totp secret"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"admin"})}),e.jsx("td",{className:"py-2 pr-4",children:"admin"}),e.jsx("td",{className:"py-2 pr-4",children:"test-password-123"}),e.jsx("td",{className:"py-2",children:"JBSWY3DPEHPK3PXP"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"alice"})}),e.jsx("td",{className:"py-2 pr-4",children:"lead"}),e.jsx("td",{className:"py-2 pr-4",children:"test-password-123"}),e.jsx("td",{className:"py-2",children:"JBSWY3DPEHPK3PXP"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"bob"})}),e.jsx("td",{className:"py-2 pr-4",children:"developer"}),e.jsx("td",{className:"py-2 pr-4",children:"test-password-123"}),e.jsx("td",{className:"py-2",children:"JBSWY3DPEHPK3PXP"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"carol"})}),e.jsx("td",{className:"py-2 pr-4",children:"developer"}),e.jsx("td",{className:"py-2 pr-4",children:"test-password-123"}),e.jsx("td",{className:"py-2",children:"JBSWY3DPEHPK3PXP"})]})]})]})}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"use any totp authenticator app with the secret JBSWY3DPEHPK3PXP to generate 2fa codes for login."})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> start development servers"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"open two terminals:"}),e.jsx(s,{code:`# terminal 1: start the backend server on port 9000
@@ -1,4 +1,4 @@
1
- import{c as X,D as S,a as E,v as L,r as n,j as e,X as M,h as C,u as q,y as K,ab as w}from"./index-CuZrCrRX.js";import{S as G}from"./Select-CHmz_Qig.js";import{v as B}from"./password-CHk45-jw.js";import{E as J}from"./EmptyState-DtQh3oGP.js";import{T as Q}from"./Skeleton-BgqnK2cB.js";import{u as W}from"./useFetch-CoPiRYNS.js";import{c as F}from"./status-colors-Bq7c453S.js";import{P as Y}from"./plus-DXUBGb2Z.js";import{U as Z}from"./users-BI6dc6Ci.js";import{P as ee}from"./pencil-C61WAtwR.js";import{R as te}from"./rotate-ccw-DWFriik8.js";import"./chevron-down-BKGOt_gM.js";/**
1
+ import{c as X,D as S,a as E,v as L,r as n,j as e,X as M,h as C,u as q,y as K,ab as w}from"./index-OBVbDpAB.js";import{S as G}from"./Select-tnanVDGG.js";import{v as B}from"./password-CHk45-jw.js";import{E as J}from"./EmptyState-BA9x5xQN.js";import{T as Q}from"./Skeleton-Dv9dOtKo.js";import{u as W}from"./useFetch-BJHAN5c6.js";import{c as F}from"./status-colors-DripE1Ev.js";import{P as Y}from"./plus-D8LQpkpb.js";import{U as Z}from"./users-D_2oemG4.js";import{P as ee}from"./pencil-3qtLy37N.js";import{R as te}from"./rotate-ccw-_DB8ITHt.js";import"./chevron-down-DfH1OlZR.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{j as e,L as t}from"./index-CuZrCrRX.js";import{I as s,a}from"./DocsPrimitives-Beo_PA0s.js";import"./copy-mNrO3LXa.js";function o(){return e.jsx("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// overview"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["the ",e.jsx("code",{className:"text-[var(--accent)]",children:"ov"})," cli is the developer-facing command-line tool for interacting with overlord. install it on your laptop or workstation to create tasks, attach to running sessions, and monitor progress from your terminal."]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// installation"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"install the developer cli globally:"}),e.jsx(s,{code:"npm install -g @overlordai/developer-cli"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// connect to your server"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"authenticate with your overlord server using a personal access token:"}),e.jsx(s,{code:"ov login https://overlord.yourdomain.com"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["you'll be prompted for a personal access token (pat). generate one in the web dashboard under ",e.jsx("span",{className:"text-[var(--text-secondary)]",children:"profile → access tokens"}),"."]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"alternatively, use the one-step setup wizard:"}),e.jsx(s,{code:"ov setup"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"this prompts for both the server url and token interactively."})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// verify"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"confirm your connection is working:"}),e.jsx(s,{code:"ov whoami"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"should display your username and role."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// quick start"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> create a task"}),e.jsx(s,{code:'ov task create -d "fix the login bug" -p my-project'})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> watch a running task"}),e.jsx(a,{code:`ov attach <task_id>
1
+ import{j as e,L as t}from"./index-OBVbDpAB.js";import{I as s,a}from"./DocsPrimitives-Sl_VYTFo.js";import"./copy-DYDGVR2b.js";function o(){return e.jsx("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// overview"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["the ",e.jsx("code",{className:"text-[var(--accent)]",children:"ov"})," cli is the developer-facing command-line tool for interacting with overlord. install it on your laptop or workstation to create tasks, attach to running sessions, and monitor progress from your terminal."]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// installation"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"install the developer cli globally:"}),e.jsx(s,{code:"npm install -g @overlordai/developer-cli"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// connect to your server"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"authenticate with your overlord server using a personal access token:"}),e.jsx(s,{code:"ov login https://overlord.yourdomain.com"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["you'll be prompted for a personal access token (pat). generate one in the web dashboard under ",e.jsx("span",{className:"text-[var(--text-secondary)]",children:"profile → access tokens"}),"."]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"alternatively, use the one-step setup wizard:"}),e.jsx(s,{code:"ov setup"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"this prompts for both the server url and token interactively."})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// verify"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"confirm your connection is working:"}),e.jsx(s,{code:"ov whoami"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"should display your username and role."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// quick start"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> create a task"}),e.jsx(s,{code:'ov task create -d "fix the login bug" -p my-project'})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> watch a running task"}),e.jsx(a,{code:`ov attach <task_id>
2
2
 
3
3
  # use --watch for read-only mode
4
4
  # use --takeover to take control of the terminal`})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> list tasks"}),e.jsx(s,{code:"ov task list --status RUNNING"})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// next steps"}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— ",e.jsx(t,{to:"/docs/cli",className:"text-[var(--accent)] hover:underline",children:"developer cli reference"})," — full command reference for the ov cli"]}),e.jsxs("li",{children:["— ",e.jsx(t,{to:"/docs/dev-workflow",className:"text-[var(--accent)] hover:underline",children:"development workflow"})," — end-to-end guide for creating and managing tasks"]})]})]})]})})}export{o as default};
@@ -1,4 +1,4 @@
1
- import{c,a as _,j as s,G as p,M as t,S as h,b as m,O as y,a5 as x,d as v,L as k}from"./index-CuZrCrRX.js";import{D as b}from"./download-DDHXuzR3.js";import{B as g}from"./bot-BaIIvmh0.js";import{G as a,W as u}from"./workflow-CvwIjZCH.js";import{S as w}from"./settings-C72xeZrh.js";/**
1
+ import{c,a as _,j as s,G as p,M as t,S as h,b as m,O as y,a5 as x,d as v,L as k}from"./index-OBVbDpAB.js";import{D as b}from"./download-4aSi3sMZ.js";import{B as g}from"./bot-DxIEfbm7.js";import{G as a,W as u}from"./workflow-BDFil6MC.js";import{S as w}from"./settings-CZcnVo6Q.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{a as i,g as x,j as a,L as d,G as m,b,M as p,O as h,a5 as u,e as v,a9 as f,aa as g}from"./index-CuZrCrRX.js";import{A as j}from"./arrow-left-DOpqosft.js";const t=[{to:"/docs/changelog",label:"changelog",icon:m},{to:"/docs/cli",label:"cli",icon:b},{to:"/docs/api",label:"api",icon:p},{to:"/docs/bot",label:"bot",icon:h},{to:"/docs/skill",label:"skill",icon:u},{to:"/docs/all",label:"all",icon:v}],k=new Set(t.map(e=>e.to));function N(){const{t:e}=i(),r=x(),o=!k.has(r.pathname);return a.jsxs("div",{className:"flex h-full flex-col",children:[a.jsxs("nav",{className:"flex items-center border-b border-[var(--border)] bg-[var(--bg-card)] px-4 md:px-6 overflow-x-auto no-scrollbar",children:[o&&a.jsxs(d,{to:"/docs/all",className:"mr-3 shrink-0 flex items-center gap-1 text-xs text-[var(--text-muted)] hover:text-[var(--text-primary)] transition-colors",children:[a.jsx(j,{size:12}),e("docs.docs_back")]}),t.map(({to:s,label:l,icon:c})=>a.jsxs(f,{to:s,className:({isActive:n})=>`flex items-center gap-1.5 px-3 py-3 text-xs lowercase border-b-2 transition-colors shrink-0 ${n||o&&s==="/docs/all"?"border-[var(--accent)] text-[var(--accent)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]"}`,children:[a.jsx(c,{size:14}),a.jsx("span",{children:l})]},s))]}),a.jsx("main",{className:"flex-1 overflow-auto p-4 md:p-6",children:a.jsx(g,{})})]})}export{N as default};
1
+ import{a as i,g as x,j as a,L as d,G as m,b,M as p,O as h,a5 as u,e as v,a9 as f,aa as g}from"./index-OBVbDpAB.js";import{A as j}from"./arrow-left-DB4r4i1M.js";const t=[{to:"/docs/changelog",label:"changelog",icon:m},{to:"/docs/cli",label:"cli",icon:b},{to:"/docs/api",label:"api",icon:p},{to:"/docs/bot",label:"bot",icon:h},{to:"/docs/skill",label:"skill",icon:u},{to:"/docs/all",label:"all",icon:v}],k=new Set(t.map(e=>e.to));function N(){const{t:e}=i(),r=x(),o=!k.has(r.pathname);return a.jsxs("div",{className:"flex h-full flex-col",children:[a.jsxs("nav",{className:"flex items-center border-b border-[var(--border)] bg-[var(--bg-card)] px-4 md:px-6 overflow-x-auto no-scrollbar",children:[o&&a.jsxs(d,{to:"/docs/all",className:"mr-3 shrink-0 flex items-center gap-1 text-xs text-[var(--text-muted)] hover:text-[var(--text-primary)] transition-colors",children:[a.jsx(j,{size:12}),e("docs.docs_back")]}),t.map(({to:s,label:l,icon:c})=>a.jsxs(f,{to:s,className:({isActive:n})=>`flex items-center gap-1.5 px-3 py-3 text-xs lowercase border-b-2 transition-colors shrink-0 ${n||o&&s==="/docs/all"?"border-[var(--accent)] text-[var(--accent)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]"}`,children:[a.jsx(c,{size:14}),a.jsx("span",{children:l})]},s))]}),a.jsx("main",{className:"flex-1 overflow-auto p-4 md:p-6",children:a.jsx(g,{})})]})}export{N as default};
@@ -1 +1 @@
1
- import{a as i,r as s,j as e,C as x}from"./index-CuZrCrRX.js";import{C as p}from"./copy-mNrO3LXa.js";function o({text:t}){const{t:c}=i(),[n,a]=s.useState(!1),r=s.useRef(void 0);return s.useEffect(()=>()=>clearTimeout(r.current),[]),e.jsx("button",{onClick:async()=>{await navigator.clipboard.writeText(t),a(!0),clearTimeout(r.current),r.current=setTimeout(()=>a(!1),2e3)},className:"rounded-[4px] p-1 text-[var(--text-muted)] transition-colors hover:text-[var(--text-primary)]",title:c("common.copy"),children:n?e.jsx(x,{className:"h-3 w-3 text-[var(--accent)]"}):e.jsx(p,{className:"h-3 w-3"})})}function m({code:t}){return e.jsxs("div",{className:"relative rounded-[4px] bg-[var(--bg-primary)] px-3 py-2 overflow-x-auto",children:[e.jsx("div",{className:"absolute right-2 top-2",children:e.jsx(o,{text:t})}),e.jsx("pre",{className:"text-xs text-[var(--text-secondary)] whitespace-pre-wrap pr-8",children:t})]})}function d({code:t}){return e.jsxs("div",{className:"flex items-center justify-between rounded-[4px] bg-[var(--bg-primary)] px-3 py-2 overflow-x-auto",children:[e.jsx("code",{className:"text-xs text-[var(--accent)] whitespace-nowrap",children:t}),e.jsx(o,{text:t})]})}export{o as C,d as I,m as a};
1
+ import{a as i,r as s,j as e,C as x}from"./index-OBVbDpAB.js";import{C as p}from"./copy-DYDGVR2b.js";function o({text:t}){const{t:c}=i(),[n,a]=s.useState(!1),r=s.useRef(void 0);return s.useEffect(()=>()=>clearTimeout(r.current),[]),e.jsx("button",{onClick:async()=>{await navigator.clipboard.writeText(t),a(!0),clearTimeout(r.current),r.current=setTimeout(()=>a(!1),2e3)},className:"rounded-[4px] p-1 text-[var(--text-muted)] transition-colors hover:text-[var(--text-primary)]",title:c("common.copy"),children:n?e.jsx(x,{className:"h-3 w-3 text-[var(--accent)]"}):e.jsx(p,{className:"h-3 w-3"})})}function m({code:t}){return e.jsxs("div",{className:"relative rounded-[4px] bg-[var(--bg-primary)] px-3 py-2 overflow-x-auto",children:[e.jsx("div",{className:"absolute right-2 top-2",children:e.jsx(o,{text:t})}),e.jsx("pre",{className:"text-xs text-[var(--text-secondary)] whitespace-pre-wrap pr-8",children:t})]})}function d({code:t}){return e.jsxs("div",{className:"flex items-center justify-between rounded-[4px] bg-[var(--bg-primary)] px-3 py-2 overflow-x-auto",children:[e.jsx("code",{className:"text-xs text-[var(--accent)] whitespace-nowrap",children:t}),e.jsx(o,{text:t})]})}export{o as C,d as I,m as a};
@@ -1,2 +1,2 @@
1
- import{B as xe,f as ue,a as me,r as s,I as v,Q as be,h as d,j as e,L as ve,Z as V,t as c}from"./index-CuZrCrRX.js";import{S as X}from"./Select-CHmz_Qig.js";import{U as je,A as he,R as ge}from"./RemoveMemberConfirmDialog-CqG8IOTw.js";import{a as ye}from"./agent-type-options-CuEUrpd3.js";import{P as fe}from"./plus-DXUBGb2Z.js";import"./chevron-down-BKGOt_gM.js";function Te(){const{key:o}=xe(),l=ue(),{t:r}=me(),Y=ye(t=>t),[a,ee]=s.useState(null),[j,te]=s.useState([]),[re,se]=s.useState(!0),[w,h]=s.useState(!1),[g,C]=s.useState(""),[y,S]=s.useState(""),[T,I]=s.useState(""),[M,P]=s.useState(v.GITHUB),[A,R]=s.useState(""),[O,U]=s.useState(be.CLAUDE),[G,$]=s.useState("50"),[E,B]=s.useState(""),[D,L]=s.useState(""),[F,J]=s.useState(""),[q,z]=s.useState("0"),[p,f]=s.useState(""),[H,N]=s.useState(null),[x,k]=s.useState(""),[K,u]=s.useState(!1),[ae,Q]=s.useState(!1),[i,_]=s.useState(null),[ne,W]=s.useState(!1),m=s.useCallback(async()=>{if(o)try{const[t,b]=await Promise.all([d.get(`web/projects/${o}`).json(),d.get(`web/projects/${o}/members`).json().catch(()=>[])]);if(ee(t),te(b),N(t.gitTokenMasked??null),C(t.name),S(t.repoUrl),I(t.sshUrl??""),P(t.gitPlatform),R(t.defaultBranch),U(t.agentType),$(String(t.maxTurns)),B(t.workspaceRoot??""),L(t.setupCommands??""),J(t.testCommand??""),z(String(t.ptyOutputFilter??0)),t.pipeline)try{f(JSON.stringify(JSON.parse(t.pipeline),null,2))}catch{f(t.pipeline)}}catch{}finally{se(!1)}},[o]);s.useEffect(()=>{m()},[m]);async function oe(t){if(t.preventDefault(),!a)return;h(!0);let b=null;if(p.trim())try{JSON.parse(p),b=p.trim()}catch{c.error(r("projects.invalid_pipeline_json")),h(!1);return}try{await d.put(`web/projects/${a.key}`,{json:{name:g,repoUrl:y,sshUrl:T||null,defaultBranch:A,gitPlatform:M,agentType:O,maxTurns:parseInt(G,10)||50,workspaceRoot:E||null,setupCommands:D||null,testCommand:F||null,ptyOutputFilter:parseInt(q,10)||0,pipeline:b}}),c.success(r("projects.project_saved")),l(`/projects/${a.key}`)}catch(Z){const pe=Z instanceof Error?Z.message:r("projects.failed_to_save_project");c.error(pe)}finally{h(!1)}}function le(){l(`/projects/${o}`)}async function ce(){if(!(!a||!x.trim())){u(!0);try{const t=await d.put(`web/projects/${a.key}/git-token`,{json:{token:x.trim()}}).json();N(t.gitTokenMasked),k(""),c.success(r("projects.git_token_saved"))}catch{c.error(r("projects.git_token_failed"))}finally{u(!1)}}}async function ie(){if(a){u(!0);try{await d.delete(`web/projects/${a.key}/git-token`),N(null),k(""),c.success(r("projects.git_token_cleared"))}catch{c.error(r("projects.git_token_failed"))}finally{u(!1)}}}async function de(){if(!(!a||!i)){W(!0);try{await d.delete(`web/projects/${a.key}/members`,{searchParams:{developerId:String(i.developerId)}}),await m()}catch{}finally{W(!1),_(null)}}}return re?e.jsx("div",{className:"flex justify-center py-20",children:e.jsx("div",{className:"h-8 w-8 animate-spin rounded-full border-4 border-[var(--border)] border-t-[var(--accent)]"})}):a?e.jsxs("form",{onSubmit:oe,className:"mx-auto max-w-6xl px-4 md:px-6 py-8",children:[e.jsxs("div",{className:"mb-2 text-xs text-[var(--text-muted)]",children:[e.jsx("span",{className:"cursor-pointer hover:text-[var(--text-secondary)]",onClick:()=>l("/projects"),children:r("projects.title")})," / ",e.jsx("span",{className:"cursor-pointer hover:text-[var(--text-secondary)]",onClick:()=>l(`/projects/${a.key}`),children:a.key})," / ",e.jsx("span",{className:"text-[var(--text-secondary)]",children:r("common.edit")})]}),e.jsx("h1",{className:"text-lg font-bold text-[var(--text-primary)] mb-4",children:r("projects.edit_project_title")}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[1fr_400px]",children:[e.jsxs("div",{className:"space-y-6",children:[e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.basic_info")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{label:r("projects.key"),children:e.jsx("input",{type:"text",value:a.key,readOnly:!0,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-muted)] outline-none opacity-60 cursor-not-allowed"})}),e.jsx(n,{label:r("projects.name"),children:e.jsx("input",{type:"text",value:g,onChange:t=>C(t.target.value),required:!0,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})}),e.jsx(n,{label:r("projects.repo_url"),children:e.jsx("input",{type:"text",value:y,onChange:t=>S(t.target.value),required:!0,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})}),e.jsxs(n,{label:r("projects.ssh_url"),children:[e.jsx("input",{type:"text",value:T,onChange:t=>I(t.target.value),placeholder:r("projects.ssh_url_placeholder"),className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"}),e.jsx("p",{className:"mt-1 text-[11px] text-[var(--text-muted)]",children:r("projects.ssh_url_hint")})]}),e.jsx(n,{label:r("projects.git_platform"),children:e.jsx(X,{value:M,onChange:t=>P(t),options:[{value:v.GITHUB,label:r("projects.github")},{value:v.GITLAB,label:r("projects.gitlab")},{value:v.GITEA,label:r("projects.gitea")}]})}),e.jsx(n,{label:r("projects.default_branch"),children:e.jsx("input",{type:"text",value:A,onChange:t=>R(t.target.value),className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})})]})]}),e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.agent_config")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{label:r("projects.agent_type"),children:e.jsx(X,{value:O,onChange:t=>U(t),options:Y})}),e.jsx(n,{label:r("projects.max_turns"),children:e.jsx("input",{type:"number",value:G,onChange:t=>$(t.target.value),min:1,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})}),e.jsx(n,{label:r("projects.workspace_root"),children:e.jsx("input",{type:"text",value:E,onChange:t=>B(t.target.value),placeholder:"/path/to/workspace",className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})})]})]}),e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.environment")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{label:r("projects.setup_commands"),children:e.jsx("textarea",{value:D,onChange:t=>L(t.target.value),rows:3,placeholder:`npm install
1
+ import{B as xe,f as ue,a as me,r as s,I as v,Q as be,h as d,j as e,L as ve,Z as V,t as c}from"./index-OBVbDpAB.js";import{S as X}from"./Select-tnanVDGG.js";import{U as je,A as he,R as ge}from"./RemoveMemberConfirmDialog-DZ2BIQVO.js";import{a as ye}from"./agent-type-options-D5TWJHLL.js";import{P as fe}from"./plus-D8LQpkpb.js";import"./chevron-down-DfH1OlZR.js";function Te(){const{key:o}=xe(),l=ue(),{t:r}=me(),Y=ye(t=>t),[a,ee]=s.useState(null),[j,te]=s.useState([]),[re,se]=s.useState(!0),[w,h]=s.useState(!1),[g,C]=s.useState(""),[y,S]=s.useState(""),[T,I]=s.useState(""),[M,P]=s.useState(v.GITHUB),[A,R]=s.useState(""),[O,U]=s.useState(be.CLAUDE),[G,$]=s.useState("50"),[E,B]=s.useState(""),[D,L]=s.useState(""),[F,J]=s.useState(""),[q,z]=s.useState("0"),[p,f]=s.useState(""),[H,N]=s.useState(null),[x,k]=s.useState(""),[K,u]=s.useState(!1),[ae,Q]=s.useState(!1),[i,_]=s.useState(null),[ne,W]=s.useState(!1),m=s.useCallback(async()=>{if(o)try{const[t,b]=await Promise.all([d.get(`web/projects/${o}`).json(),d.get(`web/projects/${o}/members`).json().catch(()=>[])]);if(ee(t),te(b),N(t.gitTokenMasked??null),C(t.name),S(t.repoUrl),I(t.sshUrl??""),P(t.gitPlatform),R(t.defaultBranch),U(t.agentType),$(String(t.maxTurns)),B(t.workspaceRoot??""),L(t.setupCommands??""),J(t.testCommand??""),z(String(t.ptyOutputFilter??0)),t.pipeline)try{f(JSON.stringify(JSON.parse(t.pipeline),null,2))}catch{f(t.pipeline)}}catch{}finally{se(!1)}},[o]);s.useEffect(()=>{m()},[m]);async function oe(t){if(t.preventDefault(),!a)return;h(!0);let b=null;if(p.trim())try{JSON.parse(p),b=p.trim()}catch{c.error(r("projects.invalid_pipeline_json")),h(!1);return}try{await d.put(`web/projects/${a.key}`,{json:{name:g,repoUrl:y,sshUrl:T||null,defaultBranch:A,gitPlatform:M,agentType:O,maxTurns:parseInt(G,10)||50,workspaceRoot:E||null,setupCommands:D||null,testCommand:F||null,ptyOutputFilter:parseInt(q,10)||0,pipeline:b}}),c.success(r("projects.project_saved")),l(`/projects/${a.key}`)}catch(Z){const pe=Z instanceof Error?Z.message:r("projects.failed_to_save_project");c.error(pe)}finally{h(!1)}}function le(){l(`/projects/${o}`)}async function ce(){if(!(!a||!x.trim())){u(!0);try{const t=await d.put(`web/projects/${a.key}/git-token`,{json:{token:x.trim()}}).json();N(t.gitTokenMasked),k(""),c.success(r("projects.git_token_saved"))}catch{c.error(r("projects.git_token_failed"))}finally{u(!1)}}}async function ie(){if(a){u(!0);try{await d.delete(`web/projects/${a.key}/git-token`),N(null),k(""),c.success(r("projects.git_token_cleared"))}catch{c.error(r("projects.git_token_failed"))}finally{u(!1)}}}async function de(){if(!(!a||!i)){W(!0);try{await d.delete(`web/projects/${a.key}/members`,{searchParams:{developerId:String(i.developerId)}}),await m()}catch{}finally{W(!1),_(null)}}}return re?e.jsx("div",{className:"flex justify-center py-20",children:e.jsx("div",{className:"h-8 w-8 animate-spin rounded-full border-4 border-[var(--border)] border-t-[var(--accent)]"})}):a?e.jsxs("form",{onSubmit:oe,className:"mx-auto max-w-6xl px-4 md:px-6 py-8",children:[e.jsxs("div",{className:"mb-2 text-xs text-[var(--text-muted)]",children:[e.jsx("span",{className:"cursor-pointer hover:text-[var(--text-secondary)]",onClick:()=>l("/projects"),children:r("projects.title")})," / ",e.jsx("span",{className:"cursor-pointer hover:text-[var(--text-secondary)]",onClick:()=>l(`/projects/${a.key}`),children:a.key})," / ",e.jsx("span",{className:"text-[var(--text-secondary)]",children:r("common.edit")})]}),e.jsx("h1",{className:"text-lg font-bold text-[var(--text-primary)] mb-4",children:r("projects.edit_project_title")}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[1fr_400px]",children:[e.jsxs("div",{className:"space-y-6",children:[e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.basic_info")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{label:r("projects.key"),children:e.jsx("input",{type:"text",value:a.key,readOnly:!0,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-muted)] outline-none opacity-60 cursor-not-allowed"})}),e.jsx(n,{label:r("projects.name"),children:e.jsx("input",{type:"text",value:g,onChange:t=>C(t.target.value),required:!0,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})}),e.jsx(n,{label:r("projects.repo_url"),children:e.jsx("input",{type:"text",value:y,onChange:t=>S(t.target.value),required:!0,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})}),e.jsxs(n,{label:r("projects.ssh_url"),children:[e.jsx("input",{type:"text",value:T,onChange:t=>I(t.target.value),placeholder:r("projects.ssh_url_placeholder"),className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"}),e.jsx("p",{className:"mt-1 text-[11px] text-[var(--text-muted)]",children:r("projects.ssh_url_hint")})]}),e.jsx(n,{label:r("projects.git_platform"),children:e.jsx(X,{value:M,onChange:t=>P(t),options:[{value:v.GITHUB,label:r("projects.github")},{value:v.GITLAB,label:r("projects.gitlab")},{value:v.GITEA,label:r("projects.gitea")}]})}),e.jsx(n,{label:r("projects.default_branch"),children:e.jsx("input",{type:"text",value:A,onChange:t=>R(t.target.value),className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})})]})]}),e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.agent_config")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{label:r("projects.agent_type"),children:e.jsx(X,{value:O,onChange:t=>U(t),options:Y})}),e.jsx(n,{label:r("projects.max_turns"),children:e.jsx("input",{type:"number",value:G,onChange:t=>$(t.target.value),min:1,className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})}),e.jsx(n,{label:r("projects.workspace_root"),children:e.jsx("input",{type:"text",value:E,onChange:t=>B(t.target.value),placeholder:"/path/to/workspace",className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})})]})]}),e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.environment")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{label:r("projects.setup_commands"),children:e.jsx("textarea",{value:D,onChange:t=>L(t.target.value),rows:3,placeholder:`npm install
2
2
  npm run build`,className:"w-full resize-y rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})}),e.jsx(n,{label:r("projects.post_command"),children:e.jsx("input",{type:"text",value:F,onChange:t=>J(t.target.value),placeholder:"npm test",className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})})]})]}),e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.security")}),e.jsx("div",{className:"space-y-3",children:e.jsx(n,{label:r("projects.pty_output_filter"),children:e.jsx("input",{type:"text",value:q,onChange:t=>z(t.target.value),className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"})})})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsx("h2",{className:"mb-4 text-sm font-semibold text-[var(--accent)]",children:r("projects.git_token")}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{label:r("projects.git_token_label"),children:e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:H??r("common.not_set")})})}),e.jsxs(n,{label:r("projects.git_token_set"),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"password",value:x,onChange:t=>k(t.target.value),placeholder:"ghp_xxxx...",className:"min-w-0 flex-1 rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]"}),e.jsx("button",{type:"button",disabled:K||!x.trim(),onClick:ce,className:"shrink-0 rounded-[4px] bg-[var(--accent)] px-3 py-2 text-xs font-medium text-black hover:opacity-90 transition-opacity disabled:opacity-50",children:r("common.save")})]}),e.jsx("p",{className:"mt-1 text-[11px] text-[var(--text-muted)]",children:r("projects.git_token_hint")})]}),H&&e.jsx("div",{className:"flex justify-end",children:e.jsx("button",{type:"button",disabled:K,onClick:ie,className:"rounded-[4px] border border-[var(--destructive)] px-3 py-1.5 text-xs text-[var(--destructive)] hover:opacity-70 transition-opacity disabled:opacity-50",children:r("projects.git_token_clear")})})]})]}),e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsxs("div",{className:"mb-4 flex items-center justify-between",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--accent)]",children:r("projects.pipeline_section")}),e.jsx(ve,{to:"/projects/"+o+"/pipeline",className:"text-xs text-[var(--accent)] hover:underline",children:r("projects.edit_pipeline")})]}),e.jsx("textarea",{value:p,onChange:t=>f(t.target.value),rows:20,spellCheck:!1,placeholder:'{"stages": []}',className:"w-full resize-y rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] outline-none focus:border-[var(--accent)]",style:{fontFamily:'"JetBrains Mono", monospace',textTransform:"none"}})]}),e.jsxs("section",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-5",children:[e.jsxs("div",{className:"mb-4 flex items-center justify-between",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--accent)]",children:r("projects.members")}),e.jsxs("button",{type:"button",onClick:()=>Q(!0),className:"flex items-center gap-1.5 rounded-[4px] bg-[var(--accent)] px-3 py-1.5 text-xs font-medium text-black",children:[e.jsx(fe,{className:"h-3.5 w-3.5"}),r("projects.add_member")]})]}),j.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-6",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:r("projects.no_members_yet")})]}):e.jsx("div",{className:"space-y-2",children:j.map(t=>e.jsxs("div",{className:"flex items-center justify-between rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-7 w-7 items-center justify-center rounded-full bg-[var(--accent)]/20 text-xs font-bold text-[var(--accent)]",children:(t.developerName??String(t.developerId)).charAt(0).toUpperCase()}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-[var(--text-primary)]",children:t.developerName??`#${t.developerId}`}),e.jsx("span",{className:"ml-2 rounded-[4px] px-1.5 py-0.5 text-[11px] font-medium",style:{color:t.role===V.MAINTAINER?"var(--warning)":"var(--text-secondary)",background:t.role===V.MAINTAINER?"rgba(245,158,11,0.1)":"rgba(163,163,163,0.1)"},children:t.role})]})]}),e.jsx("button",{type:"button",onClick:()=>_(t),className:"text-[var(--destructive)] hover:opacity-70 transition-opacity","aria-label":r("projects.remove_member"),children:e.jsx(je,{className:"h-3.5 w-3.5"})})]},t.developerId))})]})]})]}),e.jsxs("div",{className:"mt-8 flex items-center justify-end gap-3 border-t border-[var(--border)] pt-6",children:[e.jsx("button",{type:"button",onClick:le,className:"rounded-[4px] border border-[var(--border)] bg-transparent px-4 py-2 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors",children:r("common.discard")}),e.jsx("button",{type:"submit",disabled:w||!g||!y,className:"rounded-[4px] bg-[var(--accent)] px-4 py-2 text-xs font-medium text-black hover:opacity-90 transition-opacity disabled:opacity-50",children:r(w?"common.saving":"projects.save_changes")})]}),e.jsx(he,{isOpen:ae,onClose:()=>Q(!1),projectKey:a.key,existingMemberIds:j.map(t=>t.developerId),onAdded:m}),e.jsx(ge,{isOpen:!!i,onClose:()=>_(null),onConfirm:de,memberName:i?i.developerName??`#${i.developerId}`:"",loading:ne})]}):e.jsxs("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 text-center",children:[e.jsx("p",{className:"text-sm text-[var(--text-muted)]",children:r("projects.project_not_found")}),e.jsx("button",{onClick:()=>l("/projects"),className:"mt-4 rounded-[4px] border border-[var(--border)] bg-transparent px-4 py-2 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)]",children:r("projects.back_to_projects")})]})}function n({label:o,children:l}){return e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start gap-1 sm:gap-3",children:[e.jsx("label",{className:"sm:w-36 shrink-0 sm:pt-2 text-xs text-[var(--text-muted)]",children:o}),e.jsx("div",{className:"min-w-0 flex-1",children:l})]})}export{Te as default};
@@ -1,4 +1,4 @@
1
- import{c as o,j as e}from"./index-CuZrCrRX.js";/**
1
+ import{c as o,j as e}from"./index-OBVbDpAB.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{j as e}from"./index-CuZrCrRX.js";import{a as r}from"./DocsPrimitives-Beo_PA0s.js";import"./copy-mNrO3LXa.js";function d(){return e.jsxs("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// environment variables"}),e.jsx("p",{className:"mt-2 text-xs text-[var(--text-muted)]",children:"configuration reference for server and worker environment variables."})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> server variables"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"server configuration is stored in ~/.overlord/.env. these variables are set during overlord install and can be manually edited."}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"variable"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"default"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"SERVER_PORT"})}),e.jsx("td",{className:"py-2 pr-4",children:"9000"}),e.jsx("td",{className:"py-2",children:"http/ws port"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"DB_PATH"})}),e.jsx("td",{className:"py-2 pr-4",children:"~/.overlord/data/overlord.db"}),e.jsx("td",{className:"py-2",children:"sqlite database path"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"REDIS_URL"})}),e.jsx("td",{className:"py-2 pr-4",children:"redis://localhost:6379"}),e.jsx("td",{className:"py-2",children:"redis connection url"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"JWT_SECRET"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"jwt signing secret (auto-generated during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"WORKER_JWT_SECRET"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"worker jwt signing secret (auto-generated during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"ENCRYPTION_KEY"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"encryption key for sensitive data at rest (auto-generated during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"CORS_ORIGIN"})}),e.jsx("td",{className:"py-2 pr-4",children:"*"}),e.jsx("td",{className:"py-2",children:"allowed cors origins (comma-separated)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WEB_URL"})}),e.jsx("td",{className:"py-2 pr-4",children:"http://localhost:9000"}),e.jsx("td",{className:"py-2",children:"public url for notification links and bot cards (configured during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"GIT_TOKEN"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"git platform authentication token for mr/pr operations"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"TUNNEL_TTL_HOURS"})}),e.jsx("td",{className:"py-2 pr-4",children:"4"}),e.jsx("td",{className:"py-2",children:"cursor tunnel expiration in hours (max 24)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LOG_LEVEL"})}),e.jsx("td",{className:"py-2 pr-4",children:"info"}),e.jsx("td",{className:"py-2",children:"log level: fatal, error, warn, info, debug, trace"})]})]})]})}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"never expose JWT_SECRET, WORKER_JWT_SECRET, or ENCRYPTION_KEY. these are generated automatically during installation and should not be shared or committed to version control."})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> log levels"}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"level"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"fatal"})}),e.jsx("td",{className:"py-2",children:"critical errors causing shutdown"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"error"})}),e.jsx("td",{className:"py-2",children:"runtime errors"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"warn"})}),e.jsx("td",{className:"py-2",children:"warnings"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"info"})}),e.jsx("td",{className:"py-2",children:"general operational info"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"debug"})}),e.jsx("td",{className:"py-2",children:"detailed debugging info"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"trace"})}),e.jsx("td",{className:"py-2",children:"very verbose tracing"})]})]})]})})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> worker variables"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"worker configuration is stored in ~/.overlord-worker/.env. these are set during overlord setup worker."}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"variable"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"default"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_HOST"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"server url (required)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WORKER_TOKEN"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"one-time registration token"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WORKER_NAME"})}),e.jsx("td",{className:"py-2 pr-4",children:"hostname"}),e.jsx("td",{className:"py-2",children:"display name for this worker"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WORKSPACE_ROOT"})}),e.jsx("td",{className:"py-2 pr-4",children:"~/.overlord-worker/workspaces"}),e.jsx("td",{className:"py-2",children:"directory for task workspaces"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_MAX_SLOTS"})}),e.jsx("td",{className:"py-2 pr-4",children:"2"}),e.jsx("td",{className:"py-2",children:"maximum concurrent tasks"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_DATA_DIR"})}),e.jsx("td",{className:"py-2 pr-4",children:"~/.overlord-worker"}),e.jsx("td",{className:"py-2",children:"config and jwt storage directory"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_SSH_KEY_PATH"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"ssh key for git clone/push operations"})]})]})]})}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"OVERLORD_WORKER_TOKEN is consumed on first registration. after that, the worker uses a jwt for authentication. the token field can remain in the .env file but will not be used again."})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> redis configuration"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"redis is required for the server (used for bullmq task queue and pub/sub). recommended setting:"}),e.jsx("pre",{className:"rounded-[4px] bg-[var(--bg-primary)] px-3 py-2 text-xs text-[var(--text-secondary)] overflow-x-auto",children:"appendonly yes"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"redis must have aof persistence enabled to minimize queue data loss on restart."})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> llm configuration"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"optional llm integration that powers two features: (1) auto-generating concise task names and branch slugs from descriptions, and (2) natural language command parsing (nlu) — when a bot message doesn't match any structured command, the llm classifies the intent and extracts parameters. supports anthropic native api and any openai-compatible provider. without these variables, both features are disabled."}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"variable"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"required"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"default"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_BASE_URL"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:'llm api base url. supports anthropic native api (url contains "anthropic") and openai-compatible format. leave empty to disable both task naming and nlu.'})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_API_KEY"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"api key for the llm service. required when LLM_BASE_URL is set."})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_MODEL"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"claude-haiku-4-5-20251001"}),e.jsx("td",{className:"py-2",children:"model identifier used for both task naming and nlu."})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_MAX_DESCRIPTION_LENGTH"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"4000"}),e.jsx("td",{className:"py-2",children:"max description chars sent to llm for task naming; nlu uses a separate internal cap."})]})]})]})}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-2",children:"provider examples:"}),e.jsx(r,{code:`# anthropic (claude) — native messages api, auto-detected
1
+ import{j as e}from"./index-OBVbDpAB.js";import{a as r}from"./DocsPrimitives-Sl_VYTFo.js";import"./copy-DYDGVR2b.js";function d(){return e.jsxs("div",{className:"mx-auto max-w-4xl px-4 md:px-6 py-8 font-mono lowercase",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// environment variables"}),e.jsx("p",{className:"mt-2 text-xs text-[var(--text-muted)]",children:"configuration reference for server and worker environment variables."})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> server variables"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"server configuration is stored in ~/.overlord/.env. these variables are set during overlord install and can be manually edited."}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"variable"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"default"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"SERVER_PORT"})}),e.jsx("td",{className:"py-2 pr-4",children:"9000"}),e.jsx("td",{className:"py-2",children:"http/ws port"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"DB_PATH"})}),e.jsx("td",{className:"py-2 pr-4",children:"~/.overlord/data/overlord.db"}),e.jsx("td",{className:"py-2",children:"sqlite database path"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"REDIS_URL"})}),e.jsx("td",{className:"py-2 pr-4",children:"redis://localhost:6379"}),e.jsx("td",{className:"py-2",children:"redis connection url"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"JWT_SECRET"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"jwt signing secret (auto-generated during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"WORKER_JWT_SECRET"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"worker jwt signing secret (auto-generated during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"ENCRYPTION_KEY"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"encryption key for sensitive data at rest (auto-generated during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"CORS_ORIGIN"})}),e.jsx("td",{className:"py-2 pr-4",children:"*"}),e.jsx("td",{className:"py-2",children:"allowed cors origins (comma-separated)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WEB_URL"})}),e.jsx("td",{className:"py-2 pr-4",children:"http://localhost:9000"}),e.jsx("td",{className:"py-2",children:"public url for notification links and bot cards (configured during install)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"GIT_TOKEN"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"git platform authentication token for mr/pr operations"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"TUNNEL_TTL_HOURS"})}),e.jsx("td",{className:"py-2 pr-4",children:"4"}),e.jsx("td",{className:"py-2",children:"cursor tunnel expiration in hours (max 24)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LOG_LEVEL"})}),e.jsx("td",{className:"py-2 pr-4",children:"info"}),e.jsx("td",{className:"py-2",children:"log level: fatal, error, warn, info, debug, trace"})]})]})]})}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"never expose JWT_SECRET, WORKER_JWT_SECRET, or ENCRYPTION_KEY. these are generated automatically during installation and should not be shared or committed to version control."})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> log levels"}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"level"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"fatal"})}),e.jsx("td",{className:"py-2",children:"critical errors causing shutdown"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"error"})}),e.jsx("td",{className:"py-2",children:"runtime errors"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"warn"})}),e.jsx("td",{className:"py-2",children:"warnings"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"info"})}),e.jsx("td",{className:"py-2",children:"general operational info"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"debug"})}),e.jsx("td",{className:"py-2",children:"detailed debugging info"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"trace"})}),e.jsx("td",{className:"py-2",children:"very verbose tracing"})]})]})]})})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> worker variables"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"worker configuration is stored in ~/.overlord-worker/.env. these are set during overlord setup worker."}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"variable"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"default"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_HOST"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"server url (required)"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WORKER_TOKEN"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"one-time registration token"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WORKER_NAME"})}),e.jsx("td",{className:"py-2 pr-4",children:"hostname"}),e.jsx("td",{className:"py-2",children:"display name for this worker"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_WORKSPACE_ROOT"})}),e.jsx("td",{className:"py-2 pr-4",children:"~/.overlord-worker/workspaces"}),e.jsx("td",{className:"py-2",children:"directory for task workspaces"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_MAX_SLOTS"})}),e.jsx("td",{className:"py-2 pr-4",children:"2"}),e.jsx("td",{className:"py-2",children:"maximum concurrent tasks"})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_DATA_DIR"})}),e.jsx("td",{className:"py-2 pr-4",children:"~/.overlord-worker"}),e.jsx("td",{className:"py-2",children:"config and jwt storage directory"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"OVERLORD_SSH_KEY_PATH"})}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"ssh key for git clone/push operations"})]})]})]})}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"OVERLORD_WORKER_TOKEN is consumed on first registration. after that, the worker uses a jwt for authentication. the token field can remain in the .env file but will not be used again."})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> redis configuration"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"redis is required for the server (used for bullmq task queue and pub/sub). recommended setting:"}),e.jsx("pre",{className:"rounded-[4px] bg-[var(--bg-primary)] px-3 py-2 text-xs text-[var(--text-secondary)] overflow-x-auto",children:"appendonly yes"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"redis must have aof persistence enabled to minimize queue data loss on restart."})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4 space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> llm configuration"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"optional llm integration that powers two features: (1) auto-generating concise task names and branch slugs from descriptions, and (2) natural language command parsing (nlu) — when a bot message doesn't match any structured command, the llm classifies the intent and extracts parameters. supports anthropic native api and any openai-compatible provider. without these variables, both features are disabled."}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"variable"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"required"}),e.jsx("th",{className:"py-2 pr-4 text-left text-[var(--text-muted)]",children:"default"}),e.jsx("th",{className:"py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsxs("tbody",{className:"text-[var(--text-secondary)]",children:[e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_BASE_URL"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:'llm api base url. supports anthropic native api (url contains "anthropic") and openai-compatible format. leave empty to disable both task naming and nlu.'})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_API_KEY"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"—"}),e.jsx("td",{className:"py-2",children:"api key for the llm service. required when LLM_BASE_URL is set."})]}),e.jsxs("tr",{className:"border-b border-[var(--border)]",children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_MODEL"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"claude-haiku-4-5-20251001"}),e.jsx("td",{className:"py-2",children:"model identifier used for both task naming and nlu."})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"LLM_MAX_DESCRIPTION_LENGTH"})}),e.jsx("td",{className:"py-2 pr-4",children:"optional"}),e.jsx("td",{className:"py-2 pr-4",children:"4000"}),e.jsx("td",{className:"py-2",children:"max description chars sent to llm for task naming; nlu uses a separate internal cap."})]})]})]})}),e.jsx("p",{className:"text-xs text-[var(--text-muted)] mt-2",children:"provider examples:"}),e.jsx(r,{code:`# anthropic (claude) — native messages api, auto-detected
2
2
  LLM_BASE_URL=https://api.anthropic.com
3
3
  LLM_API_KEY=sk-ant-api03-...
4
4
  LLM_MODEL=claude-haiku-4-5-20251001
@@ -1 +1 @@
1
- import{f as z,a as K,i as H,k as D,r as $,j as e,L as p,l as I,m as B,W as w,h}from"./index-CuZrCrRX.js";import{T as R}from"./TaskStatusBadge-Corb-4yR.js";import{T as g}from"./Skeleton-BgqnK2cB.js";import{O as G}from"./OnboardingGuide-DV4KLWmI.js";import{f as _}from"./date-CmcdoD87.js";import{g as V}from"./status-colors-Bq7c453S.js";import{u as b}from"./useFetch-CoPiRYNS.js";import{T as q}from"./Tooltip-BE58Ef5C.js";import{A as v}from"./arrow-right-CNUsZnIR.js";import"./chevron-right-D45D0HpI.js";const Y=3e5,J=[{type:"fraction",numerator:"active_tasks",denominator:"queued_tasks",labelKey:"dashboard.tasks_active_queued"},{type:"simple",key:"online_workers",labelKey:"dashboard.online_workers"},{type:"simple",key:"completed_today",labelKey:"dashboard.completed_all_today"},{type:"simple",key:"completed_by_user_today",labelKey:"dashboard.completed_by_you_today"}],Q=["sun","mon","tue","wed","thu","fri","sat"];function U(){const n=new Date;return Array.from({length:7},(a,i)=>{const r=new Date(n);r.setDate(r.getDate()-(6-i));const c=String(r.getMonth()+1).padStart(2,"0"),l=String(r.getDate()).padStart(2,"0");return{label:Q[r.getDay()],date:`${c}/${l}`}})}function X({dailyRates:n,dailyCounts:a,overallRate:i}){const{t:r}=K(),c=U(),l=a.reduce((t,o)=>t+o,0),u=Math.max(...a,1);return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-3 flex items-baseline gap-2",children:[e.jsx("span",{className:"text-2xl font-bold text-[var(--text-primary)]",children:l}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:r("dashboard.last_7_days")}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:"·"}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)]",children:[r("dashboard.success_rate"),": ",i,"%"]})]}),e.jsx("div",{className:"flex gap-2",style:{height:80},children:c.map(({label:t,date:o},j)=>{const x=a[j]??0,m=n[j]??0,f=r(x===1?"dashboard.task_total":"dashboard.tasks_total"),N=u>0?Math.max(x/u*100,4):4;return e.jsxs(q,{content:`${t} ${o} — ${x} ${f} (${m}%)`,className:"flex flex-1 flex-col items-center gap-1",children:[e.jsx("div",{className:"relative w-full h-full rounded-[4px] cursor-default",style:{backgroundColor:"rgba(34,197,94,0.1)"},children:e.jsx("div",{className:"absolute bottom-0 left-0 right-0 rounded-[4px]",style:{height:`${N}%`,backgroundColor:m>=80?"var(--accent)":m>=50?"var(--warning)":"var(--destructive)"}})}),e.jsx("span",{className:"shrink-0 text-[11px] text-[var(--text-muted)]",children:t})]},t)})})]})}function oe(){const n=z(),{t:a}=K(),i=H(),r=D(s=>s.taskSeq),c=D(s=>s.workerSeq),[l,u]=$.useState(0),{data:t,loading:o}=b(()=>h.get("web/dashboard/stats",{searchParams:{tz:String(new Date().getTimezoneOffset())}}).json(),[l,r,c]),{data:j,loading:x}=b(()=>h.get("web/dashboard/recent-tasks",{searchParams:{limit:"5"}}).json(),[l,r]),{data:m,loading:f}=b(()=>h.get("web/workers").json(),[l,c]),{data:N,loading:E}=b(()=>h.get("web/projects").json(),[l]),{data:O,loading:M}=b(()=>h.get("web/dashboard/recent-activity").json(),[]);$.useEffect(()=>{const s=setInterval(()=>{u(d=>d+1)},Y);return()=>clearInterval(s)},[]);const S=(t==null?void 0:t.success_rate_daily)??null,T=(t==null?void 0:t.task_count_daily)??[],W=(t==null?void 0:t.task_success_rate_7d)??0,L=j??[],y=m??[],C=N??[],A=O??[];function F(s){switch(s){case w.ONLINE:return a("dashboard.online");case w.DRAINING:return a("dashboard.idle");case w.OFFLINE:default:return a("dashboard.offline")}}function P(s){return a(s===1?"dashboard.task_total":"dashboard.tasks_total")}return e.jsxs("div",{className:"mx-auto max-w-6xl overflow-hidden px-2 py-4 md:px-4 md:py-6 font-mono",children:[e.jsx("div",{className:"mb-6 md:mb-8 grid grid-cols-2 gap-3 md:gap-4 lg:grid-cols-4",children:J.map(s=>e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-3 md:p-4",children:[e.jsxs("span",{className:"text-[11px] md:text-xs text-[var(--text-muted)]",children:[a(s.labelKey),":"]}),o?e.jsx("div",{className:"mt-1 h-6 md:h-8 w-12 md:w-16 animate-pulse rounded-[4px] bg-[var(--bg-input)]"}):e.jsx("div",{className:"mt-1 flex items-baseline gap-2",children:s.type==="fraction"?e.jsxs("span",{className:"text-2xl md:text-3xl font-bold text-[var(--text-primary)]",children:[(t==null?void 0:t[s.numerator])??0,e.jsx("span",{className:"text-base md:text-lg font-normal text-[var(--text-muted)]",children:"/"}),(t==null?void 0:t[s.denominator])??0]}):e.jsx("span",{className:"text-2xl md:text-3xl font-bold text-[var(--text-primary)]",children:(t==null?void 0:t[s.key])??0})})]},s.labelKey))}),e.jsx(G,{data:{activeTasks:((t==null?void 0:t.active_tasks)??0)+((t==null?void 0:t.queued_tasks)??0),totalWorkers:y.length,totalProjects:(t==null?void 0:t.project_count)??0,totalDevelopers:(t==null?void 0:t.developer_count)??0}}),e.jsxs("div",{className:"mb-6 grid gap-6 lg:grid-cols-3 items-stretch",children:[e.jsx("div",{className:"flex flex-col gap-6 lg:col-span-2",children:e.jsxs("div",{className:"flex flex-1 flex-col rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsx("div",{className:"border-b border-[var(--border)] px-5 py-3",children:e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.task_count")})}),e.jsx("div",{className:"flex flex-1 flex-col justify-center p-5",children:o?e.jsx("div",{className:"h-24 animate-pulse rounded-[4px] bg-[var(--bg-input)]"}):S?e.jsx(X,{dailyRates:S,dailyCounts:T,overallRate:W}):e.jsxs("div",{className:"flex flex-col items-center gap-2 py-6",children:[e.jsx("span",{className:"text-2xl font-bold text-[var(--text-primary)]",children:T.reduce((s,d)=>s+d,0)}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.daily_breakdown_not_available")})]})})]})}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] md:border",children:[e.jsxs("div",{className:"hidden md:flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.recent_tasks")}),e.jsxs(p,{to:"/tasks",className:"flex items-center gap-1 text-xs text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"flex md:hidden items-center justify-between px-3 py-3",children:e.jsx("h2",{className:"text-xs font-bold text-[var(--accent)]",children:a("dashboard.recent_tasks")})}),e.jsx("div",{className:"px-3 pb-3 md:px-5 md:pb-4 md:pt-0",children:x?e.jsx(g,{rows:4}):L.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.no_tasks_yet")})]}):e.jsx("div",{className:"flex flex-col gap-2 md:gap-0",children:L.map(s=>e.jsxs("div",{onClick:()=>n(`/tasks/${s.id}`),className:"flex cursor-pointer items-center gap-3 rounded-[4px] border border-[var(--border)] p-3 transition-colors hover:bg-[var(--bg-input)] md:rounded-none md:border-0 md:border-b md:border-[var(--border-row)] md:p-0 md:py-2.5 last:md:border-b-0",children:[e.jsxs("div",{className:"flex-1 min-w-0 md:hidden",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("span",{className:"text-[11px] text-[var(--text-primary)] leading-tight line-clamp-2 preserve-case",title:B(s),children:["#",s.id," ",I(s)]}),e.jsx("span",{className:"shrink-0",children:e.jsx(R,{status:s.status})})]}),e.jsx("span",{className:"text-[11px] text-[var(--text-muted)] mt-1 block",children:_(s.createdAt)})]}),e.jsxs("span",{className:"hidden md:inline shrink-0 text-xs text-[var(--text-muted)]",children:["#",s.id]}),e.jsx("span",{className:"hidden md:inline flex-1 text-xs text-[var(--text-primary)] truncate preserve-case",children:e.jsx(q,{content:s.description,children:I(s,40)})}),e.jsx("span",{className:"hidden md:inline",children:e.jsx(R,{status:s.status})}),e.jsx("span",{className:"hidden md:inline shrink-0 text-xs text-[var(--text-muted)]",children:_(s.createdAt)})]},s.id))})})]})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsxs("div",{className:"hidden md:flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.workers")}),e.jsxs(p,{to:"/workers",className:"flex items-center gap-1 text-xs text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsxs("div",{className:"flex md:hidden items-center justify-between border-b border-[var(--border)] px-3 py-3",children:[e.jsx("h2",{className:"text-xs font-bold text-[var(--accent)]",children:a("dashboard.workers")}),e.jsxs(p,{to:"/workers",className:"flex items-center gap-1 text-[11px] text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"p-4",children:f?e.jsx(g,{rows:3}):y.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.no_workers_registered")})]}):e.jsx("div",{className:"flex flex-col",children:y.map(s=>e.jsxs("div",{onClick:()=>n(`/workers/${s.id}`),className:"flex cursor-pointer items-center justify-between border-b border-[var(--border-row)] py-2.5 transition-colors hover:bg-[var(--bg-input)] last:border-b-0",children:[e.jsxs("div",{className:"min-w-0 flex-1 flex flex-col gap-0.5",children:[e.jsx("span",{className:"truncate text-xs text-[var(--text-primary)]",children:s.name}),e.jsx("span",{className:"truncate text-xs text-[var(--text-muted)]",children:s.host??"--"})]}),e.jsxs("div",{className:"shrink-0 flex items-center gap-3",children:[e.jsxs("span",{className:"text-xs text-[var(--text-secondary)]",children:[s.activeSlots,"/",s.maxSlots," ",a("dashboard.slots")]}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs",style:{color:V(s.status)},children:[e.jsx("span",{style:{fontSize:"0.5rem"},children:"●"}),F(s.status)]})]})]},s.id))})})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] md:hidden",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-3 py-3",children:[e.jsx("h2",{className:"text-xs font-bold text-[var(--accent)]",children:a("dashboard.projects")}),e.jsxs(p,{to:"/projects",className:"flex items-center gap-1 text-[11px] text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"p-3",children:E?e.jsx(g,{rows:3}):C.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("projects.no_projects_yet")})]}):e.jsx("div",{className:"flex flex-col gap-2",children:C.map(s=>{const d=s.taskCount??0;return e.jsxs("div",{onClick:()=>n(`/projects/${s.key}`),className:"cursor-pointer rounded-[4px] border border-[var(--border)] p-3 transition-colors hover:bg-[var(--bg-input)]",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"min-w-0 truncate text-xs font-medium text-[var(--accent)]",children:s.key}),e.jsxs("span",{className:"shrink-0 text-[11px] text-[var(--text-muted)]",children:[d," ",P(d)]})]}),e.jsx("span",{className:"mt-1 block text-[11px] text-[var(--text-primary)]",children:s.name}),e.jsx("span",{className:"mt-0.5 block text-[11px] text-[var(--text-muted)]",children:s.agentType})]},s.key)})})})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.recent_activity")}),i&&e.jsxs(p,{to:"/admin/audit-logs",className:"flex items-center gap-1 text-xs text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"p-3 md:p-4",children:M?e.jsx(g,{rows:4}):A.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.no_recent_activity")})]}):e.jsx("div",{className:"flex flex-col",children:A.map(s=>{const d=s.message.match(/task\s*#?(\d+)/i),k=d?d[1]:null;return e.jsxs("div",{className:`flex min-w-0 flex-col gap-1 rounded-[4px] border-b border-[var(--border-row)] px-2 py-2 transition-colors last:border-b-0 md:flex-row md:items-start md:gap-3 md:rounded-none md:px-0 ${k?"cursor-pointer hover:bg-[var(--bg-input)]":""}`,onClick:()=>k&&n(`/tasks/${k}`),children:[e.jsx("span",{className:"shrink-0 whitespace-nowrap text-[11px] text-[var(--text-muted)] md:text-xs",children:_(s.timestamp)}),e.jsx("span",{className:"min-w-0 break-words text-[11px] leading-relaxed text-[var(--text-secondary)] md:truncate md:text-xs md:leading-normal",children:s.message})]},s.id)})})})]})]})]})}export{oe as default};
1
+ import{f as z,a as K,i as H,k as D,r as $,j as e,L as p,l as I,m as B,W as w,h}from"./index-OBVbDpAB.js";import{T as R}from"./TaskStatusBadge-BbcEINkn.js";import{T as g}from"./Skeleton-Dv9dOtKo.js";import{O as G}from"./OnboardingGuide-BdvsQUOR.js";import{f as _}from"./date-CmcdoD87.js";import{g as V}from"./status-colors-DripE1Ev.js";import{u as b}from"./useFetch-BJHAN5c6.js";import{T as q}from"./Tooltip-BzmNCQBI.js";import{A as v}from"./arrow-right-D2JA1tPb.js";import"./chevron-right-QFYBmRJj.js";const Y=3e5,J=[{type:"fraction",numerator:"active_tasks",denominator:"queued_tasks",labelKey:"dashboard.tasks_active_queued"},{type:"simple",key:"online_workers",labelKey:"dashboard.online_workers"},{type:"simple",key:"completed_today",labelKey:"dashboard.completed_all_today"},{type:"simple",key:"completed_by_user_today",labelKey:"dashboard.completed_by_you_today"}],Q=["sun","mon","tue","wed","thu","fri","sat"];function U(){const n=new Date;return Array.from({length:7},(a,i)=>{const r=new Date(n);r.setDate(r.getDate()-(6-i));const c=String(r.getMonth()+1).padStart(2,"0"),l=String(r.getDate()).padStart(2,"0");return{label:Q[r.getDay()],date:`${c}/${l}`}})}function X({dailyRates:n,dailyCounts:a,overallRate:i}){const{t:r}=K(),c=U(),l=a.reduce((t,o)=>t+o,0),u=Math.max(...a,1);return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-3 flex items-baseline gap-2",children:[e.jsx("span",{className:"text-2xl font-bold text-[var(--text-primary)]",children:l}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:r("dashboard.last_7_days")}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:"·"}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)]",children:[r("dashboard.success_rate"),": ",i,"%"]})]}),e.jsx("div",{className:"flex gap-2",style:{height:80},children:c.map(({label:t,date:o},j)=>{const x=a[j]??0,m=n[j]??0,f=r(x===1?"dashboard.task_total":"dashboard.tasks_total"),N=u>0?Math.max(x/u*100,4):4;return e.jsxs(q,{content:`${t} ${o} — ${x} ${f} (${m}%)`,className:"flex flex-1 flex-col items-center gap-1",children:[e.jsx("div",{className:"relative w-full h-full rounded-[4px] cursor-default",style:{backgroundColor:"rgba(34,197,94,0.1)"},children:e.jsx("div",{className:"absolute bottom-0 left-0 right-0 rounded-[4px]",style:{height:`${N}%`,backgroundColor:m>=80?"var(--accent)":m>=50?"var(--warning)":"var(--destructive)"}})}),e.jsx("span",{className:"shrink-0 text-[11px] text-[var(--text-muted)]",children:t})]},t)})})]})}function oe(){const n=z(),{t:a}=K(),i=H(),r=D(s=>s.taskSeq),c=D(s=>s.workerSeq),[l,u]=$.useState(0),{data:t,loading:o}=b(()=>h.get("web/dashboard/stats",{searchParams:{tz:String(new Date().getTimezoneOffset())}}).json(),[l,r,c]),{data:j,loading:x}=b(()=>h.get("web/dashboard/recent-tasks",{searchParams:{limit:"5"}}).json(),[l,r]),{data:m,loading:f}=b(()=>h.get("web/workers").json(),[l,c]),{data:N,loading:E}=b(()=>h.get("web/projects").json(),[l]),{data:O,loading:M}=b(()=>h.get("web/dashboard/recent-activity").json(),[]);$.useEffect(()=>{const s=setInterval(()=>{u(d=>d+1)},Y);return()=>clearInterval(s)},[]);const S=(t==null?void 0:t.success_rate_daily)??null,T=(t==null?void 0:t.task_count_daily)??[],W=(t==null?void 0:t.task_success_rate_7d)??0,L=j??[],y=m??[],C=N??[],A=O??[];function F(s){switch(s){case w.ONLINE:return a("dashboard.online");case w.DRAINING:return a("dashboard.idle");case w.OFFLINE:default:return a("dashboard.offline")}}function P(s){return a(s===1?"dashboard.task_total":"dashboard.tasks_total")}return e.jsxs("div",{className:"mx-auto max-w-6xl overflow-hidden px-2 py-4 md:px-4 md:py-6 font-mono",children:[e.jsx("div",{className:"mb-6 md:mb-8 grid grid-cols-2 gap-3 md:gap-4 lg:grid-cols-4",children:J.map(s=>e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-3 md:p-4",children:[e.jsxs("span",{className:"text-[11px] md:text-xs text-[var(--text-muted)]",children:[a(s.labelKey),":"]}),o?e.jsx("div",{className:"mt-1 h-6 md:h-8 w-12 md:w-16 animate-pulse rounded-[4px] bg-[var(--bg-input)]"}):e.jsx("div",{className:"mt-1 flex items-baseline gap-2",children:s.type==="fraction"?e.jsxs("span",{className:"text-2xl md:text-3xl font-bold text-[var(--text-primary)]",children:[(t==null?void 0:t[s.numerator])??0,e.jsx("span",{className:"text-base md:text-lg font-normal text-[var(--text-muted)]",children:"/"}),(t==null?void 0:t[s.denominator])??0]}):e.jsx("span",{className:"text-2xl md:text-3xl font-bold text-[var(--text-primary)]",children:(t==null?void 0:t[s.key])??0})})]},s.labelKey))}),e.jsx(G,{data:{activeTasks:((t==null?void 0:t.active_tasks)??0)+((t==null?void 0:t.queued_tasks)??0),totalWorkers:y.length,totalProjects:(t==null?void 0:t.project_count)??0,totalDevelopers:(t==null?void 0:t.developer_count)??0}}),e.jsxs("div",{className:"mb-6 grid gap-6 lg:grid-cols-3 items-stretch",children:[e.jsx("div",{className:"flex flex-col gap-6 lg:col-span-2",children:e.jsxs("div",{className:"flex flex-1 flex-col rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsx("div",{className:"border-b border-[var(--border)] px-5 py-3",children:e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.task_count")})}),e.jsx("div",{className:"flex flex-1 flex-col justify-center p-5",children:o?e.jsx("div",{className:"h-24 animate-pulse rounded-[4px] bg-[var(--bg-input)]"}):S?e.jsx(X,{dailyRates:S,dailyCounts:T,overallRate:W}):e.jsxs("div",{className:"flex flex-col items-center gap-2 py-6",children:[e.jsx("span",{className:"text-2xl font-bold text-[var(--text-primary)]",children:T.reduce((s,d)=>s+d,0)}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.daily_breakdown_not_available")})]})})]})}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] md:border",children:[e.jsxs("div",{className:"hidden md:flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.recent_tasks")}),e.jsxs(p,{to:"/tasks",className:"flex items-center gap-1 text-xs text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"flex md:hidden items-center justify-between px-3 py-3",children:e.jsx("h2",{className:"text-xs font-bold text-[var(--accent)]",children:a("dashboard.recent_tasks")})}),e.jsx("div",{className:"px-3 pb-3 md:px-5 md:pb-4 md:pt-0",children:x?e.jsx(g,{rows:4}):L.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.no_tasks_yet")})]}):e.jsx("div",{className:"flex flex-col gap-2 md:gap-0",children:L.map(s=>e.jsxs("div",{onClick:()=>n(`/tasks/${s.id}`),className:"flex cursor-pointer items-center gap-3 rounded-[4px] border border-[var(--border)] p-3 transition-colors hover:bg-[var(--bg-input)] md:rounded-none md:border-0 md:border-b md:border-[var(--border-row)] md:p-0 md:py-2.5 last:md:border-b-0",children:[e.jsxs("div",{className:"flex-1 min-w-0 md:hidden",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("span",{className:"text-[11px] text-[var(--text-primary)] leading-tight line-clamp-2 preserve-case",title:B(s),children:["#",s.id," ",I(s)]}),e.jsx("span",{className:"shrink-0",children:e.jsx(R,{status:s.status})})]}),e.jsx("span",{className:"text-[11px] text-[var(--text-muted)] mt-1 block",children:_(s.createdAt)})]}),e.jsxs("span",{className:"hidden md:inline shrink-0 text-xs text-[var(--text-muted)]",children:["#",s.id]}),e.jsx("span",{className:"hidden md:inline flex-1 text-xs text-[var(--text-primary)] truncate preserve-case",children:e.jsx(q,{content:s.description,children:I(s,40)})}),e.jsx("span",{className:"hidden md:inline",children:e.jsx(R,{status:s.status})}),e.jsx("span",{className:"hidden md:inline shrink-0 text-xs text-[var(--text-muted)]",children:_(s.createdAt)})]},s.id))})})]})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsxs("div",{className:"hidden md:flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.workers")}),e.jsxs(p,{to:"/workers",className:"flex items-center gap-1 text-xs text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsxs("div",{className:"flex md:hidden items-center justify-between border-b border-[var(--border)] px-3 py-3",children:[e.jsx("h2",{className:"text-xs font-bold text-[var(--accent)]",children:a("dashboard.workers")}),e.jsxs(p,{to:"/workers",className:"flex items-center gap-1 text-[11px] text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"p-4",children:f?e.jsx(g,{rows:3}):y.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.no_workers_registered")})]}):e.jsx("div",{className:"flex flex-col",children:y.map(s=>e.jsxs("div",{onClick:()=>n(`/workers/${s.id}`),className:"flex cursor-pointer items-center justify-between border-b border-[var(--border-row)] py-2.5 transition-colors hover:bg-[var(--bg-input)] last:border-b-0",children:[e.jsxs("div",{className:"min-w-0 flex-1 flex flex-col gap-0.5",children:[e.jsx("span",{className:"truncate text-xs text-[var(--text-primary)]",children:s.name}),e.jsx("span",{className:"truncate text-xs text-[var(--text-muted)]",children:s.host??"--"})]}),e.jsxs("div",{className:"shrink-0 flex items-center gap-3",children:[e.jsxs("span",{className:"text-xs text-[var(--text-secondary)]",children:[s.activeSlots,"/",s.maxSlots," ",a("dashboard.slots")]}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs",style:{color:V(s.status)},children:[e.jsx("span",{style:{fontSize:"0.5rem"},children:"●"}),F(s.status)]})]})]},s.id))})})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] md:hidden",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-3 py-3",children:[e.jsx("h2",{className:"text-xs font-bold text-[var(--accent)]",children:a("dashboard.projects")}),e.jsxs(p,{to:"/projects",className:"flex items-center gap-1 text-[11px] text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"p-3",children:E?e.jsx(g,{rows:3}):C.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("projects.no_projects_yet")})]}):e.jsx("div",{className:"flex flex-col gap-2",children:C.map(s=>{const d=s.taskCount??0;return e.jsxs("div",{onClick:()=>n(`/projects/${s.key}`),className:"cursor-pointer rounded-[4px] border border-[var(--border)] p-3 transition-colors hover:bg-[var(--bg-input)]",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"min-w-0 truncate text-xs font-medium text-[var(--accent)]",children:s.key}),e.jsxs("span",{className:"shrink-0 text-[11px] text-[var(--text-muted)]",children:[d," ",P(d)]})]}),e.jsx("span",{className:"mt-1 block text-[11px] text-[var(--text-primary)]",children:s.name}),e.jsx("span",{className:"mt-0.5 block text-[11px] text-[var(--text-muted)]",children:s.agentType})]},s.key)})})})]}),e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:a("dashboard.recent_activity")}),i&&e.jsxs(p,{to:"/admin/audit-logs",className:"flex items-center gap-1 text-xs text-[var(--accent)] hover:underline",children:[a("common.view_all")," ",e.jsx(v,{className:"h-3 w-3"})]})]}),e.jsx("div",{className:"p-3 md:p-4",children:M?e.jsx(g,{rows:4}):A.length===0?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-8",children:[e.jsx("span",{className:"text-xl font-bold text-[var(--border)]",children:"[ ]"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:a("dashboard.no_recent_activity")})]}):e.jsx("div",{className:"flex flex-col",children:A.map(s=>{const d=s.message.match(/task\s*#?(\d+)/i),k=d?d[1]:null;return e.jsxs("div",{className:`flex min-w-0 flex-col gap-1 rounded-[4px] border-b border-[var(--border-row)] px-2 py-2 transition-colors last:border-b-0 md:flex-row md:items-start md:gap-3 md:rounded-none md:px-0 ${k?"cursor-pointer hover:bg-[var(--bg-input)]":""}`,onClick:()=>k&&n(`/tasks/${k}`),children:[e.jsx("span",{className:"shrink-0 whitespace-nowrap text-[11px] text-[var(--text-muted)] md:text-xs",children:_(s.timestamp)}),e.jsx("span",{className:"min-w-0 break-words text-[11px] leading-relaxed text-[var(--text-secondary)] md:truncate md:text-xs md:leading-normal",children:s.message})]},s.id)})})})]})]})]})}export{oe as default};
@@ -1 +1 @@
1
- import{j as e}from"./index-CuZrCrRX.js";function i({label:s,value:t,href:r,variant:n="between",labelWidth:a="w-20 md:w-28"}){return n==="fixed-label"?e.jsxs("div",{className:"flex min-w-0 flex-col sm:flex-row sm:items-center gap-0.5 sm:gap-3 py-1",children:[e.jsx("span",{className:`${a} shrink-0 text-xs text-[var(--text-muted)]`,children:s}),r?e.jsx("a",{href:r,target:"_blank",rel:"noopener noreferrer",className:"min-w-0 truncate text-sm text-[var(--accent)] hover:underline",children:t}):e.jsx("span",{className:"min-w-0 truncate text-sm text-[var(--text-primary)]",children:t})]}):e.jsxs("div",{className:"flex min-w-0 items-center justify-between gap-4",children:[e.jsx("span",{className:"shrink-0 text-[var(--text-muted)]",children:s}),e.jsx("span",{className:"min-w-0 truncate text-[var(--text-primary)]",children:t})]})}export{i as I};
1
+ import{j as e}from"./index-OBVbDpAB.js";function i({label:s,value:t,href:r,variant:n="between",labelWidth:a="w-20 md:w-28"}){return n==="fixed-label"?e.jsxs("div",{className:"flex min-w-0 flex-col sm:flex-row sm:items-center gap-0.5 sm:gap-3 py-1",children:[e.jsx("span",{className:`${a} shrink-0 text-xs text-[var(--text-muted)]`,children:s}),r?e.jsx("a",{href:r,target:"_blank",rel:"noopener noreferrer",className:"min-w-0 truncate text-sm text-[var(--accent)] hover:underline",children:t}):e.jsx("span",{className:"min-w-0 truncate text-sm text-[var(--text-primary)]",children:t})]}):e.jsxs("div",{className:"flex min-w-0 items-center justify-between gap-4",children:[e.jsx("span",{className:"shrink-0 text-[var(--text-muted)]",children:s}),e.jsx("span",{className:"min-w-0 truncate text-[var(--text-primary)]",children:t})]})}export{i as I};