@overlordai/server 1.0.143 → 1.0.145

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 (226) hide show
  1. package/database/migrations/014-automations.sql +67 -0
  2. package/dist/adapters/command-parser.utils.d.ts +1 -0
  3. package/dist/adapters/command-parser.utils.d.ts.map +1 -1
  4. package/dist/adapters/command-parser.utils.js +14 -1
  5. package/dist/adapters/command-parser.utils.js.map +1 -1
  6. package/dist/adapters/help-text.d.ts.map +1 -1
  7. package/dist/adapters/help-text.js +2 -1
  8. package/dist/adapters/help-text.js.map +1 -1
  9. package/dist/adapters/nlu.service.d.ts.map +1 -1
  10. package/dist/adapters/nlu.service.js +4 -1
  11. package/dist/adapters/nlu.service.js.map +1 -1
  12. package/dist/app.module.d.ts.map +1 -1
  13. package/dist/app.module.js +2 -0
  14. package/dist/app.module.js.map +1 -1
  15. package/dist/automation/automation-executor.d.ts +23 -0
  16. package/dist/automation/automation-executor.d.ts.map +1 -0
  17. package/dist/automation/automation-executor.js +365 -0
  18. package/dist/automation/automation-executor.js.map +1 -0
  19. package/dist/automation/automation-scheduler.d.ts +21 -0
  20. package/dist/automation/automation-scheduler.d.ts.map +1 -0
  21. package/dist/automation/automation-scheduler.js +124 -0
  22. package/dist/automation/automation-scheduler.js.map +1 -0
  23. package/dist/automation/automation-template.service.d.ts +30 -0
  24. package/dist/automation/automation-template.service.d.ts.map +1 -0
  25. package/dist/automation/automation-template.service.js +66 -0
  26. package/dist/automation/automation-template.service.js.map +1 -0
  27. package/dist/automation/automation-trigger.d.ts +13 -0
  28. package/dist/automation/automation-trigger.d.ts.map +1 -0
  29. package/dist/automation/automation-trigger.js +96 -0
  30. package/dist/automation/automation-trigger.js.map +1 -0
  31. package/dist/automation/automation-validation.d.ts +14 -0
  32. package/dist/automation/automation-validation.d.ts.map +1 -0
  33. package/dist/automation/automation-validation.js +66 -0
  34. package/dist/automation/automation-validation.js.map +1 -0
  35. package/dist/automation/automation.module.d.ts +3 -0
  36. package/dist/automation/automation.module.d.ts.map +1 -0
  37. package/dist/automation/automation.module.js +33 -0
  38. package/dist/automation/automation.module.js.map +1 -0
  39. package/dist/automation/automation.service.d.ts +22 -0
  40. package/dist/automation/automation.service.d.ts.map +1 -0
  41. package/dist/automation/automation.service.js +232 -0
  42. package/dist/automation/automation.service.js.map +1 -0
  43. package/dist/database/repositories/automation.repository.d.ts +87 -0
  44. package/dist/database/repositories/automation.repository.d.ts.map +1 -0
  45. package/dist/database/repositories/automation.repository.js +531 -0
  46. package/dist/database/repositories/automation.repository.js.map +1 -0
  47. package/dist/database/repositories/task.repository.d.ts +1 -0
  48. package/dist/database/repositories/task.repository.d.ts.map +1 -1
  49. package/dist/database/repositories/task.repository.js +4 -2
  50. package/dist/database/repositories/task.repository.js.map +1 -1
  51. package/dist/database/repository.module.d.ts.map +1 -1
  52. package/dist/database/repository.module.js +2 -0
  53. package/dist/database/repository.module.js.map +1 -1
  54. package/dist/dispatcher/dispatcher.service.d.ts.map +1 -1
  55. package/dist/dispatcher/dispatcher.service.js +1 -0
  56. package/dist/dispatcher/dispatcher.service.js.map +1 -1
  57. package/dist/dispatcher/task-creation.service.d.ts +3 -3
  58. package/dist/dispatcher/task-creation.service.d.ts.map +1 -1
  59. package/dist/dispatcher/task-creation.service.js +14 -5
  60. package/dist/dispatcher/task-creation.service.js.map +1 -1
  61. package/dist/events/event-types.d.ts +31 -0
  62. package/dist/events/event-types.d.ts.map +1 -1
  63. package/dist/events/event-types.js +4 -0
  64. package/dist/events/event-types.js.map +1 -1
  65. package/dist/notifier/notification-consumer.d.ts.map +1 -1
  66. package/dist/notifier/notification-consumer.js +65 -1
  67. package/dist/notifier/notification-consumer.js.map +1 -1
  68. package/dist/notifier/notification-event-listener.d.ts +7 -2
  69. package/dist/notifier/notification-event-listener.d.ts.map +1 -1
  70. package/dist/notifier/notification-event-listener.js +56 -2
  71. package/dist/notifier/notification-event-listener.js.map +1 -1
  72. package/dist/notifier/notifier.service.d.ts +4 -1
  73. package/dist/notifier/notifier.service.d.ts.map +1 -1
  74. package/dist/notifier/notifier.service.js +23 -2
  75. package/dist/notifier/notifier.service.js.map +1 -1
  76. package/dist/notifier/template.service.d.ts +1 -1
  77. package/dist/notifier/template.service.d.ts.map +1 -1
  78. package/dist/notifier/template.service.js +14 -4
  79. package/dist/notifier/template.service.js.map +1 -1
  80. package/dist/web/automation.controller.d.ts +74 -0
  81. package/dist/web/automation.controller.d.ts.map +1 -0
  82. package/dist/web/automation.controller.js +539 -0
  83. package/dist/web/automation.controller.js.map +1 -0
  84. package/dist/web/frame-handlers/automation-report.handler.d.ts +10 -0
  85. package/dist/web/frame-handlers/automation-report.handler.d.ts.map +1 -0
  86. package/dist/web/frame-handlers/automation-report.handler.js +15 -0
  87. package/dist/web/frame-handlers/automation-report.handler.js.map +1 -0
  88. package/dist/web/frame-handlers/index.d.ts +1 -0
  89. package/dist/web/frame-handlers/index.d.ts.map +1 -1
  90. package/dist/web/frame-handlers/index.js +3 -1
  91. package/dist/web/frame-handlers/index.js.map +1 -1
  92. package/dist/web/frame-handlers/stage-confirm.handler.d.ts.map +1 -1
  93. package/dist/web/frame-handlers/stage-confirm.handler.js +1 -1
  94. package/dist/web/frame-handlers/stage-confirm.handler.js.map +1 -1
  95. package/dist/web/task.controller.d.ts +3 -0
  96. package/dist/web/task.controller.d.ts.map +1 -1
  97. package/dist/web/web-event.service.d.ts +20 -1
  98. package/dist/web/web-event.service.d.ts.map +1 -1
  99. package/dist/web/web-event.service.js +66 -2
  100. package/dist/web/web-event.service.js.map +1 -1
  101. package/dist/web/web.module.d.ts.map +1 -1
  102. package/dist/web/web.module.js +4 -1
  103. package/dist/web/web.module.js.map +1 -1
  104. package/dist/web/worker-channel.gateway.d.ts +2 -1
  105. package/dist/web/worker-channel.gateway.d.ts.map +1 -1
  106. package/dist/web/worker-channel.gateway.js +5 -2
  107. package/dist/web/worker-channel.gateway.js.map +1 -1
  108. package/package.json +5 -4
  109. package/public/assets/AccessTokensPage-BYuGmkhG.js +1 -0
  110. package/public/assets/{AdminPage-CxHMuTgJ.js → AdminPage-BResRWph.js} +1 -1
  111. package/public/assets/{AgentCliPage-DxZUrhjz.js → AgentCliPage-BcDXV12E.js} +1 -1
  112. package/public/assets/{ApiReferencePage-Cc_-lPFn.js → ApiReferencePage-NaJYMeTA.js} +1 -1
  113. package/public/assets/{ArchitecturePage-CpXl4jb3.js → ArchitecturePage-D-0d-kgA.js} +1 -1
  114. package/public/assets/{AuditLogPage-CvG7Kmpn.js → AuditLogPage-BuiWgzsv.js} +1 -1
  115. package/public/assets/AutomationCreatePage-CbGNlXYx.js +1 -0
  116. package/public/assets/AutomationDetailPage-C8GfVtsX.js +16 -0
  117. package/public/assets/AutomationEditPage-C7hl6YxI.js +1 -0
  118. package/public/assets/AutomationListPage-sjxnTqLB.js +16 -0
  119. package/public/assets/AutomationRunDetailPage-DYpv-WBg.js +6 -0
  120. package/public/assets/{BindPlatformPage-DQEP-N9z.js → BindPlatformPage-DS1eO2Me.js} +1 -1
  121. package/public/assets/BotIntegrationPage-DW13UERh.js +1 -0
  122. package/public/assets/{BotManage-B1lkaWlW.js → BotManage-CW08edmX.js} +2 -2
  123. package/public/assets/{BotSetupPage-kJHd4z6w.js → BotSetupPage-B2TIppqV.js} +2 -2
  124. package/public/assets/{ChangelogPage-QheUxtEJ.js → ChangelogPage-BpJdCfIe.js} +1 -1
  125. package/public/assets/{CliReferencePage-Dy78S9h1.js → CliReferencePage-wbYT0YSP.js} +1 -1
  126. package/public/assets/ConfirmStageDialog-Bke18NAb.js +7 -0
  127. package/public/assets/{DeploymentPage-CaIslw2W.js → DeploymentPage-DqYVYlM2.js} +1 -1
  128. package/public/assets/{DevWorkflowPage-DjmFkvCo.js → DevWorkflowPage-B1T1aB-L.js} +1 -1
  129. package/public/assets/DeveloperManage-CwH2nj3C.js +16 -0
  130. package/public/assets/{DeveloperSetupPage-D3RvWqx0.js → DeveloperSetupPage-B099stPW.js} +1 -1
  131. package/public/assets/{DocsIndexPage-BHnvOEn8.js → DocsIndexPage-BQJNEB0T.js} +1 -1
  132. package/public/assets/{DocsLayout-BdWlFJ_G.js → DocsLayout-VgiIORoW.js} +1 -1
  133. package/public/assets/{DocsPrimitives-BRoBpWHe.js → DocsPrimitives-DStFX1T8.js} +1 -1
  134. package/public/assets/{EditProjectPage-CepF7mnT.js → EditProjectPage-CSv1LQ0c.js} +2 -2
  135. package/public/assets/{EmptyState-BIXXLer_.js → EmptyState-CM34MS8q.js} +1 -1
  136. package/public/assets/{EnvVariablesPage-DxRT4ql6.js → EnvVariablesPage-By_n8jC_.js} +2 -2
  137. package/public/assets/{HomePage-CkiXfp2H.js → HomePage-BA8S5QIk.js} +1 -1
  138. package/public/assets/{InfoRow-DXCzjoGj.js → InfoRow-BkLVrW3X.js} +1 -1
  139. package/public/assets/{InstallationPage-CF8j4Y-C.js → InstallationPage-5aHtmv3w.js} +1 -1
  140. package/public/assets/{LandingPage-CaYr_-RD.js → LandingPage-XfW3mTgR.js} +7 -12
  141. package/public/assets/{LocalDevelopmentPage-HIFhYvHJ.js → LocalDevelopmentPage-CEhJ10RY.js} +1 -1
  142. package/public/assets/{LoginPage-D17Mq8Qe.js → LoginPage-hEkjuwQp.js} +1 -1
  143. package/public/assets/{MetricBar-DDJWywkw.js → MetricBar-CuVoQPXf.js} +1 -1
  144. package/public/assets/{NotFoundPage-BTlUFX7F.js → NotFoundPage-CDaJI7W_.js} +1 -1
  145. package/public/assets/{OnboardingGuide-CTJYul4_.js → OnboardingGuide-xLqRqP0t.js} +1 -1
  146. package/public/assets/{PermissionsPage-Dj27JR_m.js → PermissionsPage-BGlc6yU2.js} +1 -1
  147. package/public/assets/{PipelineConfigPage-BTy8cOFI.js → PipelineConfigPage-Bzm1MeK0.js} +1 -1
  148. package/public/assets/{PipelineEditorPage-CuSW0B-0.js → PipelineEditorPage-DhS-VBVt.js} +2 -2
  149. package/public/assets/{PlanPage-CMQs2Hiz.js → PlanPage-Mu6msPek.js} +1 -1
  150. package/public/assets/{ProfilePage-BRxrQCQd.js → ProfilePage-Dk-XPfIf.js} +1 -1
  151. package/public/assets/{ProjectDetailPage-CRHNrgPt.js → ProjectDetailPage-C8v5ztXD.js} +3 -3
  152. package/public/assets/ProjectListPage-Ccrl3DtV.js +6 -0
  153. package/public/assets/PtyTerminal-DCbNmuIT.js +38 -0
  154. package/public/assets/{QuickAuth-Dx-LoUjm.js → QuickAuth-DAPeXfQS.js} +1 -1
  155. package/public/assets/RemoveMemberConfirmDialog-gr2WUWrR.js +6 -0
  156. package/public/assets/ReviewAggregatePage-B1SB4rXq.js +6 -0
  157. package/public/assets/{ReviewPage-DzNkeQXP.js → ReviewPage-Bde6YvIA.js} +1 -1
  158. package/public/assets/{Select-DYnPuPlP.js → Select-Bxil-UGQ.js} +1 -1
  159. package/public/assets/{SettingsPage-YpqaOT8x.js → SettingsPage-nA4hlLlN.js} +1 -1
  160. package/public/assets/{Skeleton-tFvClhRo.js → Skeleton-DMVGjH__.js} +1 -1
  161. package/public/assets/{SkillPage-BQto2TJm.js → SkillPage-BqTTImpe.js} +1 -1
  162. package/public/assets/{TaskDetailPage-BAnCb9zv.js → TaskDetailPage-DPdD57PF.js} +2 -2
  163. package/public/assets/{TaskGuidePage-Bs-Unzck.js → TaskGuidePage-CQAlhXHL.js} +1 -1
  164. package/public/assets/TaskListPage-C5tAOuSG.js +1 -0
  165. package/public/assets/{TaskStatusBadge-BUczBM5S.js → TaskStatusBadge-D5lVjwey.js} +1 -1
  166. package/public/assets/TerminalHomePage-BX-sHKXF.js +6 -0
  167. package/public/assets/TokenManage-95LL4o8y.js +1 -0
  168. package/public/assets/{Tooltip-BTMAbLUj.js → Tooltip-3_9w-Oet.js} +1 -1
  169. package/public/assets/{TotpSetupPage-B9IghCSA.js → TotpSetupPage-BzyS9OrP.js} +1 -1
  170. package/public/assets/{WorkerDetailPage-D0Vz2Z_J.js → WorkerDetailPage-BaVeVMvg.js} +1 -1
  171. package/public/assets/WorkerListPage-zOEHoOtr.js +6 -0
  172. package/public/assets/{WorkerOperationsPage-Du5dUuwe.js → WorkerOperationsPage-B9A7kFhI.js} +1 -1
  173. package/public/assets/{WorkerSetupGuidePage-Chgd3lOw.js → WorkerSetupGuidePage-DzTffG6n.js} +1 -1
  174. package/public/assets/{WorkerSetupPage-DOy5dzpL.js → WorkerSetupPage-B28GH43r.js} +1 -1
  175. package/public/assets/{agent-type-options-DYVQzNPE.js → agent-type-options-BBcV6_LY.js} +1 -1
  176. package/public/assets/{arrow-left-BmJhqQxJ.js → arrow-left-BDjYIP3Y.js} +1 -1
  177. package/public/assets/{arrow-right-za11FMwb.js → arrow-right-DITZLrUG.js} +1 -1
  178. package/public/assets/{bot-BREu_dZH.js → bot-CJ6g-CgU.js} +1 -1
  179. package/public/assets/{chevron-down-pInOI1Sz.js → chevron-down-D9VkxIPs.js} +1 -1
  180. package/public/assets/{chevron-left-9sE-mZhp.js → chevron-left-CWC7W_zG.js} +1 -1
  181. package/public/assets/{chevron-right-BTVDsZF2.js → chevron-right-BDlNEjPF.js} +1 -1
  182. package/public/assets/{chevron-up-7pQBLB6e.js → chevron-up-B2_M0Aou.js} +1 -1
  183. package/public/assets/circle-alert-Cb6RgYCQ.js +6 -0
  184. package/public/assets/clock-CPiGRQpX.js +6 -0
  185. package/public/assets/{copy-Ciibu4ij.js → copy-Dz9BK4cr.js} +1 -1
  186. package/public/assets/{download-C5M-xVQE.js → download-qgK3DePm.js} +1 -1
  187. package/public/assets/{external-link-DXCE8f-2.js → external-link-kSTql_zg.js} +1 -1
  188. package/public/assets/{file-text-FxjQforC.js → file-text-moi4pXOm.js} +1 -1
  189. package/public/assets/{git-fork-BnUjRz81.js → git-fork-FS4LqWZJ.js} +1 -1
  190. package/public/assets/index-CdJk2QGi.css +1 -0
  191. package/public/assets/index-DEBRwDiX.js +257 -0
  192. package/public/assets/{key-DORG2Bvk.js → key-CHc_t6rY.js} +1 -1
  193. package/public/assets/{loader-circle-Ce741dwH.js → loader-circle-BEHOzbAc.js} +1 -1
  194. package/public/assets/{pencil-C4ejRMe1.js → pencil-COk9Cf4n.js} +1 -1
  195. package/public/assets/{play-w6NUT3Ge.js → play-B8L-TpIA.js} +1 -1
  196. package/public/assets/{plus-CgnoWo2P.js → plus-Bh23dSc7.js} +1 -1
  197. package/public/assets/{rotate-ccw-DE82XdM1.js → rotate-ccw-CumxDFOW.js} +1 -1
  198. package/public/assets/{scroll-text-DAbRTvTk.js → scroll-text-yKGiDEH2.js} +1 -1
  199. package/public/assets/{settings-B6CvfGJs.js → settings-BZ99cVpB.js} +1 -1
  200. package/public/assets/{skip-forward-kX5fzSWO.js → skip-forward-YMw2gv4i.js} +1 -1
  201. package/public/assets/{status-colors-DTc6Ynln.js → status-colors-CpxhEwhO.js} +1 -1
  202. package/public/assets/{task-constants-DFxPkPUs.js → task-constants-BOIiRs7J.js} +1 -1
  203. package/public/assets/{task.store-VJg4-Qif.js → task.store-B7v0IyXP.js} +1 -1
  204. package/public/assets/timer--KEJmHJk.js +6 -0
  205. package/public/assets/{trash-2-BTUlSSX7.js → trash-2-CGFhXY_R.js} +1 -1
  206. package/public/assets/{useFetch-DLQT-fqN.js → useFetch-_325GIxD.js} +1 -1
  207. package/public/assets/{users-B6ZPxGEF.js → users-0IqI-VRX.js} +1 -1
  208. package/public/assets/{wifi-RZmzDeRm.js → wifi-DveQJnOv.js} +1 -1
  209. package/public/assets/{workflow-C1oJzdp3.js → workflow-BUUDFa4R.js} +1 -1
  210. package/public/assets/zap-D2T18qt7.js +6 -0
  211. package/public/index.html +2 -2
  212. package/public/sw.js +1 -1
  213. package/public/assets/AccessTokensPage-BSxprw7x.js +0 -1
  214. package/public/assets/BotIntegrationPage-DP1ipK65.js +0 -1
  215. package/public/assets/ConfirmStageDialog-rt45LR8Q.js +0 -12
  216. package/public/assets/DeveloperManage-Ab6SdQEz.js +0 -16
  217. package/public/assets/ProjectListPage-QM4505IY.js +0 -6
  218. package/public/assets/PtyTerminal-BxD1WFmu.js +0 -38
  219. package/public/assets/RemoveMemberConfirmDialog-pg5SnIU8.js +0 -6
  220. package/public/assets/ReviewAggregatePage-DHUyVVeT.js +0 -11
  221. package/public/assets/TaskListPage-CL98Ev5l.js +0 -1
  222. package/public/assets/TerminalHomePage-CgZYHN7Y.js +0 -6
  223. package/public/assets/TokenManage-BU8KbNvZ.js +0 -1
  224. package/public/assets/WorkerListPage-B4aOYXSX.js +0 -6
  225. package/public/assets/index-CTVNJXL0.js +0 -252
  226. package/public/assets/index-kJfGgL_V.css +0 -1
@@ -1,4 +1,4 @@
1
- import{j as e}from"./index-CTVNJXL0.js";import{a as s}from"./DocsPrimitives-BRoBpWHe.js";import"./copy-Ciibu4ij.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 i(){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(s,{code:`curl -X POST https://your-server:9000/api/admin/bots \\
1
+ import{j as e}from"./index-DEBRwDiX.js";import{a as s}from"./DocsPrimitives-DStFX1T8.js";import"./copy-Dz9BK4cr.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 i(){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(s,{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 '{
@@ -30,4 +30,4 @@ import{j as e}from"./index-CTVNJXL0.js";import{a as s}from"./DocsPrimitives-BRoB
30
30
  "platformChatId": "C0XXXXXXX",
31
31
  "projectKey": "PROJ",
32
32
  "chatName": "#project-dev"
33
- }'`})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> 8. link developer accounts"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["same as lark, but use the slack user id as ",e.jsx("code",{className:"text-[var(--accent)]",children:"platform_uid"}),". find it via the user's profile → more → copy member id."]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// bot commands"}),e.jsx("div",{className:"overflow-x-auto rounded-[4px] border border-[var(--border)]",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"command"}),e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"alias"}),e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"example"}),e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsx("tbody",{children:c.map((t,a)=>e.jsxs("tr",{className:"border-b border-[var(--border)] last:border-b-0",children:[e.jsx("td",{className:"px-3 py-2 text-[var(--accent)] whitespace-nowrap",children:t.command}),e.jsx("td",{className:"px-3 py-2 text-[var(--text-secondary)]",children:t.alias||"—"}),e.jsx("td",{className:"px-3 py-2 text-[var(--text-secondary)] whitespace-nowrap",children:e.jsx("code",{children:t.example})}),e.jsx("td",{className:"px-3 py-2 text-[var(--text-muted)]",children:t.description})]},a))})]})})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// develop command"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> task type prefix"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["prefix the description with a type to categorize the task. if omitted, defaults to ",e.jsx("code",{className:"text-[var(--accent)]",children:"feat"}),"."]}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"feat:"})," new feature"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"fix:"})," bug fix"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"refactor:"})," code refactoring"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"docs:"})," documentation"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"chore:"})," maintenance"]})]}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["example: ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop "fix: handle null pointer in auth" --project WEB'})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> ai task naming"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"when llm is configured (see environment variables), overlord auto-generates a concise task name and branch slug from the description."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> assign to a developer"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"@mention another user in the message to assign the task to them. the mention can be placed anywhere in the message — before or after the description. if the mentioned user is not a registered developer, the task falls back to the sender."}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"if no one is mentioned, the task is assigned to whoever sent the command."}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop "fix login" @alice'})]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop @alice "fix login"'})]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot @alice develop "fix login"'})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> create from a quoted message"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"reply to any message with a develop command to include the original message as task context. the quoted content is prepended to your description."}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— reply with ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:"@bot develop"})," — uses the quoted message as the full description"]}),e.jsxs("li",{children:["— reply with ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop "additional context"'})," — quoted message + your note"]})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// interactive cards"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"when a pipeline reaches a confirmation stage, the bot sends an interactive card with action buttons (confirm / cancel / choice). users can respond directly from the chat interface without opening the web dashboard."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// multi-bot architecture"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"overlord supports multiple bot instances. each project or group can have its own bot on any supported platform. all bots share the same overlord backend. the server identifies which bot to use based on the app_id in the incoming request."}),e.jsx("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] px-3 py-2",children:e.jsx("p",{className:"text-xs text-[var(--text-secondary)]",children:"// a discord adapter is planned for a future release. the adapter interface is extensible — custom platform support can be added by implementing the adapter interface."})})]})]})})}export{i as default};
33
+ }'`})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> 8. link developer accounts"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["same as lark, but use the slack user id as ",e.jsx("code",{className:"text-[var(--accent)]",children:"platform_uid"}),". find it via the user's profile → more → copy member id."]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// bot commands"}),e.jsx("div",{className:"overflow-x-auto rounded-[4px] border border-[var(--border)]",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border)] bg-[var(--bg-card)]",children:[e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"command"}),e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"alias"}),e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"example"}),e.jsx("th",{className:"px-3 py-2 text-left text-[var(--text-muted)]",children:"description"})]})}),e.jsx("tbody",{children:c.map((t,a)=>e.jsxs("tr",{className:"border-b border-[var(--border)] last:border-b-0",children:[e.jsx("td",{className:"px-3 py-2 text-[var(--accent)] whitespace-nowrap",children:t.command}),e.jsx("td",{className:"px-3 py-2 text-[var(--text-secondary)]",children:t.alias||"—"}),e.jsx("td",{className:"px-3 py-2 text-[var(--text-secondary)] whitespace-nowrap",children:e.jsx("code",{children:t.example})}),e.jsx("td",{className:"px-3 py-2 text-[var(--text-muted)]",children:t.description})]},a))})]})})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// develop command"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> task type prefix"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["prefix the description with a type to categorize the task. if omitted, defaults to ",e.jsx("code",{className:"text-[var(--accent)]",children:"feat"}),"."]}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"feat:"})," new feature"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"fix:"})," bug fix"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"refactor:"})," code refactoring"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"docs:"})," documentation"]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--accent)]",children:"chore:"})," maintenance"]})]}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["example: ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop "fix: handle null pointer in auth" --project WEB'})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> ai task naming"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"when llm is configured (see environment variables), overlord auto-generates a concise task name and branch slug from the description."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> assign to a developer"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"@mention another user in the message to assign the task to them. the mention can be placed anywhere in the message — before or after the description. if the mentioned user is not a registered developer, the task falls back to the sender."}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"if no one is mentioned, the task is assigned to whoever sent the command."}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop "fix login" @alice'})]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop @alice "fix login"'})]}),e.jsxs("li",{children:["— ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot @alice develop "fix login"'})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-xs text-[var(--accent)]",children:"> create from a quoted message"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"reply to any message with a develop command to include the original message as task context. the quoted content is prepended to your description."}),e.jsxs("ul",{className:"space-y-1 text-xs text-[var(--text-secondary)] list-none pl-0",children:[e.jsxs("li",{children:["— reply with ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:"@bot develop"})," — uses the quoted message as the full description"]}),e.jsxs("li",{children:["— reply with ",e.jsx("code",{className:"text-[var(--text-secondary)]",children:'@bot develop "additional context"'})," — quoted message + your note"]})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// interactive cards"}),e.jsxs("p",{className:"text-xs text-[var(--text-muted)]",children:["when a pipeline reaches a confirmation stage, the bot sends a notification with a link to the web dashboard. users can also respond by typing ",e.jsx("code",{className:"text-[var(--accent)]",children:"confirm #id"})," or ",e.jsx("code",{className:"text-[var(--accent)]",children:"reject #id"})," directly in chat, or by replying to the notification message."]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:"// multi-bot architecture"}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:"overlord supports multiple bot instances. each project or group can have its own bot on any supported platform. all bots share the same overlord backend. the server identifies which bot to use based on the app_id in the incoming request."}),e.jsx("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] px-3 py-2",children:e.jsx("p",{className:"text-xs text-[var(--text-secondary)]",children:"// a discord adapter is planned for a future release. the adapter interface is extensible — custom platform support can be added by implementing the adapter interface."})})]})]})})}export{i as default};
@@ -1 +1 @@
1
- import{j as e}from"./index-CTVNJXL0.js";function s(){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: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.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> v1.0.28"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:"2026-03-13"})]}),e.jsx("h3",{className:"text-xs text-[var(--text-primary)]",children:"initial public release"}),e.jsxs("div",{className:"space-y-1 text-xs text-[var(--text-secondary)]",children:[e.jsx("p",{children:"- full task orchestration platform with multi-agent support (claude code, cursor, codex)"}),e.jsx("p",{children:"- real-time pty terminal streaming via xterm.js in web dashboard"}),e.jsx("p",{children:"- skill pipeline system with confirmation, choice, and input stages"}),e.jsx("p",{children:"- multi-machine worker fleet with intelligent task routing"}),e.jsx("p",{children:"- lark bot integration with interactive message cards"}),e.jsx("p",{children:"- developer cli (ov) for task management and terminal attachment"}),e.jsx("p",{children:"- operations cli (overlord) for server/worker lifecycle management"}),e.jsx("p",{children:"- role-based access control (developer, lead, admin)"}),e.jsx("p",{children:"- totp two-factor authentication"}),e.jsx("p",{children:"- personal access tokens for api/cli authentication"}),e.jsx("p",{children:"- cursor remote tunnel support for workspace access"}),e.jsx("p",{children:"- project-level configuration with pipeline definitions"}),e.jsx("p",{children:"- audit logging for all administrative actions"}),e.jsx("p",{children:"- cloudflare zero trust deployment support"}),e.jsx("p",{children:"- sqlite database with wal mode"}),e.jsx("p",{children:"- redis-backed task queue via bullmq"}),e.jsx("p",{children:"- comprehensive web dashboard with dark/light theme"})]})]})})]})}export{s as default};
1
+ import{j as e}from"./index-DEBRwDiX.js";function s(){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: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.jsx("h2",{className:"text-sm text-[var(--accent)]",children:"> v1.0.28"}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:"2026-03-13"})]}),e.jsx("h3",{className:"text-xs text-[var(--text-primary)]",children:"initial public release"}),e.jsxs("div",{className:"space-y-1 text-xs text-[var(--text-secondary)]",children:[e.jsx("p",{children:"- full task orchestration platform with multi-agent support (claude code, cursor, codex)"}),e.jsx("p",{children:"- real-time pty terminal streaming via xterm.js in web dashboard"}),e.jsx("p",{children:"- skill pipeline system with confirmation, choice, and input stages"}),e.jsx("p",{children:"- multi-machine worker fleet with intelligent task routing"}),e.jsx("p",{children:"- lark bot integration with interactive message cards"}),e.jsx("p",{children:"- developer cli (ov) for task management and terminal attachment"}),e.jsx("p",{children:"- operations cli (overlord) for server/worker lifecycle management"}),e.jsx("p",{children:"- role-based access control (developer, lead, admin)"}),e.jsx("p",{children:"- totp two-factor authentication"}),e.jsx("p",{children:"- personal access tokens for api/cli authentication"}),e.jsx("p",{children:"- cursor remote tunnel support for workspace access"}),e.jsx("p",{children:"- project-level configuration with pipeline definitions"}),e.jsx("p",{children:"- audit logging for all administrative actions"}),e.jsx("p",{children:"- cloudflare zero trust deployment support"}),e.jsx("p",{children:"- sqlite database with wal mode"}),e.jsx("p",{children:"- redis-backed task queue via bullmq"}),e.jsx("p",{children:"- comprehensive web dashboard with dark/light theme"})]})]})})]})}export{s as default};
@@ -1,4 +1,4 @@
1
- import{f as d,a as i,v as l,r as p,j as e,L as m}from"./index-CTVNJXL0.js";import{C as a}from"./DocsPrimitives-BRoBpWHe.js";import{Q as x}from"./QuickAuth-Dx-LoUjm.js";import{P as v}from"./plus-CgnoWo2P.js";import"./copy-Ciibu4ij.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,w as l,r as p,j as e,L as m}from"./index-DEBRwDiX.js";import{C as a}from"./DocsPrimitives-DStFX1T8.js";import{Q as x}from"./QuickAuth-DAPeXfQS.js";import{P as v}from"./plus-Bh23dSc7.js";import"./copy-Dz9BK4cr.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
@@ -0,0 +1,7 @@
1
+ import{c as O,r as i,a as z,j as s,I as Q,J as Z,n as I,u as $,h as F,v as ee,K as te,M as ne}from"./index-DEBRwDiX.js";import{L as re}from"./loader-circle-BEHOzbAc.js";import{R as se}from"./rotate-ccw-CumxDFOW.js";import{a as ae,P as G}from"./PtyTerminal-DCbNmuIT.js";import{a as oe}from"./date-RFA7-ZGs.js";import{F as ce}from"./file-text-moi4pXOm.js";import{C as ie}from"./clock-CPiGRQpX.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const K=O("Hand",[["path",{d:"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2",key:"1fvzgz"}],["path",{d:"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2",key:"1kc0my"}],["path",{d:"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8",key:"10h0bg"}],["path",{d:"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15",key:"1s1gnw"}]]),H="claude";function Ce(t){if(t.agentType)return t.agentType;if(!t.configSnapshot)return H;try{const n=JSON.parse(t.configSnapshot);return typeof n.agentType=="string"&&n.agentType?n.agentType:H}catch{return H}}const le=768,V=`(max-width: ${le-1}px)`;function Y(){const[t,n]=i.useState(()=>typeof window>"u"?!1:window.matchMedia(V).matches);return i.useEffect(()=>{const e=window.matchMedia(V);n(e.matches);const r=a=>n(a.matches);return e.addEventListener("change",r),()=>e.removeEventListener("change",r)},[]),t}function ue({state:t,onRelease:n,onRequestTakeover:e,denialReason:r,retryAttempt:a=1,maxRetries:o=3}){const{t:u}=z(),[l,c]=i.useState(!0);return i.useEffect(()=>{c(!0)},[t]),l?s.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-3 py-2",children:[s.jsxs("div",{className:"flex items-center gap-1.5",children:[t==="auto"&&s.jsxs(s.Fragment,{children:[s.jsx(Q,{className:"h-3 w-3 text-[var(--accent)]"}),s.jsx("span",{className:"text-[11px] font-medium text-[var(--accent)]",children:u("tasks.auto_pipeline")})]}),t==="requesting"&&s.jsxs(s.Fragment,{children:[s.jsx(re,{className:"h-3 w-3 animate-spin text-amber-500"}),s.jsx("span",{className:"text-[11px] font-medium text-amber-500",children:u("tasks.requesting_takeover")})]}),t==="manual"&&s.jsxs(s.Fragment,{children:[s.jsx(K,{className:"h-3 w-3 text-amber-500"}),s.jsx("span",{className:"text-[11px] font-medium text-amber-500",children:u("tasks.manual_takeover")})]}),t==="denied"&&s.jsxs("div",{className:"flex items-center gap-1.5 rounded-[4px] border border-red-900 bg-red-950 px-2.5 py-1",children:[s.jsx(Z,{className:"h-3 w-3 text-red-500"}),s.jsxs("span",{className:"text-[11px] font-medium text-red-500",children:[u("tasks.takeover_denied"),r?`: ${r}`:""]})]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[(t==="auto"||t==="denied")&&e&&s.jsx("button",{type:"button",onClick:e,className:"inline-flex items-center rounded-[4px] border border-[var(--border)] p-1.5 text-amber-500 hover:bg-white/5","aria-label":u("tasks.take_over"),children:s.jsx(K,{className:"h-3.5 w-3.5"})}),t==="manual"&&n&&s.jsx("button",{type:"button",onClick:n,className:"inline-flex items-center rounded-[4px] bg-[var(--accent)] p-1.5","aria-label":u("tasks.restore_auto"),children:s.jsx(se,{className:"h-3.5 w-3.5 text-black"})})]})]}):null}function de({value:t,onChange:n,onSubmit:e,isMobile:r=!1,inputDisabled:a=!1,sendDisabled:o=!1}){function u(c){c.preventDefault(),!o&&e()}function l(c){if(!(c.nativeEvent.isComposing||c.keyCode===229)&&c.key==="Enter"&&!c.shiftKey){if(c.preventDefault(),o)return;e()}}return s.jsxs("form",{onSubmit:u,className:"flex flex-col gap-2 rounded-[4px] border border-[var(--border)] bg-[var(--bg-primary)] p-2",children:[s.jsx("textarea",{value:t,onChange:c=>n(c.target.value),onKeyDown:l,rows:r?3:4,spellCheck:!1,autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",placeholder:"type a command...",disabled:a,className:"min-h-20 resize-none rounded-[4px] border border-[var(--border)] bg-transparent px-3 py-2 font-mono text-xs text-[var(--text-primary)] outline-none placeholder:text-[var(--text-muted)] disabled:cursor-not-allowed disabled:opacity-60"}),s.jsx("div",{className:"flex items-center justify-end",children:s.jsx("button",{type:"submit",disabled:o,className:"rounded-[4px] bg-[var(--accent)] px-3 py-1.5 text-xs font-medium text-black disabled:cursor-not-allowed disabled:opacity-60",children:"send"})})]})}const P=new Map;function X(t){const n=(P.get(t)??0)+1;return P.set(t,n),n}function fe(){for(const[t,n]of P.entries())P.set(t,n+1)}function U(t,n){return P.get(t)===n}const A=I((t,n)=>({connections:new Map,statuses:new Map,connect:async(e,r,a)=>{const o=X(e),u=n().connections.get(e);u&&(u.dispose(),t(b=>{const p=new Map(b.connections);p.delete(e);const v=new Map(b.statuses);return v.delete(e),{connections:p,statuses:v}}));const l=$.getState().accessToken;if(!l)throw new Error("Not authenticated");const{channelToken:c}=await F.post(`web/tasks/${e}/pty-token`).json(),f=async()=>(await F.post(`web/tasks/${e}/pty-token`).json()).channelToken,h=new ae({taskId:e,accessToken:l,channelToken:c,getChannelToken:f,getAccessToken:()=>$.getState().accessToken,onData:r,onMessage:a,onStatus:b=>{U(e,o)&&t(p=>{if(p.statuses.get(e)===b)return p;const v=new Map(p.statuses);return v.set(e,b),{statuses:v}})}});if(!U(e,o)){h.dispose();return}t(b=>{const p=new Map(b.connections);return p.set(e,h),{connections:p}}),h.connect()},disconnect:e=>{X(e);const r=n().connections.get(e);r&&(r.dispose(),t(a=>{const o=new Map(a.connections);o.delete(e);const u=new Map(a.statuses);return u.delete(e),{connections:o,statuses:u}}))},write:(e,r)=>{var a;(a=n().connections.get(e))==null||a.sendData(r)},resize:(e,r,a)=>{var o;(o=n().connections.get(e))==null||o.sendResize(r,a)},requestTakeover:(e,r)=>{var a;(a=n().connections.get(e))==null||a.requestTakeover(r)},releaseTakeover:e=>{var r;(r=n().connections.get(e))==null||r.releaseTakeover()},forceTakeover:e=>{var r;(r=n().connections.get(e))==null||r.send({type:"force_takeover"})},disconnectAll:()=>{fe();for(const e of n().connections.values())e.dispose();t({connections:new Map,statuses:new Map})}})),J="\x1B",pe=new Set(["h","l"]),xe=new Set(["1049","1047","47"]);function W(){return{visibleText:"",inAlternateScreen:!1,fullscreenTuiDetected:!1,pendingControlSequence:""}}function me(t,n){const e=be(t.pendingControlSequence+n),r=(t.visibleText+e.visibleText).slice(-12e4);let a=t.inAlternateScreen,o=t.fullscreenTuiDetected;for(const u of e.alternateScreenTransitions)a=u==="enter",u==="enter"&&(o=!0);return{visibleText:r,inAlternateScreen:a,fullscreenTuiDetected:o,pendingControlSequence:e.pendingControlSequence}}function be(t){let n="";const e=[];let r="";for(let a=0;a<t.length;){const o=t[a];if(o!==J){o!=="\r"&&o!=="\x07"&&(n+=o),a+=1;continue}if(a===t.length-1){r=t.slice(a);break}const u=t[a+1];if(u==="["){const c=ve(t,a+2);if(c===-1){r=t.slice(a);break}const f=t.slice(a,c+1),h=ge(f);h&&e.push(h),a=c+1;continue}if(u==="]"){const c=he(t,a+2);if(c===-1){r=t.slice(a);break}a=c+1;continue}const l=we(t,a+1);if(l===-1){r=t.slice(a);break}a=l+1}return{visibleText:n,alternateScreenTransitions:e,pendingControlSequence:r}}function ve(t,n){let e=n;for(;e<t.length;){const r=t.charCodeAt(e);if(r>=64&&r<=126)return e;if(r>=48&&r<=63||r>=32&&r<=47){e+=1;continue}return-1}return-1}function he(t,n){for(let e=n;e<t.length;e+=1){if(t[e]==="\x07")return e;if(t[e]===J&&t[e+1]==="\\")return e+1}return-1}function we(t,n){let e=n;for(;e<t.length;){const r=t.charCodeAt(e);if(r>=48&&r<=126)return e;if(r>=32&&r<=47){e+=1;continue}return-1}return-1}function ge(t){if(!t.startsWith("\x1B[?"))return null;const n=t.at(-1);if(!n||!pe.has(n))return null;const e=t.slice(3,-1);return xe.has(e)?n==="h"?"enter":"exit":null}const ye=i.forwardRef(function({taskId:n,taskFinished:e=!1,onOpenFullTerminal:r,onStatusChange:a,onTakeoverChange:o},u){const l=Y(),{t:c}=z(),f=A(x=>x.connect),h=A(x=>x.disconnect),b=A(x=>x.write),p=A(x=>x.forceTakeover),v=A(x=>x.releaseTakeover),_=A(x=>x.statuses.get(n)),[g,k]=i.useState(""),[S,E]=i.useState(W()),[j,y]=i.useState("auto"),[C,d]=i.useState();i.useEffect(()=>{k(""),E(W()),y("auto"),d(void 0)},[n]),i.useEffect(()=>{e&&(y("auto"),d(void 0))},[e]),i.useEffect(()=>{a==null||a(_??"disconnected")},[a,_]),i.useEffect(()=>{o==null||o(j)},[o,j]),i.useEffect(()=>{if(e)return;let x=!0,q,m=0;const T=5,B=()=>{f(n,D=>{x&&E(L=>me(L,D))},D=>{if(!x)return;const L=D;switch(L.type){case"takeover_granted":y("manual"),d(void 0);break;case"takeover_denied":y("denied"),d(L.reason??L.message);break;case"writer_revoked":y("auto"),d(void 0);break}}).catch(()=>{if(x&&m<T){const D=Math.min(3e3*2**m,3e4);m++,q=setTimeout(B,D)}})};return B(),()=>{x=!1,q&&clearTimeout(q),h(n)}},[f,h,e,n]);const w=_==="connected"&&j==="manual",N=i.useCallback(()=>{w&&(b(n,`${g}
7
+ `),k(""))},[g,w,n,b]),M=i.useCallback(()=>{y("requesting"),d(void 0),p(n)},[p,n]),R=i.useCallback(()=>{v(n),y("auto"),d(void 0)},[v,n]);return i.useImperativeHandle(u,()=>({requestTakeover:M,releaseTakeover:R}),[R,M]),s.jsxs("div",{"data-testid":"companion-terminal",className:"flex h-full min-h-0 flex-col rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] font-mono text-xs text-[var(--text-primary)]",children:[s.jsx(ue,{state:j,onRequestTakeover:e?void 0:M,onRelease:e?void 0:R,denialReason:C}),s.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto p-3",children:[r&&s.jsx("div",{className:"mb-3 flex justify-end",children:s.jsx("button",{type:"button",onClick:r,className:"rounded-[4px] border border-[var(--border)] px-3 py-1.5 text-[11px] text-[var(--text-primary)] hover:bg-white/5",children:c("tasks.full_terminal")})}),S.fullscreenTuiDetected&&s.jsx("div",{className:"mb-3 rounded-[4px] border border-amber-900 bg-amber-950/40 px-3 py-2 text-[11px] text-amber-300",children:c("tasks.complex_terminal_hint")}),s.jsx("pre",{"data-testid":"companion-terminal-output","aria-label":"terminal output",className:"min-h-[120px] overflow-auto whitespace-pre-wrap break-words rounded-[4px] border border-[var(--border)] bg-[var(--bg-primary)] p-3 text-[12px] leading-5 text-[var(--text-primary)]",children:S.visibleText||c("tasks.no_output")})]}),s.jsx("div",{className:"shrink-0 border-t border-[var(--border)] p-3",children:s.jsx(de,{value:g,onChange:k,onSubmit:N,isMobile:l,inputDisabled:e,sendDisabled:e||!w})})]})}),Me=i.forwardRef(function({taskId:n,sessionId:e,taskFinished:r,onStatusChange:a,onTakeoverChange:o},u){const l=Y(),{t:c}=z(),[f,h]=i.useState("companion"),[b,p]=i.useState(!1),[v,_]=i.useState("disconnected"),[g,k]=i.useState("auto"),[S,E]=i.useState("disconnected"),[j,y]=i.useState("auto"),[C,d]=i.useState(null),w=i.useRef(null),N=i.useRef(null);i.useEffect(()=>{h("companion"),p(!1),_("disconnected"),k("auto"),E("disconnected"),y("auto"),d(null)},[n]);const M=f==="full"?S:v,R=f==="full"?j:g;i.useEffect(()=>{l&&(a==null||a(M))},[M,l,a]),i.useEffect(()=>{l&&(o==null||o(R))},[R,l,o]),i.useEffect(()=>{var m,T;if(!(!l||!C)){if(C==="full"){if(S!=="connected")return;(m=N.current)==null||m.requestTakeover(),d(null);return}v==="connected"&&((T=w.current)==null||T.requestTakeover(),d(null))}},[v,S,l,C]);const x=i.useCallback(()=>{var m;g==="manual"&&((m=w.current)==null||m.releaseTakeover(),d("full")),p(!0),h("full")},[g]),q=i.useCallback(()=>{var m;j==="manual"&&((m=N.current)==null||m.releaseTakeover(),d("companion")),h("companion")},[j]);return i.useImperativeHandle(u,()=>({requestTakeover(){var m,T;if(!l||f==="full"){(m=N.current)==null||m.requestTakeover();return}(T=w.current)==null||T.requestTakeover()},releaseTakeover(){var m,T;if(!l||f==="full"){(m=N.current)==null||m.releaseTakeover();return}(T=w.current)==null||T.releaseTakeover()}}),[l,f]),l?s.jsxs("div",{className:"flex h-full min-h-0 flex-col gap-2 overflow-hidden",children:[f==="full"&&s.jsx("button",{type:"button",onClick:q,className:"self-start rounded-[4px] border border-[var(--border)] px-3 py-2 text-[11px] text-[var(--text-primary)]",children:c("tasks.return_to_companion")}),s.jsx("div",{className:f==="companion"?"min-h-0 flex-1 overflow-hidden":"hidden",children:s.jsx(ye,{ref:w,taskId:n,taskFinished:r,onOpenFullTerminal:x,onStatusChange:_,onTakeoverChange:k})}),b&&s.jsx("div",{className:f==="full"?"min-h-0 flex-1 overflow-hidden":"hidden",children:s.jsx(G,{ref:N,taskId:n,sessionId:e,taskFinished:r,onStatusChange:E,onTakeoverChange:y})})]}):s.jsx(G,{ref:N,taskId:n,sessionId:e,taskFinished:r,onStatusChange:a,onTakeoverChange:o})});function Re({isOpen:t,onClose:n,taskId:e,stageName:r,timeoutSeconds:a,confirmType:o="confirm",prompt:u,onSubmitted:l}){const{t:c}=z();ee(t);const[f,h]=i.useState(a),[b,p]=i.useState(!1),[v,_]=i.useState(""),g=o==="plan_review"||o==="code_review",k=o==="plan_decompose";i.useEffect(()=>{if(!t)return;h(a),_("");const d=setInterval(()=>{h(w=>w<=1?(clearInterval(d),0):w-1)},1e3);return()=>clearInterval(d)},[t,a]),i.useEffect(()=>{f===0&&t&&n()},[f,t,n]);const S=i.useCallback(async d=>{p(!0);try{const w={stageName:r,approved:d};g&&!k&&v.trim()&&(w.feedback=v.trim()),await F.post(`web/tasks/${e}/confirm-stage`,{json:w}),l==null||l(),n()}catch{}finally{p(!1)}},[e,r,v,g,k,n,l]);if(!t)return null;const E=o==="plan_review"||o==="plan_decompose"?ce:o==="code_review"?te:ne,j=o==="plan_review"?c("tasks.plan_review_message",{name:r}):o==="plan_decompose"?c(u==="SPEC_PUSH_FAILED"?"tasks.plan_decompose_push_failed_message":"tasks.plan_decompose_message"):o==="code_review"?c("tasks.code_review_message",{name:r}):c("tasks.confirm_stage_message",{name:r}),y=c(o==="plan_review"?"tasks.approve_plan":o==="plan_decompose"?"tasks.approve_plan_decompose":o==="code_review"?"tasks.approve_review":"tasks.confirm_and_proceed"),C=c(o==="plan_decompose"?"tasks.reject_plan_decompose":g?"tasks.request_changes":"tasks.reject");return s.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",style:{backdropFilter:"blur(2px)"},children:[s.jsx("div",{className:"fixed inset-0 bg-[var(--modal-backdrop)]"}),s.jsxs("div",{className:"relative z-10 w-full max-w-[480px] rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] font-mono",children:[s.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--border)] px-5 py-4",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(E,{className:"h-4 w-4 text-[var(--accent)]"}),s.jsxs("h3",{className:"text-sm text-[var(--text-primary)]",children:["// stage: ",r]})]}),a>0&&s.jsxs("span",{className:"flex items-center gap-1 text-xs text-[var(--text-muted)]",children:[s.jsx(ie,{className:"h-3.5 w-3.5"}),oe(f)]})]}),s.jsxs("div",{className:"space-y-4 px-5 py-5",children:[s.jsx("p",{className:"whitespace-pre-wrap text-xs text-[var(--text-primary)]",children:j}),g&&!k&&s.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:c("tasks.feedback_placeholder"),value:v,onChange:d=>_(d.target.value)})]}),s.jsxs("div",{className:"flex items-center justify-end gap-2 border-t border-[var(--border)] px-5 py-4",children:[s.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:b,onClick:()=>S(!1),children:C}),s.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:b,onClick:()=>S(!0),children:b?c("tasks.stage_submitting"):y})]})]})]})}export{Re as C,K as H,Me as M,Ce as g,Y as u};
@@ -1,4 +1,4 @@
1
- import{j as e}from"./index-CTVNJXL0.js";import{a as s}from"./DocsPrimitives-BRoBpWHe.js";import"./copy-Ciibu4ij.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-DEBRwDiX.js";import{a as s}from"./DocsPrimitives-DStFX1T8.js";import"./copy-Dz9BK4cr.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-CTVNJXL0.js";import{a as s}from"./DocsPrimitives-BRoBpWHe.js";import"./copy-Ciibu4ij.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-DEBRwDiX.js";import{a as s}from"./DocsPrimitives-DStFX1T8.js";import"./copy-Dz9BK4cr.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
@@ -0,0 +1,16 @@
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,x as K,ab as w}from"./index-DEBRwDiX.js";import{S as G}from"./Select-Bxil-UGQ.js";import{v as B}from"./password-CHk45-jw.js";import{E as J}from"./EmptyState-CM34MS8q.js";import{T as Q}from"./Skeleton-DMVGjH__.js";import{u as W}from"./useFetch-_325GIxD.js";import{c as F}from"./status-colors-CpxhEwhO.js";import{P as Y}from"./plus-Bh23dSc7.js";import{U as Z}from"./users-0IqI-VRX.js";import{P as ee}from"./pencil-COk9Cf4n.js";import{R as te}from"./rotate-ccw-CumxDFOW.js";import"./chevron-down-D9VkxIPs.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const ae=X("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/**
7
+ * @license lucide-react v0.469.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const re=X("UserCheck",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["polyline",{points:"16 11 18 13 22 9",key:"1pwet4"}]]);/**
12
+ * @license lucide-react v0.469.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const se=X("UserX",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"17",x2:"22",y1:"8",y2:"13",key:"3nzzx3"}],["line",{x1:"22",x2:"17",y1:"8",y2:"13",key:"1swrse"}]]),$=Object.values(S).map(t=>({value:t,label:t}));function ne({isOpen:t,onClose:r,onCreated:o}){const{t:l}=E();L(t);const[s,i]=n.useState(""),[p,b]=n.useState(""),[u,h]=n.useState(""),[m,f]=n.useState(""),[d,v]=n.useState("developer"),[y,a]=n.useState(!1),[j,g]=n.useState("");function D(){i(""),b(""),h(""),f(""),v("developer"),g("")}function N(){D(),r()}async function U(){if(g(""),!s.trim()||!p.trim()||!u.trim()||!m.trim()){g(l("admin.all_fields_required"));return}const x=B(m);if(x){g(l(x));return}try{a(!0),await C.post("admin/developers",{json:{name:s.trim(),gitName:p.trim(),gitEmail:u.trim(),password:m,role:d}}).json(),N(),o()}catch(R){const A=R instanceof Error?R.message:l("admin.failed_to_create_developer");g(A)}finally{a(!1)}}return t?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("h3",{className:"text-sm text-[var(--text-primary)]",children:["// ",l("admin.create_developer_title")]}),e.jsx("button",{type:"button",className:"rounded-[4px] p-1 text-[var(--text-muted)] hover:text-[var(--text-primary)] transition-colors",onClick:N,children:e.jsx(M,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"space-y-4 px-5 py-5",children:[j&&e.jsx("div",{className:"rounded-[4px] border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-400",children:j}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:l("admin.username")}),e.jsx("input",{type:"text",placeholder:"e.g. jdoe",value:s,onChange:x=>i(x.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)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:l("profile.git_name")}),e.jsx("input",{type:"text",placeholder:"e.g. John Doe",value:p,onChange:x=>b(x.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)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:l("profile.git_email")}),e.jsx("input",{type:"email",placeholder:"e.g. john@example.com",value:u,onChange:x=>h(x.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)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:l("auth.password")}),e.jsx("input",{type:"password",placeholder:"10-20 chars, letters + digits + special",value:m,onChange:x=>f(x.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)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"}),e.jsx("p",{className:"mt-1 text-[11px] text-[var(--text-muted)]",children:l("admin.password_hint")})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:l("common.role")}),e.jsx(G,{value:d,onChange:v,options:$})]})]}),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",onClick:N,children:l("common.cancel")}),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:y,onClick:U,children:l(y?"common.creating":"common.create")})]})]})]}):null}function oe({isOpen:t,developer:r,onClose:o,onUpdated:l}){var z,P;const{t:s}=E();L(t);const i=q(c=>c.user),[p,b]=n.useState(r.name),[u,h]=n.useState(r.gitName),[m,f]=n.useState(r.gitEmail),[d,v]=n.useState(r.role),[y,a]=n.useState(((z=r.platformUids)==null?void 0:z.lark)??""),[j,g]=n.useState(((P=r.platformUids)==null?void 0:P.slack)??""),[D,N]=n.useState(!1),[U,x]=n.useState(""),A=r.id===(i==null?void 0:i.id)&&r.role===S.ADMIN&&d!==S.ADMIN;n.useEffect(()=>{var c,k;b(r.name),h(r.gitName),f(r.gitEmail),v(r.role),a(((c=r.platformUids)==null?void 0:c.lark)??""),g(((k=r.platformUids)==null?void 0:k.slack)??""),x("")},[r]);async function O(){var c,k;if(x(""),!p.trim()||!u.trim()||!m.trim()){x(s("admin.all_fields_required"));return}A&&x(s("admin.demote_self_warning"));try{N(!0);const _={name:p.trim(),gitName:u.trim(),gitEmail:m.trim(),role:d},T=((c=r.platformUids)==null?void 0:c.lark)??"",H=((k=r.platformUids)==null?void 0:k.slack)??"";if(y.trim()!==T||j.trim()!==H){const I={};I.lark=y.trim(),I.slack=j.trim(),_.platformUids=I}await C.put(`admin/developers/${r.id}`,{json:_}).json(),o(),l()}catch(_){const T=_ instanceof Error?_.message:s("admin.failed_to_update_developer");x(T)}finally{N(!1)}}return t?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 mx-2 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("h3",{className:"text-sm text-[var(--text-primary)]",children:["// ",s("admin.edit_developer_title")]}),e.jsx("button",{type:"button",className:"rounded-[4px] p-1 text-[var(--text-muted)] hover:text-[var(--text-primary)] transition-colors",onClick:o,children:e.jsx(M,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"space-y-4 px-5 py-5",children:[U&&e.jsx("div",{className:"rounded-[4px] border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-400",children:U}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:s("admin.username")}),e.jsx("input",{type:"text",value:p,onChange:c=>b(c.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)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:s("profile.git_name")}),e.jsx("input",{type:"text",value:u,onChange:c=>h(c.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)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:s("profile.git_email")}),e.jsx("input",{type:"email",value:m,onChange:c=>f(c.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)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:s("common.role")}),e.jsx(G,{value:d,onChange:v,options:$}),A&&e.jsx("div",{className:"mt-2 rounded-[4px] border border-[var(--warning)] bg-[var(--warning)]/10 px-3 py-2 text-xs text-[var(--warning)]",children:s("admin.demote_self_inline_warning")})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-xs text-[var(--text-muted)]",children:s("admin.platform_accounts")}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-xs text-[var(--text-muted)]",children:s("admin.lark_uid")}),e.jsx("input",{type:"text",value:y,onChange:c=>a(c.target.value),placeholder:"ou_xxxxxxxxxx",className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-xs text-[var(--text-muted)]",children:s("admin.slack_uid")}),e.jsx("input",{type:"text",value:j,onChange:c=>g(c.target.value),placeholder:"U0XXXXXXXXX",className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] px-3 py-2 text-xs text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]})]})]})]}),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",onClick:o,children:s("common.cancel")}),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:D,onClick:O,children:s(D?"common.saving":"common.save_changes")})]})]})]}):null}function le({isOpen:t,developer:r,onClose:o,onConfirmed:l}){const{t:s}=E();L(t);const[i,p]=n.useState(!1),[b,u]=n.useState(""),h=n.useRef(null);n.useEffect(()=>{var d;t&&((d=h.current)==null||d.focus())},[t]);const m=n.useCallback(d=>{d.key==="Escape"&&!i&&o()},[o,i]);async function f(){u("");try{p(!0),await C.put(`admin/developers/${r.id}/reset-totp`),o(),l()}catch(d){const v=d instanceof Error?d.message:s("admin.failed_to_reset_2fa");u(v)}finally{p(!1)}}return t?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",{ref:h,className:"relative z-10 w-full max-w-[480px] rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] font-mono",onKeyDown:m,tabIndex:-1,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(ae,{className:"h-4 w-4 text-yellow-400"}),e.jsxs("h3",{className:"text-sm text-[var(--text-primary)]",children:["// ",s("admin.reset_2fa")]})]}),e.jsx("button",{type:"button",className:"rounded-[4px] p-1 text-[var(--text-muted)] hover:text-[var(--text-primary)] transition-colors",onClick:o,children:e.jsx(M,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"space-y-3 px-5 py-5",children:[b&&e.jsx("div",{className:"rounded-[4px] border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-400",children:b}),e.jsxs("p",{className:"text-xs text-[var(--text-primary)]",children:[s("admin.reset_2fa_confirm_message")," ",e.jsx("span",{className:"text-[var(--accent)]",children:r.name}),"?"]}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:s("admin.reset_2fa_audit_note")})]}),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",onClick:o,children:s("common.cancel")}),e.jsx("button",{type:"button",className:"rounded-[4px] bg-yellow-600 px-3 py-1.5 text-xs text-white hover:opacity-90 transition-opacity disabled:opacity-50",disabled:i,onClick:f,children:s(i?"admin.resetting":"admin.reset_2fa")})]})]})]}):null}function V({dev:t,currentUserId:r,onEdit:o,onReset2fa:l,onToggleStatus:s}){const{t:i}=E();return e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",className:"rounded-[4px] p-2.5 md:p-1.5 text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-white/[0.05] transition-colors",title:i("common.edit"),onClick:()=>o(t),children:e.jsx(ee,{className:"h-3.5 w-3.5"})}),t.id!==r&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"rounded-[4px] p-2.5 md:p-1.5 text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-white/[0.05] transition-colors",title:i("admin.reset_2fa"),onClick:()=>l(t),children:e.jsx(te,{className:"h-3.5 w-3.5"})}),e.jsx("button",{type:"button",className:`rounded-[4px] p-2.5 md:p-1.5 transition-colors hover:bg-white/[0.05] ${t.status===w.ACTIVE?"text-red-400 hover:text-red-300":"text-green-400 hover:text-green-300"}`,title:t.status===w.ACTIVE?i("admin.deactivate"):i("admin.activate"),onClick:()=>s(t),children:t.status===w.ACTIVE?e.jsx(se,{className:"h-3.5 w-3.5"}):e.jsx(re,{className:"h-3.5 w-3.5"})})]})]})}function je(){const{t}=E(),r=q(a=>a.user),[o,l]=n.useState(""),[s,i]=n.useState(!1),[p,b]=n.useState(null),[u,h]=n.useState(null),{data:m,loading:f,refetch:d}=W(()=>{const a={};return o&&(a.q=o),C.get("admin/developers",{searchParams:a}).json()},[o]);async function v(a){const j=a.status===w.ACTIVE?w.DISABLED:w.ACTIVE;try{await C.put(`admin/developers/${a.id}`,{json:{status:j}}),d()}catch{}}function y(a){switch(a){case S.ADMIN:return"text-yellow-400";case S.DEVELOPER:return"text-blue-400";default:return"text-[var(--text-secondary)]"}}return e.jsxs("div",{className:"font-mono",children:[e.jsxs("div",{className:"mb-6 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm text-[var(--text-primary)]",children:t("admin.developers_title")}),e.jsx("p",{className:"text-xs text-[var(--text-muted)]",children:t("admin.developers_subtitle")})]}),e.jsxs("button",{type:"button",className:"flex items-center gap-1.5 rounded-[4px] bg-[var(--accent)] px-3 py-1.5 text-xs text-black hover:opacity-90 transition-opacity",onClick:()=>i(!0),children:[e.jsx(Y,{className:"h-3.5 w-3.5"}),t("admin.create_developer")]})]}),e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"relative w-full max-w-xs",children:[e.jsx(K,{className:"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-[var(--text-muted)]"}),e.jsx("input",{type:"text",placeholder:t("admin.search_developers"),value:o,onChange:a=>l(a.target.value),className:"w-full rounded-[4px] border border-[var(--border)] bg-[var(--bg-input)] py-1.5 pl-8 pr-3 text-xs text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:outline-none focus:border-[var(--accent)]"})]})}),f?e.jsx("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-4",children:e.jsx(Q,{rows:4})}):!m||m.length===0?e.jsx(J,{icon:Z,title:t(o?"admin.no_matching_developers":"admin.no_developers_found"),description:t(o?"admin.try_adjusting_search":"admin.create_first_developer"),actionLabel:o?void 0:t("admin.create_developer"),onAction:o?void 0:()=>i(!0)}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"hidden md:block 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)] text-left text-[var(--text-muted)]",children:[e.jsx("th",{className:"pb-2 pr-4 font-normal",children:t("admin.username")}),e.jsx("th",{className:"pb-2 pr-4 font-normal",children:t("profile.git_name")}),e.jsx("th",{className:"pb-2 pr-4 font-normal",children:t("admin.role")}),e.jsx("th",{className:"pb-2 pr-4 font-normal",children:t("admin.status")}),e.jsx("th",{className:"pb-2 pr-4 font-normal",children:t("admin.totp")}),e.jsx("th",{className:"pb-2 pr-4 font-normal",children:t("common.created_at")}),e.jsx("th",{className:"pb-2 font-normal",children:t("common.actions")})]})}),e.jsx("tbody",{children:m.map(a=>e.jsxs("tr",{className:"border-b border-[var(--border-row)] hover:bg-white/[0.02] transition-colors",children:[e.jsx("td",{className:"py-2.5 pr-4 text-[var(--text-primary)]",children:a.name}),e.jsx("td",{className:"py-2.5 pr-4 text-[var(--text-secondary)]",children:a.gitName}),e.jsx("td",{className:"py-2.5 pr-4",children:e.jsx("span",{className:y(a.role),children:a.role})}),e.jsx("td",{className:"py-2.5 pr-4",children:e.jsx("span",{className:F(a.status),children:a.status})}),e.jsx("td",{className:"py-2.5 pr-4",children:e.jsx("span",{className:a.totpEnabled?"text-green-400":"text-[var(--text-muted)]",children:a.totpEnabled?t("common.enabled"):t("common.disabled")})}),e.jsx("td",{className:"py-2.5 pr-4 text-[var(--text-muted)]",children:new Date(a.createdAt).toLocaleDateString()}),e.jsx("td",{className:"py-2.5",children:e.jsx(V,{dev:a,currentUserId:r==null?void 0:r.id,onEdit:b,onReset2fa:h,onToggleStatus:v})})]},a.id))})]})}),e.jsx("div",{className:"md:hidden space-y-3",children:m.map(a=>e.jsxs("div",{className:"rounded-[4px] border border-[var(--border)] bg-[var(--bg-card)] p-3",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-xs text-[var(--text-primary)] font-medium",children:a.name}),e.jsx(V,{dev:a,currentUserId:r==null?void 0:r.id,onEdit:b,onReset2fa:h,onToggleStatus:v})]}),e.jsx("div",{className:"text-[11px] text-[var(--text-secondary)] mb-1",children:a.gitName}),e.jsxs("div",{className:"flex items-center gap-3 text-[11px]",children:[e.jsx("span",{className:y(a.role),children:a.role}),e.jsx("span",{className:F(a.status),children:a.status}),e.jsx("span",{className:a.totpEnabled?"text-green-400":"text-[var(--text-muted)]",children:a.totpEnabled?t("common.enabled"):t("common.disabled")})]})]},a.id))})]}),e.jsx(ne,{isOpen:s,onClose:()=>i(!1),onCreated:d}),p&&e.jsx(oe,{isOpen:!!p,developer:p,onClose:()=>b(null),onUpdated:d}),u&&e.jsx(le,{isOpen:!!u,developer:u,onClose:()=>h(null),onConfirmed:d})]})}export{je as default};
@@ -1,4 +1,4 @@
1
- import{j as e,L as t}from"./index-CTVNJXL0.js";import{I as s,a}from"./DocsPrimitives-BRoBpWHe.js";import"./copy-Ciibu4ij.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-DEBRwDiX.js";import{I as s,a}from"./DocsPrimitives-DStFX1T8.js";import"./copy-Dz9BK4cr.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,J as t,S as p,b as h,M as m,a3 as y,d as x,L as v}from"./index-CTVNJXL0.js";import{D as k}from"./download-C5M-xVQE.js";import{B as b}from"./bot-BREu_dZH.js";import{G as a,W as g}from"./workflow-C1oJzdp3.js";import{S as u}from"./settings-B6CvfGJs.js";import{F as w}from"./file-text-FxjQforC.js";/**
1
+ import{c,a as _,j as s,K as t,S as p,b as h,M as m,a8 as y,d as x,L as v}from"./index-DEBRwDiX.js";import{D as k}from"./download-qgK3DePm.js";import{B as b}from"./bot-CJ6g-CgU.js";import{G as a,W as g}from"./workflow-BUUDFa4R.js";import{S as u}from"./settings-BZ99cVpB.js";import{F as w}from"./file-text-moi4pXOm.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,b as m,J as b,M as p,a3 as u,e as v,a4 as f,a5 as h}from"./index-CTVNJXL0.js";import{A as j}from"./arrow-left-BmJhqQxJ.js";const o=[{to:"/docs/cli",label:"cli",icon:m},{to:"/docs/api",label:"api",icon:b},{to:"/docs/bot",label:"bot",icon:p},{to:"/docs/skill",label:"skill",icon:u},{to:"/docs/all",label:"all",icon:v}],k=new Set(o.map(s=>s.to));function y(){const{t:s}=i(),r=x(),t=!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:[t&&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}),s("docs.docs_back")]}),o.map(({to:e,label:l,icon:c})=>a.jsxs(f,{to:e,className:({isActive:n})=>`flex items-center gap-1.5 px-3 py-3 text-xs lowercase border-b-2 transition-colors shrink-0 ${n||t&&e==="/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})]},e))]}),a.jsx("main",{className:"flex-1 overflow-auto p-4 md:p-6",children:a.jsx(h,{})})]})}export{y as default};
1
+ import{a as i,g as x,j as a,L as d,b as m,K as b,M as p,a8 as u,e as v,a9 as f,aa as h}from"./index-DEBRwDiX.js";import{A as j}from"./arrow-left-BDjYIP3Y.js";const o=[{to:"/docs/cli",label:"cli",icon:m},{to:"/docs/api",label:"api",icon:b},{to:"/docs/bot",label:"bot",icon:p},{to:"/docs/skill",label:"skill",icon:u},{to:"/docs/all",label:"all",icon:v}],k=new Set(o.map(s=>s.to));function y(){const{t:s}=i(),r=x(),t=!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:[t&&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}),s("docs.docs_back")]}),o.map(({to:e,label:l,icon:c})=>a.jsxs(f,{to:e,className:({isActive:n})=>`flex items-center gap-1.5 px-3 py-3 text-xs lowercase border-b-2 transition-colors shrink-0 ${n||t&&e==="/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})]},e))]}),a.jsx("main",{className:"flex-1 overflow-auto p-4 md:p-6",children:a.jsx(h,{})})]})}export{y as default};
@@ -1 +1 @@
1
- import{a as i,r as s,j as e,C as x}from"./index-CTVNJXL0.js";import{C as p}from"./copy-Ciibu4ij.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-DEBRwDiX.js";import{C as p}from"./copy-Dz9BK4cr.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{z as xe,f as ue,a as me,r as s,G as v,O as be,h as d,j as e,L as ve,Y as V,t as c}from"./index-CTVNJXL0.js";import{S as X}from"./Select-DYnPuPlP.js";import{U as je,A as he,R as ge}from"./RemoveMemberConfirmDialog-pg5SnIU8.js";import{a as ye}from"./agent-type-options-DYVQzNPE.js";import{P as fe}from"./plus-CgnoWo2P.js";import"./chevron-down-pInOI1Sz.js";function Te(){const{key:o}=xe(),l=ue(),{t:r}=me(),Z=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,M]=s.useState(""),[I,P]=s.useState(v.GITHUB),[A,O]=s.useState(""),[R,U]=s.useState(be.CLAUDE),[G,$]=s.useState("50"),[E,D]=s.useState(""),[B,L]=s.useState(""),[F,J]=s.useState(""),[z,q]=s.useState("0"),[p,f]=s.useState(""),[H,N]=s.useState(null),[x,k]=s.useState(""),[K,u]=s.useState(!1),[ae,W]=s.useState(!1),[i,_]=s.useState(null),[ne,Y]=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),M(t.sshUrl??""),P(t.gitPlatform),O(t.defaultBranch),U(t.agentType),$(String(t.maxTurns)),D(t.workspaceRoot??""),L(t.setupCommands??""),J(t.testCommand??""),q(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:I,agentType:R,maxTurns:parseInt(G,10)||50,workspaceRoot:E||null,setupCommands:B||null,testCommand:F||null,ptyOutputFilter:parseInt(z,10)||0,pipeline:b}}),c.success(r("projects.project_saved")),l(`/projects/${a.key}`)}catch(Q){const pe=Q instanceof Error?Q.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)){Y(!0);try{await d.delete(`web/projects/${a.key}/members`,{searchParams:{developerId:String(i.developerId)}}),await m()}catch{}finally{Y(!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=>M(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:I,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=>O(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:R,onChange:t=>U(t),options:Z})}),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=>D(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:B,onChange:t=>L(t.target.value),rows:3,placeholder:`npm install
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:z,onChange:t=>q(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:()=>W(!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:()=>W(!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
+ import{A as xe,f as ue,a as me,r as s,G as v,Q as be,h as d,j as e,L as ve,Z as V,t as c}from"./index-DEBRwDiX.js";import{S as X}from"./Select-Bxil-UGQ.js";import{U as je,A as he,R as ge}from"./RemoveMemberConfirmDialog-gr2WUWrR.js";import{a as ye}from"./agent-type-options-BBcV6_LY.js";import{P as fe}from"./plus-Bh23dSc7.js";import"./chevron-down-D9VkxIPs.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,M]=s.useState(""),[I,A]=s.useState(v.GITHUB),[P,R]=s.useState(""),[O,U]=s.useState(be.CLAUDE),[G,$]=s.useState("50"),[E,D]=s.useState(""),[B,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),M(t.sshUrl??""),A(t.gitPlatform),R(t.defaultBranch),U(t.agentType),$(String(t.maxTurns)),D(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:P,gitPlatform:I,agentType:O,maxTurns:parseInt(G,10)||50,workspaceRoot:E||null,setupCommands:B||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=>M(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:I,onChange:t=>A(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:P,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=>D(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:B,onChange:t=>L(t.target.value),rows:3,placeholder:`npm install
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-CTVNJXL0.js";/**
1
+ import{c as o,j as e}from"./index-DEBRwDiX.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-CTVNJXL0.js";import{a as r}from"./DocsPrimitives-BRoBpWHe.js";import"./copy-Ciibu4ij.js";function c(){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 ai-powered task naming. when configured, overlord uses any openai-compatible api to auto-generate concise task names and branch slugs from the task description. without these variables, tasks fall back to showing the full description."}),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 ai task naming.'})]}),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 for task name generation."})]}),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."})]})]})]})}),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-DEBRwDiX.js";import{a as r}from"./DocsPrimitives-DStFX1T8.js";import"./copy-Dz9BK4cr.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
@@ -21,4 +21,4 @@ LLM_MODEL=llama-3.1-8b-instant
21
21
  # deepseek
22
22
  LLM_BASE_URL=https://api.deepseek.com/v1
23
23
  LLM_API_KEY=sk-...
24
- LLM_MODEL=deepseek-chat`})]}),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:"> file locations"}),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:"path"}),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/"})}),e.jsx("td",{className:"py-2",children:"server configuration directory"})]}),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/.env"})}),e.jsx("td",{className:"py-2",children:"server environment variables"})]}),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/overlord.db"})}),e.jsx("td",{className:"py-2",children:"sqlite database"})]}),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/logs/"})}),e.jsx("td",{className:"py-2",children:"server log files"})]}),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/"})}),e.jsx("td",{className:"py-2",children:"worker configuration directory"})]}),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/.env"})}),e.jsx("td",{className:"py-2",children:"worker environment variables"})]}),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/workspaces/"})}),e.jsx("td",{className:"py-2",children:"task workspace directory"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"~/.overlord-worker/jwt.json"})}),e.jsx("td",{className:"py-2",children:"worker jwt credentials"})]})]})]})})]})]})]})}export{c as default};
24
+ LLM_MODEL=deepseek-chat`})]}),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:"> file locations"}),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:"path"}),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/"})}),e.jsx("td",{className:"py-2",children:"server configuration directory"})]}),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/.env"})}),e.jsx("td",{className:"py-2",children:"server environment variables"})]}),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/overlord.db"})}),e.jsx("td",{className:"py-2",children:"sqlite database"})]}),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/logs/"})}),e.jsx("td",{className:"py-2",children:"server log files"})]}),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/"})}),e.jsx("td",{className:"py-2",children:"worker configuration directory"})]}),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/.env"})}),e.jsx("td",{className:"py-2",children:"worker environment variables"})]}),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/workspaces/"})}),e.jsx("td",{className:"py-2",children:"task workspace directory"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 pr-4",children:e.jsx("code",{className:"text-[var(--accent)]",children:"~/.overlord-worker/jwt.json"})}),e.jsx("td",{className:"py-2",children:"worker jwt credentials"})]})]})]})})]})]})]})}export{d as default};