@midhunxavier/code-flow 0.0.0-stage → 0.1.0-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -2
  3. package/bin/codeflow.mjs +8 -0
  4. package/bin/launcher.mjs +127 -0
  5. package/dist/remote-host.json +1 -0
  6. package/licenses/inter.txt +92 -0
  7. package/licenses/preact.txt +21 -0
  8. package/licenses/signals-core.txt +21 -0
  9. package/licenses/signals.txt +21 -0
  10. package/licenses/typescript-notices.txt +193 -0
  11. package/licenses/typescript.txt +55 -0
  12. package/licenses/uqr.txt +22 -0
  13. package/licenses/xterm-fit.txt +19 -0
  14. package/licenses/xterm.txt +21 -0
  15. package/package.json +34 -4
  16. package/public/assets/browser-7XI52A6V.js +8 -0
  17. package/public/assets/changes-EYFPASEI.js +1 -0
  18. package/public/assets/chunk-7H3ZLTKA.js +2 -0
  19. package/public/assets/chunk-L7TUCIYF.js +1 -0
  20. package/public/assets/chunk-LLMQG23J.js +163 -0
  21. package/public/assets/main-KIRM2OEK.js +1 -0
  22. package/public/assets/settings-QJZVW22Y.js +9 -0
  23. package/public/assets/styles-615EBB20.css +32 -0
  24. package/public/assets/terminal-A2FI2NAX.js +62 -0
  25. package/public/assets.json +1 -0
  26. package/public/bundle-meta.json +1 -0
  27. package/public/docs/.nojekyll +0 -0
  28. package/public/docs/accessibility.html +19 -0
  29. package/public/docs/acp-agents.html +117 -0
  30. package/public/docs/agent-containers.html +79 -0
  31. package/public/docs/api.html +1130 -0
  32. package/public/docs/app.js +342 -0
  33. package/public/docs/application-improvements.html +275 -0
  34. package/public/docs/architecture-explorer.html +19 -0
  35. package/public/docs/architecture.html +149 -0
  36. package/public/docs/auto-team.html +142 -0
  37. package/public/docs/automations.html +109 -0
  38. package/public/docs/checkpoint-review.html +37 -0
  39. package/public/docs/code-hosts.html +35 -0
  40. package/public/docs/code-intelligence.html +35 -0
  41. package/public/docs/configuration.html +346 -0
  42. package/public/docs/context-inspection.html +23 -0
  43. package/public/docs/coordinated-changes.html +28 -0
  44. package/public/docs/deferred-runs.html +25 -0
  45. package/public/docs/dependency-discovery.html +19 -0
  46. package/public/docs/documentation.html +84 -0
  47. package/public/docs/dynamic-teams-evaluation.html +174 -0
  48. package/public/docs/dynamic-teams-implementation-plan.html +882 -0
  49. package/public/docs/dynamic-teams-implementation-review-1.html +141 -0
  50. package/public/docs/dynamic-teams-plan-review-0.html +204 -0
  51. package/public/docs/extensions.html +42 -0
  52. package/public/docs/external-sources.html +96 -0
  53. package/public/docs/filesystem-policy.html +26 -0
  54. package/public/docs/filtered-tasks.html +44 -0
  55. package/public/docs/font-license.txt +92 -0
  56. package/public/docs/getting-started.html +118 -0
  57. package/public/docs/github-review-threads.html +26 -0
  58. package/public/docs/github.html +157 -0
  59. package/public/docs/help.html +69 -0
  60. package/public/docs/index.html +77 -0
  61. package/public/docs/installation.html +74 -0
  62. package/public/docs/launch-profiles.html +48 -0
  63. package/public/docs/maintenance.html +60 -0
  64. package/public/docs/memory-claims.html +31 -0
  65. package/public/docs/memory-storage.html +58 -0
  66. package/public/docs/notifications.html +39 -0
  67. package/public/docs/patterns.html +195 -0
  68. package/public/docs/performance-results.html +210 -0
  69. package/public/docs/performance.html +166 -0
  70. package/public/docs/project-conventions.html +22 -0
  71. package/public/docs/project-first-navigation-plan.html +587 -0
  72. package/public/docs/project-teams-implementation-plan.html +772 -0
  73. package/public/docs/project-teams.html +99 -0
  74. package/public/docs/provider-compatibility.html +20 -0
  75. package/public/docs/releasing.html +61 -0
  76. package/public/docs/remote-workers.html +64 -0
  77. package/public/docs/review-inbox.html +26 -0
  78. package/public/docs/run-storage.html +23 -0
  79. package/public/docs/runs.html +141 -0
  80. package/public/docs/search.json +1 -0
  81. package/public/docs/security.html +133 -0
  82. package/public/docs/shared-projects.html +31 -0
  83. package/public/docs/ssh-projects.html +60 -0
  84. package/public/docs/style.css +768 -0
  85. package/public/docs/task-reruns.html +30 -0
  86. package/public/docs/team-collaboration.html +379 -0
  87. package/public/docs/verification.html +22 -0
  88. package/public/docs/vscode.html +53 -0
  89. package/public/docs/worker-permission-verification.html +122 -0
  90. package/public/index.html +17 -0
  91. package/scripts/check-node.mjs +7 -0
  92. package/scripts/codeflow.mjs +55 -0
  93. package/scripts/pty.py +273 -0
  94. package/src/acp-connections.js +110 -0
  95. package/src/adapters/acp-presets.js +37 -0
  96. package/src/adapters/acp-types.js +0 -0
  97. package/src/adapters/acp.js +328 -0
  98. package/src/adapters/agy-auth.js +67 -0
  99. package/src/adapters/agy-isolation.js +223 -0
  100. package/src/adapters/agy.js +297 -0
  101. package/src/adapters/claude.js +220 -0
  102. package/src/adapters/codex-app-server.js +518 -0
  103. package/src/adapters/codex.js +299 -0
  104. package/src/adapters/errors.js +57 -0
  105. package/src/adapters/index.js +91 -0
  106. package/src/adapters/managed-permissions.js +37 -0
  107. package/src/adapters/model-discovery.js +100 -0
  108. package/src/adapters/process.js +418 -0
  109. package/src/adapters/team-tools.js +102 -0
  110. package/src/adapters/types.js +0 -0
  111. package/src/agent-container.js +155 -0
  112. package/src/approvals.js +121 -0
  113. package/src/architecture.js +456 -0
  114. package/src/assets.js +44 -0
  115. package/src/automation.js +901 -0
  116. package/src/certificate-renewal.js +75 -0
  117. package/src/chat-handoff.js +55 -0
  118. package/src/checkpoint-review.js +72 -0
  119. package/src/checks.js +303 -0
  120. package/src/code-host-git.js +102 -0
  121. package/src/code-hosts-api.js +99 -0
  122. package/src/code-hosts.js +482 -0
  123. package/src/code-intelligence-worker.mjs +452 -0
  124. package/src/code-intelligence.js +141 -0
  125. package/src/collab/api.js +365 -0
  126. package/src/collab/checkpoints.js +198 -0
  127. package/src/collab/connections.js +139 -0
  128. package/src/collab/host-execution.js +347 -0
  129. package/src/collab/hub-client.js +210 -0
  130. package/src/collab/link-api.js +229 -0
  131. package/src/collab/link.js +595 -0
  132. package/src/collab/model.js +496 -0
  133. package/src/collab/runner.js +1014 -0
  134. package/src/collab/store.js +1452 -0
  135. package/src/collab/terminals.js +361 -0
  136. package/src/collaboration-reviews.js +116 -0
  137. package/src/config.js +48 -0
  138. package/src/context-budget.js +14 -0
  139. package/src/context-inspection.js +204 -0
  140. package/src/context.js +154 -0
  141. package/src/conventions.js +283 -0
  142. package/src/coordinated-api.js +247 -0
  143. package/src/deferred-launch.js +82 -0
  144. package/src/deferred-runs.js +515 -0
  145. package/src/dependency-health.js +35 -0
  146. package/src/diff.js +43 -0
  147. package/src/docs-help.js +316 -0
  148. package/src/doctor.js +232 -0
  149. package/src/engine.js +4366 -0
  150. package/src/env.js +44 -0
  151. package/src/experience.js +50 -0
  152. package/src/extensions.js +144 -0
  153. package/src/filesystem-access.js +107 -0
  154. package/src/filesystem-policy.js +238 -0
  155. package/src/filtered-task-limits.js +93 -0
  156. package/src/filtered-tasks-api.js +53 -0
  157. package/src/filtered-tasks.js +576 -0
  158. package/src/fs.js +57 -0
  159. package/src/git.js +626 -0
  160. package/src/github-review-threads.js +181 -0
  161. package/src/github.js +538 -0
  162. package/src/http.js +69 -0
  163. package/src/improve-settings.js +38 -0
  164. package/src/improve.js +187 -0
  165. package/src/integrations.js +373 -0
  166. package/src/integrity.js +259 -0
  167. package/src/journey-api.js +77 -0
  168. package/src/journey-replay.js +65 -0
  169. package/src/journey-store.js +97 -0
  170. package/src/journeys.js +60 -0
  171. package/src/json.js +81 -0
  172. package/src/launch-profiles.js +292 -0
  173. package/src/learnings.js +80 -0
  174. package/src/log.js +39 -0
  175. package/src/maintenance.js +335 -0
  176. package/src/memory-analysis.js +182 -0
  177. package/src/memory-claims.js +153 -0
  178. package/src/memory-sqlite.js +236 -0
  179. package/src/memory.js +552 -0
  180. package/src/merge-validation.js +58 -0
  181. package/src/model-catalog.js +238 -0
  182. package/src/model-research.js +91 -0
  183. package/src/notes.js +176 -0
  184. package/src/notifications.js +413 -0
  185. package/src/patterns/auto-team-model.js +212 -0
  186. package/src/patterns/auto-team.js +659 -0
  187. package/src/patterns/council.js +199 -0
  188. package/src/patterns/debate.js +188 -0
  189. package/src/patterns/findings.js +141 -0
  190. package/src/patterns/index.js +19 -0
  191. package/src/patterns/loop.js +158 -0
  192. package/src/patterns/pipeline.js +125 -0
  193. package/src/patterns/prompts.js +181 -0
  194. package/src/patterns/race.js +147 -0
  195. package/src/patterns/schemas.js +40 -0
  196. package/src/patterns/solo.js +49 -0
  197. package/src/patterns/supervisor.js +235 -0
  198. package/src/patterns/task-draft.js +29 -0
  199. package/src/patterns/tdd.js +231 -0
  200. package/src/patterns/team-strategies.js +67 -0
  201. package/src/performance.js +43 -0
  202. package/src/persistence-status.js +35 -0
  203. package/src/phone-sessions.js +96 -0
  204. package/src/preview-overlay.js +383 -0
  205. package/src/preview.js +219 -0
  206. package/src/privacy.js +23 -0
  207. package/src/project-report.js +22 -0
  208. package/src/project-team-model.js +178 -0
  209. package/src/project-team-policy.js +42 -0
  210. package/src/project-team-store.js +213 -0
  211. package/src/project-teams-api.js +36 -0
  212. package/src/project-teams.js +551 -0
  213. package/src/projects.js +286 -0
  214. package/src/provider-eligibility.js +9 -0
  215. package/src/readiness.js +98 -0
  216. package/src/remote-tls.js +66 -0
  217. package/src/remote-workers/bundles.js +198 -0
  218. package/src/remote-workers/client.js +332 -0
  219. package/src/remote-workers/durability.js +37 -0
  220. package/src/remote-workers/protocol.js +68 -0
  221. package/src/remote-workers/stdio.js +138 -0
  222. package/src/remote-workers/worker.js +304 -0
  223. package/src/remote.js +204 -0
  224. package/src/repo-config.js +201 -0
  225. package/src/repo-coordination.js +732 -0
  226. package/src/repo-tree.js +106 -0
  227. package/src/retention-policy.js +466 -0
  228. package/src/review-inbox.js +38 -0
  229. package/src/routing.js +49 -0
  230. package/src/run-analysis.js +111 -0
  231. package/src/run-cold-store.js +231 -0
  232. package/src/run-environment.js +15 -0
  233. package/src/run-history.js +91 -0
  234. package/src/run-log.js +160 -0
  235. package/src/run-permissions.js +110 -0
  236. package/src/run-projection.js +75 -0
  237. package/src/run-recovery.js +53 -0
  238. package/src/run-status.js +54 -0
  239. package/src/serve.js +138 -0
  240. package/src/server.js +2738 -0
  241. package/src/shared-access.js +103 -0
  242. package/src/shared-accounts.js +301 -0
  243. package/src/shared-api.js +239 -0
  244. package/src/shell.js +346 -0
  245. package/src/ship.js +344 -0
  246. package/src/slots.js +74 -0
  247. package/src/snapshot.js +388 -0
  248. package/src/source-context.js +17 -0
  249. package/src/sse-writer.js +70 -0
  250. package/src/ssh-projects/bootstrap.mjs +95 -0
  251. package/src/ssh-projects/config.js +45 -0
  252. package/src/ssh-projects/gateway.js +143 -0
  253. package/src/ssh-projects/manager.js +320 -0
  254. package/src/ssh-projects/team-autostart.mjs +93 -0
  255. package/src/ssh-projects/team-remove.mjs +69 -0
  256. package/src/ssh-projects/team-status.mjs +39 -0
  257. package/src/ssh-projects/transport.js +116 -0
  258. package/src/stats.js +139 -0
  259. package/src/store.js +544 -0
  260. package/src/stream.js +91 -0
  261. package/src/sweeps.js +241 -0
  262. package/src/tailscale.js +101 -0
  263. package/src/task-draft.js +23 -0
  264. package/src/team-evaluation.js +242 -0
  265. package/src/team-mailbox.js +160 -0
  266. package/src/team-memory.js +84 -0
  267. package/src/team-rerun-graph.js +15 -0
  268. package/src/team-reruns.js +130 -0
  269. package/src/team-scheduler.js +121 -0
  270. package/src/team-template-store.js +98 -0
  271. package/src/team-templates.js +117 -0
  272. package/src/team-tool-client.mjs +79 -0
  273. package/src/team-tools.js +176 -0
  274. package/src/teams.js +0 -0
  275. package/src/templates.js +62 -0
  276. package/src/transcript.js +134 -0
  277. package/src/verification-integrity.js +27 -0
  278. package/src/verification.js +183 -0
  279. package/src/watch.js +195 -0
  280. package/src/work-queue.js +47 -0
  281. package/src/workflow-control.js +83 -0
  282. package/src/workspace-api.js +207 -0
  283. package/src/workspace-changes.js +61 -0
  284. package/src/workspace.js +146 -0
@@ -0,0 +1 @@
1
+ import{b as y}from"./chunk-L7TUCIYF.js";import{F as Y,P as X,R as W,U as V,V as ee,c as _,g as K,h as $,i as A}from"./chunk-LLMQG23J.js";import{Ab as M,B as D,Ba as z,Dd as J,G as g,I as P,Ib as R,J as O,Ja as F,K as i,La as I,Mc as q,O as L,Pa as b,Qa as s,Ra as m,Wc as k,Zb as T,a as v,aa as N,d as w,da as x,dd as B,fd as Q,g as r,ga as o,h as E,i as S,nd as U,o as f,pb as j,pd as G,q as h,xc as Z,yb as C,z as u,zb as H}from"./chunk-7H3ZLTKA.js";var oe="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAbSElEQVR42u19a7Ak53nW87xfz5zbrtYSNnbwRU4UGywZE2E5GKfCerETxUlRIVRWVUBcXBJLOKU4wchA7IKzBxzsXCCxQ1JEIT9SCUXYjQMEKiQorpWILSmJpJjgtZEdZGQby7Zuez17zkx/78OP7+ue7p6eOXPO7kryiedU15mZ7pnufi/Pe/8G+OrjWX3wyp9ChBrnOvFMnPMyPo5COAbgGARSXxkXvS6DFHBcYV+J67oMJ1VAsuemBhxXwFEIpE8UQLZ27/nn0w78iTLieTAMxxHEGIk5gqKgEDAlXbEEiur9EsBSel4Q3AJQlJdBPyOIAoDDMAALh5UOg0phqRhH4NzSeOuJ7atPP45v+JoLjfsiTsBwC+Ozz4AkEbWKLn9081rZ8IgUDrv7jXR7MYRDCBi4Ae7pzE2Fri5E1XMB6hwDAMwHOtI+dT4L5c9OXWN+j5OTsPO9ZPt4AFAJUH6BtC+BeLhk/Ag8/Bb+Mh9sQCxbQveMMUAiAAOTFKw+oJu9xNtY4s1cxSEYoHGSXs/S6oI8E4kdojZvnNX7mRHW4E5FaFfnY5nIUoMZuyACK6YQotLpSZAGIAAYAG6AX4A84B4P5c/gmwa/Wmv/HrSBl4SHG4nry/fqm8ywEQLexAESPkTETBBGRzpQ6X9U58bVf2Hsea0usWtZmM0YNr5Dc26+eVzFDAIyAEaIgCBIROGrQDRgXOIuL/GPcZgPQTIQ6r+j/oftGes36Dj+8eHaffFfDMzvGS7jTYMRFDYRrYQoBDmCHAaBcFAC5GlD878mGxr73CfHe+e1Kur79MaKBAKs85pqv0bj/ebrxnVSDirCFBEgFOZQcR5xeBa+EvAtheEjuLt8B0jH+jFmZLhCGpBVbfmjunZQ4JeKFXwzz0MQHECQJwn0TNAKGD1LabWP3QuYoQVNqOpKdA356nneOJCYhripHT3XxGyD2JDWpBlqfJRRBcL4ADA6X/6s3jS4Heviom5rsRfir35E31AU/mvFkn0tz6EEENwRmoQX2nhcS7imbGM/A9TznG0D2/zfhKXuZ2dSoYe5Td6o88EK2ibwJJghcEwNTyPi6uL7R781Nt3Mt+MGBQDx8mmAZCB97V792WC4qwh4IbZRCigqqZ8ifPM9z1pQSfEiBMfOaNq0AXOUaUdta7pS7LFD3efpv8Mm3pRAi6OrUIzOxTvwbcW/XMQwczcGd+X+Cy8ZaPV/FAW+FluIAoLHTPzkkNX4LPVrQFNaey9A85lQMa+JstqJ8nv0TDiDIZPXmmwECAqF+fYQPo7jw/iW4X2V4O6dAVXA8XUP2sGLN941PGiH/RxKCEWM/VLvHY+kBUH5rOqqvxr+f4foTX9fPd6M5km1dkd1qvO8wYguEyo3mUieBgwwMPoBC9tb/nvxnH0zTqHExmzPaGcvKEd7axdufE9x0A77WZRyFJXku9pwU7+uvBa1PZfqdY+30fu8hreGF9TyhmK/JwTPCOwLbjFt8unr9Yb9anpkHvN7YrIPSSCDnUMslu0bsRa/O3mLs+nMRXB/cK/+/LJwfwGYxjA5GDXtj3vjgtEDQ7NwftqaLmCY5xmEKxCSTqQdtTEzNiLoyt8mYYboK2bbI3zUfx+H53lEi3hBDKP4vnAgDHQeUQ62JGIO/PR6P5qD99ph/yyi8wozgW0jzwa8Wp3CMDgcJkCScROwAn/RXzd6Dbj0sVm2oJjrcpIx3D8+Urh9q87B4QjuE99eHenv84TQ3bAAM9QD9pqD65rDlN3YgO55Oc0YNY5jvm9axRSmUJkk5WVYs8Ivhu9w4GO4G4YJ6RZgwNF06Uvj4h1hCdBFuBzmmiZ+RWz3jlvYJbx38wk7aIFmEHcRKNoLA2ZpHvuPk0+YkNxRQlJKIlLkGIDCGwAAb+yPCYp52D+8b+sVNsbNuADIETRDcis/v4aePmlGMyRekPiLYLwukz3QDprRhCM0UheVsFmj/iSHCGIbgPsrcVLLILf68rv9DMjqYuPiu2wZKzqDKE0Y0Ap6vA03wgzY8TlE340hxoJ24VJsQJ8GdfflPJR6YpG0W8QYgPR8nME1AL4wZa9mMiCriyHczHFKH6sj2U2vp2V8+xigGYRdlAm7lf7dHscd0h+zckhdLWBDYQRw7CB0EBolBhybtmDWG/WSWrtPL7QSN2oblMP6DGori9nNTs5jQt8x3vk/61if8/lZW995Fv1s33d5Oy6A1MjOEnJCLio6IARsXlwBABxbxAbckPlblq9hUVytzRyketu4TuXiZ0m4z7AH8yBnlpfU9Yq4g2ZwQc3hgm5tJxSfBJScLmAIyRyX7rCwvTgDXpC/RsWrGQAXooCiie+t4ke2AwsRdRHY0RzXchE3doEE35S/Pw/uOFsI2HU4GlUjSTArAOk8lg88vXhB5vFM2zGua6rZVEKtMjZxjoovoMozYaEPghaFIy0AQ4vA1axzzrNrE61IySHyKbwCT2YN0M4acCof5HixUr6HLePrO/jlmiH1e/GCFomKL8U4L5q84wxY6yniKEODSdIQYAyfxk3cxPp6byQ8rQGZS2XEquJ0bh+NoMt9B0ldRAK1gHbMO35R4z7rc/M0bIfvaJZFJwm8uhSYWxbsdzJhbXe5IM9MrTKUnGBeyyX1BTBdl2iEL1X6fQFJ36laP2O/OtLPLLJyBt+K0a4K/3XGVcxngNgRCO+JCAU4Z3gos3BykRTDohB0qdHyIvFAH/x0EnN1iZIJo+lyLA1N7veOvxsfw/p63UGycD0gYoaf39dFsBuiawG/HAscs+jmC3hl2sFbm4pVBEQHPbV6mHLBXlULRWrO4MD+FUjhhmPcfVFeAD1vnYtqlhU5L/2gXULRbiBokYwodgEz6km6qaeA3yhs1K4/J1Jq0aMvLweN44f9/4Zfx7rmti/O1ACLM1BLC0rUosS/HJtfhu/AbEehEsSqNMdMOKuYkMt85u6wgjH6uWIt3I4NOj5xgntqS2HV+pI1oS5KqMftmuVmLnqzi6ajF3l+OQv0nWp/XXxvWd7EfcpFQeVKESB8/+hv8n9j/WSBjSPlnhiQawvtbOY8yccupHtRo6tLNMCa4c1wjqGdQqlJIMQpp98TU9ydIssDw+Cj8bv9tuEvY10FNnbuFZ1rAxbKaPoOzNiNG7oTg7CHegF2WeJstaCki2ibhsroOSiXCRHFUlEGuBz/wG8b/mSSfMZFzjQvDmhlPedh/5QA7RZzF80JLZqm7jOq2EVdue9C2MzByOkuYxF8tSjKEp9WwO34Xv53HD5ZYONIXBQEd2YA5msAewik3Ro+7BGisIsE3E7FdzUkPG+CqwqsCAmkKAQOlkzLQFn62SjciRW8H3+LT2bMj7uxQDsyoNmcKk33U7aHKpTqpJrU7rST97SbbOnlMrharCZMGgkDA9MUDdPARiT+yIEPYcV+AX+Xn051lJ0N7iU353JGKp6uhJTG9I25SQllFFyCMyW1xUYue5bEZ51Sp9151jGLULfqyanaxmtjasp+PatCr7LYEIg0boHlpjw8Brc/EvGHHOJ+x9MP4bZrztSEx92eJR+XjwHuRJ5Fq+IMdtMNMbUDaJjyFrqwNdLZ7W1cGG9ja1xirIgylSbgIpjmBPKXctLnUROHk+c9rdDUpPdePZ1TUn83VX2SVgduOgfJ1n5WKTVuO/UUiM/K8RDK8Hs4vfkAfuVVX6i//9afG+ATjztObOxpPKkfDSWCFI/rrqUVvBkXU0G+RYicoItDQOPS9dSF8/rSxfM4W47gdAiGpLuA3NLNVhBbjTVlAlSEF6uBlDxzpcSsuuFG7d7YWppZzWhVhGYjWdVmNlralM7V0olmlxPSYBQNCEUKu3y0TbNPgvwvivgP+NlrTwEAjirgxN6G9WYywI7rrqVlvFmbqQu6PjAKMiIS8C+fOavPX3gKm4gKAyLAkr1CKo56Nc7JiQYo/0+tZEwSWM88TAitNBGUPlOXuyfSKmai11NEzaaRDtx0NKD67hZz0NAWqYqECAqWrRoZEJbAMIS2L2yT4Vdj0PvxwZd9HACxvk5s7E4bZjKgOK67BkttBtAhL8A4Go/1f558XE+U5zFcNgUExDQ+BY+s52g9d07WIztkQyMsE3ZC/JrYlcSrTfy03zLcVARuawXFqdvS9Bv1JyftcOz3BtjqhibgJB1QoeFB+Hhz02g/Wn7xpT+CE4zN2TlcyoxYNqmNxJygIRjPb23xf335c3zKz3FlEIBIlKVD0eFeGUdNZkJbI3Z1cJn2G9rEl0FuSaJlEA0kE5wx4UGaWUwQl5iYta6Cn8m4RL21b4z5Oxu9hta4RutkeqbcNJO8gCRsn4mUr2qwtmF/6rHfWL3jMy/CBh1Hj4dLH9Jr5H4oQAPCz2xt8dTjn8M4jDgMQOkRcoekXAkivOoEpiZhY2tOqCKUZU2ZSLpqzcjgSwMZIAQgb1ImegU9DduQhwHhFYOnhbjhSWF6ULZvLrPd/eG54O5yAgiUi1tPl7TBt26NBh9e+qEvfh1O3JI04ZIYUN2EHAiAXxyN9ckn/p80GCNQ8iz1Qkzg1AjBXEpNkg44JxxwVM307JmkridCAQaIAVCAK0DKhK8I7m2mzZL0JtH7G84rI94dvZjSiMlpGkkC5UYgouD26ZI2uH4cR7+Jd37+pdigL8KE2RBEz6JlkFz61JOPacwtBgc9xjwV6YR7Ijg8e0DKQeSMgd7qPpq5DiQjnQx41oBM8InRZgvTNYuwE3Sf2+2vJhR23drpabA2nyenT4of0woK22dLFiuvsFF5HH//syto+dm7ZIA8k7hA0GPnT+v0+LQNTYwoXXA4HEq8gWJzHqZp0NXo2mWjpVpwqNVOPZWLbRnZJrPYGzGz8bfXUYzezmvO3Gr+ZVgCUXDrTInhVa8P0d+b7MEJ2xsDBEcAMIojfuHs4zYIQowl5FGKLkUXFCV3CUkLIE82ofpr9jGmMDMXTlMVg83As6cXvEX8jsROChesI9mpGipmrAah+TmN2hvt519TEyYedL5lKtjW6QiEH1y5/bPfiBO3xHlGua8thTm9cBEDAGe2zmjLz9MQIURIDleqEbkmxE6vK8LXVwOn6inturmoM67TSk+of9JcPZLLvp7AKUjpEH43s+nEDKNde8+trXJEEAEbhLGP/gkA4PqjWpwBVW+o8TEB4FNbZwFFyBPeyzWZnGMiNl3teSXvwIMmJaWa+KxshVpGMwmqWqPvMzOf1A5TG5yZIu3N0HKBrg22oL0dytR6EDg6J7fiLYN3PPraeQbZejrjUngS7BGNAF0oL5ICPEqClKFeSVItq2p2/SrvJlTC1gANqoYHZnjSItUgTOP+FIm5QFFJszs2WtMmfYExO7xki3x18F4H89nnG6yFUnorAOAT/RfZpwHJrhj+p58XMN5OJqYymmAywWpMhGnOXdV+W6xI6e2kmfWv/KAFRt2ZDXv/wdx9fnpubbIHhiamRWzX0CSQcRsQ3nLt+meWc66Ii2iAACCu4iHfGn0RcoO8BDzDUO4VkDITKs3zbAsEyDOh6+vxLPXKYyUNHMgdSE3DrQ4VOGuFiJ1aNhbtVSEWGz6b5xmhETdk/z1ui+R1j54bvCrPXizAgCqU/nY+LsdJBAxMvk15MsL1mDQqrZjcNXM8ML3ATLYVmdA1M/J7VQuwqq7TJsPqKpCmZ0VnMYScX+HfiVFzpJ/tjEeTiSI7CCbXYDWAeA0A4O67bTE39PoXEADiKPyiI6QuReXJWEmpjCFP3o6ake9EUr3nRps9LMwpiyqCVk4iAIlxyi0H7WHYOS3X6lnniXvrT+kKdnfdm6bdYZMpbHhIVdBpYIyvyqNfC8YBG0cisG54oviwynCvg2tGjQA4PApwpyAyU7mCn0q6cyw7qRAzE5fNpEHaZ3SQuacPk83yQgPkpDXB2HC/1Uw2tBNsO1vb+YTvwstU2qgakbf2MWiMzlfXKAcirk2G+HEtGogJR28gNlgq6qcdwSFGg8fU415HpQKzXVBMBI0xLXeoGlIElMkI06vqmFI5zYW06ERiosfMzGpluawJFYRNWtay8e1I/BQ0a7ZRncq7cVrauwzp5uxaxO7RiMrzBg7Migdmh8k5ghv/9Ev+wGP4ZRefR2AMVjkFdxBOwKmYcb1aVqPWFOUReqUALqZFKl2NLccVysZbMR0rJaaqVO1x1Wal8r6aK3zM8MY4a9EhThFrStrnaYD1MZLTjJndmb7AaiknbhGOHg/lky+7s9TwpDw8z+TbIKIBkYjJDjCnKJmTczUTqtREJcFMGSZW6YpshJurTwjKy45UTZE+sTdopLgbjKiZ0e3lQXtlQM6JG9iFF7aPZ2drQRSnl70hEkSZgcHOJgg6wd0uV+M4cUo4wRiXX7oxjoPfkRdXmTQCVCZyuaA8nCl3gE7PUTMqTFesit21oaVXRjfnl6vXqtZXbDj5uS/HpBasEOydne3WIGpp7KyJ2YIPdt7fxYbJd1XmCLRU2DaDrHik6dzsctXEDQfWDT/Ji/Hpl707+tKveAzLFEJaFVQRiA5FT6LrEVRafYfukGLtmiqlNJJmVHZAnss5XjdbqjIwakRnNeE129j2LH9YE9zQXF+s9T5z/a96vqsNve+lp0xyE/ipFOS+UXvsC9rwPOUxKoGfwt959OMhlN8nlF+flmTVGAbQSxMtlRDFQMlUiYPDkldAA2LICWkDFMhUQkuVL+WlUqvYodlbopBdD0AK2UNiu18mm73uarDsSdqRHReTnSB61hK7ndRFdRnd3WRAuT0Oawcf8uYA5N6XrawamCjcqlWUn38LNLqZ8D8NxgOpouWeWE+DVMhgFCw5xCQEY1VeJAKFANJAN4gmYACiKkMaCBNTQ0JVpZwEruOU4xAIqxeNaaeLmaPT7trEVU2afQzoGuvOc/Y3zFpuG8wpMGexau7jU/GVX3MjbuP40petrKYGUuV/E8CHAH5Ib/3cKxHGr0YcvxLGF4FaBTQAUMgZQJkkg1laTyr58AGSiakMqchcTgmsK2FQgESJhBnBGCAvRFsheDVZvAhLBwI1AsoLqYuI1o5Ru66jdROknE4d9TKjsZAc2VMNUi5hq+KRMFgBXL+J2zie1Tu0SwY00hUQcfhYwD0bEb/0kk8B+BQWnKXYy+xE6zNHFfQirGnzSy+30fiIyL9uw2v+ArUJ+MjFYFKjMYNsDxVNEdX6M6tEDwQ1l0Rhw6azpUykmcetaBz++wgA18/Nl+PSVnk8etzw5VPEn7xBOHFKwMaV/qEDdbF88EMXvge68BNm/kKNz7vTMhNSd8uk+c469ZnqPcywBz3EbywUUdvxjIs5ERA1PBTi+MJv+I+98Dvm9QpdyV+z4JWl/zHi6A3EI08bHrwtAvClH7h4nYqL/4mhfLVGF9xJS9a7yo1YFlrrOIJsB1GzavN1o2x22DiR/hr75SLMow1JhDeU7z/0uzh6PODELfFZ+gkTPDM/xXLrAwXuvGmMd229YqDN+4K2roleSoBVcgnm3mA2OxmnffnZFKoDwLpol6AnSb9BYIylrzy/iFtnf0Y/9vzb5xF/76unP/cewp03jXHrAwP8+PKnSfxzLF1FMgVCoKH+X4ttjguqZQ+tJwawTkSco2laOp5WfW+10LdHLR8q4njzY5J+GOsyXH9Kz/KP+DyTbEgAc/B9uGZ0+olPAniB+yiPtli7v4dsQ1DT2LK/yFM7udlGkA2n12NEsRoiwpcd5V/Cew89vJP07ycNQD2IcewYz72bTzr5gIarAOkwa8QQWbLNJlJvjUjYplLK9RgBjbXU01IAliRfpYYHQrThUxbK78R7Dz2MwyeLnYi//xgAIC0LIJbCownrTcrEaxK6CtBbhLdu3kiZPzkMqWGpYTLcSyxfXbgNP2PBvq3cOHQ/1k8WuGexiZn9x4ATyVUx+hptOnfDOt/TJH73V3wqrEcK0muNybBjhMHdHNLaC4pI/vYwDA6X68Pf3+2gHvcdAyBiHRyUT99vYel1vn3eZWZgmKB47mJQN6HfaAe3yr3s/NgNIZirRFguYigAC++Lb7B/iiMscfhkgXt2N6hn++6H1gAcGG7/mTAYvoa+DQRjLb3513jaBZP2EjAphc/s3TQgxwSTPAiOtauLOBg8guXBt8f3hHfjCFP74T27n5LcXwy4IU3ZjcG/YUtrS5CizDiBH06XKzmBm0T4pr2YGGFzjyxWzFcOmZv/QjxQvD6+i/8tTUmucxGDexmScc9xF5SM+FEdxPbW9yBuw3OhnmxMu0iN1TZSYm1Sk2EjEFYVXLlFwNeuDq74GQXeEd9lv9aYDY64hKVBin1kfA1AXPb4nWFp+Vq/cCYqWKhSBXXTNCdrr9U5uEZRXZz0twVXZLEa4tIAMvz8yjXhPee/l483ZoMv+ccU9w8DTh0TJPJHtm8FCVljSJKsG8iBRo2n2VpSpxYESm4CtHooROERLOOd8Qf5n89fJqnff15QzrWvfECvt63yo9reYpSq2dIaUTyvNz9p47JGBJw9HKFksVqoCHDi30bih3EHn8DhkwXeeLdjY0OXi/j7RwOOZv9/q7wNRWEasRRV1AVyAQ7PDYvsNF/ldT7hbm7UgQOFwx+2If5h/AH+egvr78FlT7MX+8L1vIVx5QN6CS6Wf03bI4gI9bQSmz+fyqnlHQmJLufwYHBzl+GnDrzc/tmZ7+LpidQfKa/U5Rf7w/UENIpvteXiKp2/EEVm42uNlv7cOKtGbcwRiRB0YDU48AdYCe+Mb+fdZ66w1O8jG5Brgj+HleXT5R8Gs+vieMuFVH1GvfZsnpJKU4WgSxSdyweCM25pwJ+Iy198H2578ebEw9n7Ahx/fDTgePqNs8Gm/ootFdfp4kUHc1U+B19pgrDh10dF2jD46lIQcfdwNdyx+bb848yX2cPZ/wyo+mzG8VYNg0TWrr7YmWqS3KKg1YPBDU9hiI3y7fjXJemJ8FcW6/cfBGXXc/BB/TmO4wMhenA52zORuSU1ekRYDj4IiIb/ODiIfzRKK10ZDq8b7tl4RqV+f2jA9chDJPGvDpZCga2yBFnUk+Ak4O6MpK+uheh4NCzjPXo7/90IAG59YIA7X1viHpbP5m0UX8HeT+ptK8uXcynEarY8R7yOUtJwNfhAUMC/8VUc87fxS/XQ9J03jZ8Lt1F8BeM/AaAYLv22Av62Us+pSyCKVfNlIDp+15b4nvj3+OFny8jubzdUIu5GCA/6B0D7PghDwOEFHtaSfRCve/DncdNN44ZrqecS8fdXRezHdT0cL0fAabwWD+EIt9IyYifDc03q99+jbxmA9ZPFTkvFfPVxuZlwXAFHFb5K+K8+Fn78f4eywyDh1HjXAAAAAElFTkSuQmCC";var ie=Object.assign(document.createElement("link"),{rel:"icon",type:"image/png",href:oe});document.head.append(ie);_();var p=document.getElementById("root"),te=[1,2,5,10],ae=0;function se({message:a,seconds:l,onRetry:c}){let[t,n]=E(l);return S(()=>{if(t<=0)return c();let e=setTimeout(()=>n(t-1),1e3);return()=>clearTimeout(e)},[t]),o("div",{role:"alert",class:"boot-error",children:[o("h3",{children:"code-flow couldn't load"}),o("div",{class:"msg err",children:a}),o("p",{class:"help",children:t>0?`Trying again in ${t}s\u2026`:"Trying again\u2026"}),o("button",{class:"btn primary",disabled:t<=0,onClick:()=>n(0),children:"Retry now"}),D?o("a",{class:"btn",href:"/#/settings/connections/workspace",children:"Manage connections"}):null]})}async function ne(){let a,l;try{let e=await O("/api/auth/self");if(e.kind==="anonymous"){r(o(X,{}),p);return}if(e.kind==="shared"){r(o(w,{children:[o(W,{identity:e}),o(Y,{})]}),p);return}await $(),await P();let d=K.value.kind==="ssh"?await i("/api/auth/self"):e;z(d.streamSharing),[a,l]=await Promise.all([i("/api/agents"),i("/api/patterns")])}catch(e){let d=te[Math.min(ae,te.length-1)];r(o(se,{message:e.message,seconds:d,onRetry:()=>void ne()},ae++),p);return}F.value=a;for(let e of a)N[e.id]=e.displayName;I.value=l,b(),A(),s.value=m(),h(()=>{let e=u(s.value);g(e)&&(f(J),location.hash!==e&&!(e==="#/"&&!location.hash)&&(u(m(location.hash))===e?history.replaceState(null,"",e):history.pushState(null,"",e)))});let c=()=>{g(location.hash)&&(s.value=m())};window.addEventListener("popstate",c),window.addEventListener("hashchange",c),h(()=>{let e=s.value;!M.value||e.view!=="composer"||e.project===void 0||f(()=>{(e.project!==C.value||H.value)&&U(e.project,{stay:!0})})}),r(o(V,{}),p),y(),T(),q(),Z(),i("/api/templates").then(e=>Q.value=e,e=>x(`Couldn't load the templates: ${e.message}`,5e3));let t=Promise.all([k(),R()]),n=L.get("repo");n&&await j(n,!1),await t,await G(),B(ee),v(()=>Promise.all([k(),R()]),3e4)}ne();
@@ -0,0 +1,9 @@
1
+ import{a as Ke}from"./chunk-L7TUCIYF.js";import{A as Rt,B as It,C as Tt,D as xt,E as Et,G as Dt,Q as At,S as $t,T as Nt,a as ze,b as Ne,d as Xe,e as Ze,f as et,g as Re,j as bt,n as Be,o as ie,p as vt,q as ft,r as gt,s as he,t as yt,u as wt,v as kt,w as Ct,x as St,y as Ie,z as Pt}from"./chunk-LLMQG23J.js";import{A as Ye,Ac as qe,Bc as ut,Cc as pt,Fb as at,Hc as me,Ja as ye,K as D,Ka as we,La as tt,M as O,Ma as nt,Mc as Se,O as ee,Q as L,Qa as Le,a as Ve,bd as Pe,cd as Me,d as x,da as J,fc as ne,ga as e,gc as je,h as i,ha as te,hd as mt,i as $,ib as st,id as ht,j as Ge,k as H,lc as it,nc as ot,ob as Q,oc as pe,pc as ke,qc as rt,s as ge,t as Je,ub as W,uc as lt,v as $e,w as Qe,wc as ct,xc as Ce,yc as dt,zc as Oe}from"./chunk-7H3ZLTKA.js";var Ue=[{id:"workspace",label:"Work on another computer",description:"Open a complete workspace over SSH, with files, terminals and agents on that computer."},{id:"execution",label:"Delegate execution",description:"Send individual agent turns to a provisioned SSH worker while keeping this workspace here."},{id:"sharing",label:"Share access",description:"Open this computer from another device or collaborate with people."}];function Lt({purpose:t="workspace"}){let l=Ue.find(o=>o.id===t)??Ue[0],n=Re.value;return e("div",{class:"connections-hub",children:[e("nav",{class:"purpose-nav","aria-label":"Connection purpose",children:Ue.map(o=>e("a",{class:`btn ${l.id===o.id?"primary":""}`,href:`#/settings/connections/${o.id}`,"aria-current":l.id===o.id?"page":void 0,children:o.label}))}),e("p",{class:"help",children:l.description}),l.id==="workspace"?e(bt,{}):null,l.id==="execution"?e(x,{children:[e(kt,{}),e("p",{class:"help",children:["To run shared tasks on a teammate\u2019s computer or grant host execution, configure ",e("a",{href:"#/settings/connections/sharing",children:"Board and People under Share access"}),"."]})]}):null,l.id==="sharing"?e(x,{children:[n.kind==="local"?e($t,{}):e("p",{class:"help",children:["Device access is configured on your local computer. ",n.kind==="ssh"?e("a",{href:"/#/settings/connections/sharing",children:"Open local access settings"}):null]}),e("section",{class:"settings-card",children:[e("h3",{children:"People"}),e("p",{children:"Shared boards, reviews and handovers. Manage project membership in Project \u2192 More \u2192 People."}),e("label",{class:"checkpoint",children:[e("input",{type:"checkbox",checked:Ze.value,onChange:o=>et(o.currentTarget.checked)}),e("span",{children:"Show Board in the app menu"})]}),e("p",{class:"help",children:"Show an unused Board shortcut in this browser. Configured collaboration remains visible; access is controlled by project roles and grants."})]}),e(x,{children:[e("a",{class:"btn",href:"#/team",children:n.kind==="ssh"?"Open computer board":"Open Board"}),e(Nt,{}),n.kind!=="ssh"?e(At,{projects:W.value}):null]})]}):null]})}var jt=[{id:"done",label:"Run finished"},{id:"failure",label:"Run or verification failed"},{id:"needs-attention",label:"A decision or answer is needed"}];function Ot(){let[t,l]=i([]),[n,o]=i([]),[d,b]=i(""),[y,w]=i(""),v=async()=>{let[s,f]=await Promise.all([D("/api/notifications"),D("/api/notifications/deliveries")]);l(s),o(f)};$(()=>{let s=!0,p=Ve(()=>Promise.all([D("/api/notifications"),D("/api/notifications/deliveries")]).then(([u,C])=>{s&&(l(u),o(C),b(""))},u=>{s&&b(u.message)}),1e4);return()=>{s=!1,p()}},[]);let r=async s=>{w(s.id);try{await O(`/api/notifications/deliveries/${s.id}/retry`),await v(),J("Notification retry queued")}catch(f){b(f.message)}finally{w("")}};return e("section",{class:"wb-card notifications-panel","aria-label":"Outbound notifications",children:[e("h2",{children:"Notifications"}),e("p",{children:"Choose a destination, the events to send and the projects it covers. Notifications include task titles, run IDs, workflow and result status."}),t.length?e("div",{class:"wb-list",children:t.map(s=>e(Qt,{destination:s,refresh:v},s.id))}):e("p",{class:"help",children:"Configure HTTPS webhook or Slack destinations with CODEFLOW_NOTIFICATIONS_FILE or CODEFLOW_NOTIFICATIONS_JSON on the server. New destinations start disabled."}),e("h3",{children:"Delivery history"}),e("p",{class:"help",children:"Keeps 200 deliveries. Temporary failures retry up to three times. A delivery interrupted by restart needs an explicit retry; the recipient may already have received it."}),n.length?e("div",{class:"table-wrap delivery-history",children:e("table",{class:"ins-table",children:[e("thead",{children:e("tr",{children:[e("th",{children:"Created"}),e("th",{children:"Destination"}),e("th",{children:"Event"}),e("th",{children:"Run"}),e("th",{children:"Status"}),e("th",{children:"Attempts"}),e("th",{children:"Action"})]})}),e("tbody",{children:n.map(s=>e("tr",{children:[e("td",{"data-label":"Created",children:new Date(s.createdAt).toLocaleString()}),e("td",{"data-label":"Destination",children:t.find(f=>f.id===s.target)?.name??s.target}),e("td",{"data-label":"Event",children:s.manual?"Manual test":jt.find(f=>f.id===s.event)?.label??s.event}),e("td",{"data-label":"Run",children:s.teamId?e("a",{href:`#/project/${s.project}`,children:"Standing team"}):s.runId==="test"?"Test":e("a",{href:`#/run/${s.runId}`,children:s.runId})}),e("td",{"data-label":"Status",children:[e("span",{class:`badge${s.state==="delivered"?" ok":s.state==="failed"?" err":s.state==="sending"?" run":""}`,children:s.state.charAt(0).toUpperCase()+s.state.slice(1)}),s.httpStatus?` \xB7 HTTP ${s.httpStatus}`:"",s.reason?e("div",{class:"help",children:s.reason}):null,s.nextAttemptAt?e("div",{class:"help",children:["Next: ",new Date(s.nextAttemptAt).toLocaleTimeString()]}):null]}),e("td",{"data-label":"Attempts",children:[s.totalAttempts??s.attempts,s.retryCount?e("div",{class:"help",children:[s.retryCount," manual retries"]}):null]}),e("td",{"data-label":"Action",children:s.state==="failed"?e("button",{class:"btn small",disabled:!!y,onClick:()=>r(s),children:y===s.id?"Queuing\u2026":"Retry delivery"}):"\u2013"})]},s.id))})]})}):e("p",{class:"help",children:"No notifications have been queued."}),d?e("p",{class:"msg err",role:"alert",children:d}):null]})}function Qt({destination:t,refresh:l}){let[n,o]=i(t.settings),[d,b]=i(""),[y,w]=i("");$(()=>{o(t.settings)},[JSON.stringify(t.settings)]);let v=n.projects==="all"?[]:n.projects,r=[{id:"unassigned",name:"Without a project"},...W.value.map(p=>({id:p.id,name:p.name})),...v.filter(p=>p!=="unassigned"&&!W.value.some(u=>u.id===p)).map(p=>({id:p,name:`Unavailable project: ${p}`}))],s=async()=>{b("save"),w("");try{await O(`/api/notifications/${t.id}`,n),await l(),J("Notification settings saved")}catch(p){w(p.message)}finally{b("")}},f=async()=>{b("test"),w("");try{await O(`/api/notifications/${t.id}/test`),await l(),J("Test notification queued")}catch(p){w(p.message)}finally{b("")}};return e("article",{class:"wb-item notification-destination","aria-label":`Notification settings for ${t.name}`,children:[e("div",{class:"wb-item-head",children:[e("h3",{children:t.name}),e("span",{class:`badge${t.settings.enabled?" ok":""}`,children:t.settings.enabled?"Enabled":"Off"})]}),e("p",{class:"help",children:[t.protocol,t.host?` \xB7 ${t.host}`:""]}),t.available?t.configured?null:e("p",{class:"msg warn",children:"A valid HTTPS destination and its credentials are required on the server."}):e("p",{class:"msg err",children:"Saved notification state is unavailable. Check the server log before enabling delivery."}),e("label",{class:"check",children:[e("input",{type:"checkbox",checked:n.enabled,disabled:!t.available||!t.configured||!!d,onChange:p=>o({...n,enabled:p.currentTarget.checked})}),"Enable notifications to this destination"]}),e("fieldset",{disabled:!!d||!t.available,children:[e("legend",{children:"Events"}),jt.map(p=>e("label",{class:"check",children:[e("input",{type:"checkbox",checked:n.events.includes(p.id),onChange:u=>o({...n,events:u.currentTarget.checked?[...n.events,p.id]:n.events.filter(C=>C!==p.id)})}),p.label]},p.id))]}),e("fieldset",{disabled:!!d||!t.available,children:[e("legend",{children:"Projects"}),e("label",{class:"check",children:[e("input",{type:"checkbox",checked:n.projects==="all",onChange:p=>o({...n,projects:p.currentTarget.checked?"all":[]})}),"All projects"]}),n.projects!=="all"?r.map(p=>e("label",{class:"check",children:[e("input",{type:"checkbox",checked:v.includes(p.id),onChange:u=>o({...n,projects:u.currentTarget.checked?[...v,p.id]:v.filter(C=>C!==p.id)})}),p.name]},p.id)):null]}),e("div",{class:"wb-actions",children:[e("button",{class:"btn primary",disabled:!!d||!t.available||n.enabled&&(!t.configured||!n.events.length||n.projects!=="all"&&!n.projects.length),onClick:s,children:d==="save"?"Saving\u2026":"Save notification settings"}),e("button",{class:"btn",disabled:!!d||!t.configured||!t.available,onClick:f,children:d==="test"?"Queuing\u2026":"Send test notification"})]}),t.dropped?e("p",{class:"msg warn",children:[t.dropped," events exceeded the queue limit."]}):null,t.lastError?e("p",{class:"msg warn",children:t.lastError}):null,y?e("p",{class:"msg err",role:"alert",children:y}):null]})}function qt({onImport:t}){let[l,n]=i([]),[o,d]=i(""),[b,y]=i("issue"),[w,v]=i([]),[r,s]=i(),[f,p]=i(!1),[u,C]=i(""),[S,R]=i("");$(()=>{let h=!0;return D("/api/integrations").then(m=>{h&&(n(m),d(m[0]?.id??""))},m=>{h&&R(m.message)}),()=>{h=!1}},[]);let T=l.find(h=>h.id===o);$(()=>{v([]),s(void 0),p(!1),R(""),T&&!T.kinds.includes(b)&&y(T.kinds[0])},[o,b]);let A=async(h=!1)=>{if(!T)return;let m=o,P=b;C("list"),R("");try{let c=new URLSearchParams({kind:b});h&&r&&c.set("cursor",r);let k=await D(`/api/integrations/${encodeURIComponent(o)}/items?${c}`);m===o&&P===b&&(v(N=>[...new Map((h?[...N,...k.items]:k.items).map(q=>[`${q.kind}:${q.key}`,q])).values()]),s(k.nextCursor),p(k.truncated))}catch(c){R(c.message)}finally{C("")}},I=async h=>{C(h.key),R("");try{t(await O(`/api/integrations/${encodeURIComponent(o)}/import`,{kind:b,key:h.key}))}catch(m){R(m.message)}finally{C("")}};return e("section",{class:"wb-card sources-panel","aria-label":"External sources",children:[e("h2",{children:"External sources"}),e("p",{children:"Read issues and review requests from configured services, then attach a selected item to a task."}),e("p",{class:"help",children:"Imported text stays untrusted context. Review requests import descriptions and branch metadata; their code is not fetched automatically."}),l.length?e(x,{children:[e("div",{class:"wb-fields",children:[e("label",{children:["Integration",e("select",{class:"field","aria-label":"Source integration",value:o,disabled:!!u,onChange:h=>d(h.currentTarget.value),children:l.map(h=>e("option",{value:h.id,children:[h.name," \xB7 ",h.provider," \xB7 ",h.project]},h.id))})]}),e("label",{children:["Source type",e("select",{class:"field","aria-label":"External source type",value:b,disabled:!!u,onChange:h=>y(h.currentTarget.value),children:T?.kinds.map(h=>e("option",{value:h,children:h==="pr"?"Review requests":"Issues"},h))})]})]}),T?.configured?null:e("p",{class:"msg warn",children:"The server does not have credentials for this integration."}),e("button",{class:"btn",disabled:!T?.configured||!!u,onClick:()=>A(),children:u==="list"?"Loading\u2026":"Load sources"}),e("div",{class:"wb-list","aria-live":"polite",children:w.map(h=>e("article",{class:"wb-item source-item",children:[e("div",{class:"wb-item-head",children:[e("b",{children:[h.key," \xB7 ",h.title]}),h.state?e("span",{class:"badge",children:h.state.charAt(0).toUpperCase()+h.state.slice(1).toLowerCase()}):null]}),h.body?e("p",{class:"help",children:h.body.slice(0,400)}):null,e("div",{class:"wb-actions",children:[h.url?e("a",{class:"btn small",href:h.url,target:"_blank",rel:"noreferrer",children:"Open source"}):null,e("button",{class:"btn small primary",disabled:!!u,onClick:()=>I(h),children:u===h.key?"Importing\u2026":"Use as task context"})]})]},`${h.kind}:${h.key}`))}),r&&w.length<1e3?e("button",{class:"btn",disabled:!!u,onClick:()=>A(!0),children:"Load next page"}):null,f||r&&w.length>=1e3?e("p",{class:"help",children:"The listing reached its limit. Narrow the configured project or open the service to inspect additional items."}):null]}):e("p",{class:"help",children:"Configure sources with CODEFLOW_INTEGRATIONS_FILE or CODEFLOW_INTEGRATIONS_JSON on the server. Credentials come from server environment variables."}),S?e("p",{class:"msg err",role:"alert",children:S}):null]})}function Mt({projects:t=[]}){let[l,n]=i([]),[o,d]=i([]),[b,y]=i(""),[w,v]=i(""),[r,s]=i(""),[f,p]=i(""),[u,C]=i(),[S,R]=i(""),[T,A]=i(""),[I,h]=i(!1),[m,P]=i(""),[c,k]=i(""),[N,q]=i(""),[oe,z]=i("Review this pull request against its target; explain defects and make necessary fixes."),[X,V]=i(""),[re,F]=i("claude"),[j,Z]=i(""),[K,ve]=i(""),[le,xe]=i(""),[ce,Ee]=i(""),[B,g]=i(),[E,De]=i(""),[fe,de]=i(""),[ae,Jt]=i("main"),Ae=async()=>{let a=await D("/api/code-hosts");n(a.integrations),d(a.history),y(G=>G||a.integrations[0]?.id||"")};$(()=>{Ae().catch(a=>R(a.message))},[]);let M=async(a,G={})=>{if(!I){h(!0),R(""),A("");try{let U=await O(`/api/code-hosts/${a}`,G);a==="create-preview"?g(U):a.startsWith("history/")?A(U.detail):a==="preview"||a.endsWith("/fetch")?C(U):a.endsWith("/push-preview")?C(ue=>ue&&{...ue,push:U}):a.endsWith("/merge-preview")?C(ue=>ue&&{...ue,merge:U}):a.endsWith("/run")?(Z(U.id),A(`Review run started: ${U.id}`)):(A(U.detail??"Action confirmed. Refresh the provider preview before another action."),C(void 0),a.endsWith("/review")&&P(""),g(void 0)),await Ae()}catch(U){R(U.message)}finally{h(!1)}}},We=t.find(a=>a.id===f),_=!!u&&u.expiresAt<=Date.now();return e("section",{class:"wb-card code-hosts","aria-label":"GitLab and Bitbucket code hosts",children:[e("h2",{children:"GitLab and Bitbucket"}),e("p",{class:"help",children:"Fetch pinned PR code, inspect discussions, start an isolated review run and explicitly push a verified owned result. Merges validate the exact source plus target and use an atomic Git target lease. Direct push permission is required; PR closure is separate. Native queues and unsupported provider policies block merging."}),S?e("p",{class:"msg err",role:"alert",children:[S," Your draft is preserved. Unknown actions are never retried automatically."]}):null,T?e("p",{role:"status",children:T}):null,l.length?null:e("p",{class:"help",children:"Configure a GitLab or Bitbucket Cloud integration on the server using environment variable credential references. See docs/code-hosts.md."}),e("div",{class:"wb-fields",children:[e("label",{children:["Code host",e("select",{class:"field","aria-label":"Code host integration",value:b,onChange:a=>{y(a.currentTarget.value),C(void 0),g(void 0)},children:l.map(a=>e("option",{value:a.id,children:[a.name," \xB7 ",a.provider,a.configured?"":" \xB7 credentials unavailable"]},a.id))})]}),e("label",{children:["PR or merge request number",e("input",{class:"field","aria-label":"Code host PR number",inputMode:"numeric",value:w,onInput:a=>{v(a.currentTarget.value),C(void 0)}})]}),e("label",{children:["Project (optional)",e("select",{class:"field","aria-label":"Code host project",value:f,onChange:a=>{let G=a.currentTarget.value;p(G),s(t.find(U=>U.id===G)?.repos[0]??""),C(void 0)},children:[e("option",{value:"",children:"Standalone repository"}),t.map(a=>e("option",{value:a.id,children:a.name},a.id))]})]}),We?e("label",{children:["Local repository",e("select",{class:"field","aria-label":"Code host repository",value:r,onChange:a=>{s(a.currentTarget.value),C(void 0)},children:We.repos.map(a=>e("option",{value:a,children:a},a))})]}):e("label",{children:["Local Git repository",e("input",{class:"field","aria-label":"Code host repository",value:r,onInput:a=>{s(a.currentTarget.value),C(void 0)}})]})]}),e("div",{class:"wb-actions",children:e("button",{class:"btn small primary",disabled:I||!b||!w||!r,onClick:()=>M("preview",{integration:b,key:w,repo:r,...f?{project:f}:{}}),children:"Load pinned PR preview"})}),e("details",{children:[e("summary",{children:"Create a new PR from a verified owned result"}),e("label",{children:["Completed run ID",e("input",{class:"field","aria-label":"New PR owned run",value:j,onInput:a=>{Z(a.currentTarget.value),g(void 0)}})]}),e("label",{children:["Published result branch",e("input",{class:"field","aria-label":"New PR result branch",value:K,onInput:a=>{ve(a.currentTarget.value),g(void 0)}})]}),e("label",{children:["Target branch",e("input",{class:"field","aria-label":"New PR target branch",value:ae,onInput:a=>{Jt(a.currentTarget.value),g(void 0)}})]}),e("label",{children:["PR title",e("input",{class:"field","aria-label":"New PR title",maxLength:200,value:E,onInput:a=>{De(a.currentTarget.value),g(void 0)}})]}),e("label",{children:["PR body",e("textarea",{class:"field","aria-label":"New PR body",rows:4,maxLength:2e4,value:fe,onInput:a=>{de(a.currentTarget.value),g(void 0)}})]}),e("button",{class:"btn small",disabled:I||!b||!j||!K||!E.trim(),onClick:()=>M("create-preview",{integration:b,runId:j,branch:K,targetBranch:ae,title:E,body:fe}),children:"Preview new PR and source branch"}),B?e("div",{"aria-label":"New PR creation preview",children:[e("p",{children:["Create ",e("b",{children:B.title})," in ",B.integration," \xB7 ",B.repo,", from new branch ",e("code",{children:B.sourceBranch})," at ",e("code",{children:B.head})," into ",B.targetBranch," at ",e("code",{children:B.target}),"."]}),e("pre",{children:B.body}),e("p",{class:"help",children:"This action pushes the unique source branch only if it is absent, then creates the provider PR. These are separate remote actions. An unknown outcome requires inspecting that exact branch and PR before retrying."}),e("button",{class:"btn small primary",disabled:I||B.expiresAt<=Date.now(),onClick:()=>M(`${B.id}/create`),children:"Push new source branch and create PR"})]}):null]}),u?e("article",{class:"wb-item code-host-preview","aria-label":"Pinned code host preview",children:[e("h3",{children:u.title}),u.url?e("a",{href:u.url,target:"_blank",rel:"noreferrer",children:"Open provider PR"}):null,e("p",{class:"help",children:[u.state," \xB7 source ",e("code",{children:u.head})," \xB7 target ",e("code",{children:u.target})," \xB7 expires ",new Date(u.expiresAt).toLocaleString()]}),e("pre",{children:u.body}),e("p",{class:"help",children:"Provider content and code are untrusted."}),e("button",{class:"btn small",disabled:I||_,onClick:()=>M(`${u.id}/fetch`),children:"Fetch pinned code and diff"}),u.fetched?e("details",{open:!0,children:[e("summary",{children:["Fetched diff \xB7 base ",u.fetched.base,u.fetched.truncated?" \xB7 truncated":""]}),e("pre",{class:"code-host-diff",children:u.fetched.diff})]}):null,e("details",{children:[e("summary",{children:"Start isolated review run"}),e("label",{children:["Review task",e("textarea",{class:"field","aria-label":"Code host review task",value:oe,onInput:a=>z(a.currentTarget.value)})]}),e("label",{children:["Required verification command",e("input",{class:"field","aria-label":"Code host check",value:X,onInput:a=>V(a.currentTarget.value)})]}),e("label",{children:["Provider",e("select",{class:"field","aria-label":"Code host review provider",value:re,onChange:a=>F(a.currentTarget.value),children:[e("option",{value:"claude",children:"Claude"}),e("option",{value:"codex",children:"Codex"}),e("option",{value:"agy",children:"Antigravity"})]})]}),e("label",{children:["Prepared agent container image",e("input",{class:"field","aria-label":"Code host agent image",placeholder:"codeflow/agents:local",value:le,onInput:a=>xe(a.currentTarget.value)})]}),e("label",{children:["In-container authentication volume (optional)",e("input",{class:"field","aria-label":"Code host auth volume",value:ce,onInput:a=>Ee(a.currentTarget.value)})]}),e("p",{class:"help",children:"Build the image and authenticate inside it first. Host credential folders are never mounted. Agent inference uses the container network; checks use a separate network-disabled container. Safe mode, no copied ignored files or uploads, no native approval waits. Native Safe mode alone is not filesystem isolation."}),e("button",{class:"btn small",disabled:I||_||!X.trim()||!le.trim(),onClick:()=>M(`${u.id}/run`,{run:{pattern:"solo",task:oe,roles:{agent:[re]},options:{},loop:{check:X,agentContainer:{image:le.trim(),...ce.trim()?{authVolume:ce.trim()}:{}},maxMinutes:15,maxSteps:20}}}),children:"Start code host review run"})]}),j?e("p",{children:e("a",{href:`#/run/${encodeURIComponent(j)}`,children:["Open review run ",j]})}):null,e("details",{children:[e("summary",{children:["Review comments and discussions \xB7 ",u.discussions.length,u.discussionTruncated?" \xB7 incomplete, refresh provider UI for remaining discussion":""]}),e("label",{children:["Review comment",e("textarea",{class:"field","aria-label":"Code host review comment",rows:4,maxLength:2e4,value:m,onInput:a=>P(a.currentTarget.value)})]}),e("label",{children:["Inline new-file path (optional)",e("input",{class:"field","aria-label":"Code host inline path",value:c,onInput:a=>k(a.currentTarget.value)})]}),e("label",{children:["New-file line",e("input",{class:"field","aria-label":"Code host inline line",inputMode:"numeric",value:N,onInput:a=>q(a.currentTarget.value)})]}),e("button",{class:"btn small",disabled:I||_||!m.trim(),onClick:()=>M(`${u.id}/review`,{action:"comment",body:m,...c?{path:c,line:Number(N)}:{}}),children:"Publish commit-scoped review comment"}),u.provider==="gitlab"?e(x,{children:[e("button",{class:"btn small",disabled:I||_,onClick:()=>M(`${u.id}/review`,{action:"approve"}),children:"Approve exact GitLab source commit"}),e("button",{class:"btn small",disabled:I||_,onClick:()=>M(`${u.id}/review`,{action:"unapprove"}),children:"Remove my GitLab approval"})]}):e("p",{class:"help",children:"Bitbucket approvals lack a commit precondition. Use commit-scoped comments here or approve in the provider UI."}),u.discussions.map(a=>e("section",{class:"code-host-discussion",children:[e("p",{children:[a.path??"General discussion",a.line?`:${a.line}`:""," \xB7 ",a.resolved?"resolved":"open"]}),a.comments.map(G=>e("blockquote",{children:[e("b",{children:G.author}),e("p",{class:"code-host-comment",children:G.body})]},G.id)),e("button",{class:"btn small",disabled:I||_||!m.trim()||u.discussionTruncated,onClick:()=>M(`${u.id}/review`,{action:"reply",body:m,discussionId:a.id,revision:a.revision}),children:["Publish reply to ",a.id]}),a.canResolve?e("button",{class:"btn small",disabled:I||_||u.discussionTruncated,onClick:()=>M(`${u.id}/review`,{action:a.resolved?"reopen":"resolve",discussionId:a.id,revision:a.revision}),children:[a.resolved?"Reopen":"Resolve"," discussion ",a.id]}):null]},a.id))]}),e("details",{children:[e("summary",{children:"Push or merge a verified owned result"}),e("label",{children:["Completed review run ID",e("input",{class:"field","aria-label":"Code host owned run",value:j,onInput:a=>Z(a.currentTarget.value)})]}),e("label",{children:["Published result branch",e("input",{class:"field","aria-label":"Code host result branch",value:K,onInput:a=>ve(a.currentTarget.value)})]}),e("button",{class:"btn small",disabled:I||_||!j||!K,onClick:()=>M(`${u.id}/push-preview`,{runId:j,branch:K}),children:"Preview exact result push"}),u.push?e("p",{children:["Push commit ",e("code",{children:u.push.commit})," to ",u.sourceBranch,", only if its current head remains ",e("code",{children:u.push.expected}),". ",e("button",{class:"btn small primary",disabled:I||_,onClick:()=>M(`${u.id}/push`,{planId:u.push.id}),children:"Push this pinned result"})]}):null,u.policy.allowed?e("p",{class:"help",children:"Provider policy permits previewing a pinned Git merge. Required checks are revalidated before the explicit action."}):e("ul",{children:u.policy.reasons.map(a=>e("li",{children:a},a))}),e("button",{class:"btn small",disabled:I||_||!j||!K||!u.policy.allowed,onClick:()=>M(`${u.id}/merge-preview`,{runId:j,branch:K}),children:"Validate exact source and target merge"}),u.merge?e("p",{children:["Validated source ",e("code",{children:u.merge.source})," + target ",e("code",{children:u.merge.target})," \u2192 tree ",e("code",{children:u.merge.tree}),". ",e("button",{class:"btn small primary",disabled:I||_,onClick:()=>M(`${u.id}/merge`,{planId:u.merge.id}),children:"Push pinned Git merge to target"})]}):null]})]}):null,e("details",{children:[e("summary",{children:["Explicit action history \xB7 ",o.length]}),e("button",{class:"btn small",disabled:I,onClick:()=>void Ae().catch(a=>R(a.message)),children:"Refresh code host history"}),e("ul",{children:o.map(a=>e("li",{children:[new Date(a.at).toLocaleString()," \xB7 ",a.integration," #",a.key," \xB7 ",a.kind,": ",a.status," \xB7 ",a.detail,a.commit?e(x,{children:[" \xB7 ",e("code",{children:a.commit})]}):null,a.sourceBranch?e(x,{children:[" \xB7 ",e("code",{children:a.sourceBranch})]}):null,a.target?e(x,{children:[" \xB7 observed target ",e("code",{children:a.target})]}):null,a.runId?e("a",{href:`#/run/${encodeURIComponent(a.runId)}`,children:[" \xB7 run ",a.runId]}):null,a.status==="unknown"?e("button",{class:"btn small",disabled:I,onClick:()=>M(`history/${a.id}/acknowledge`,{acknowledge:!0}),children:"I inspected this exact outcome; record manual inspection"}):null]},a.id))})]})]})}function Bt({projectId:t,repos:l}){let[n,o]=i(null),[d,b]=i(""),[y,w]=i(""),[v,r]=i(""),[s,f]=i(null),[p,u]=i(null),[C,S]=i(l[0]??""),[R,T]=i(null),[A,I]=i(null),[h,m]=i(""),[P,c]=i(""),[k,N]=i(!1),q=H(null),oe=H(null),z=H(0),X=H(0),V=`/api/projects/${L(t)}/conventions`,re=new TextEncoder().encode(d).length,F=!!n&&d!==n.text;$(()=>{let g=++z.current;return++X.current,o(null),b(""),w(""),f(null),u(null),T(null),I(null),N(!1),c(""),m("load"),S(l[0]??""),D(V).then(E=>{g===z.current&&(o(E),b(E.text),r(String(E.history[0]?.revision??"")),m(""))},E=>{g===z.current&&(c(E.message),m(""))}),()=>{z.current++,X.current++}},[t]),$(()=>{l.includes(C)||(S(l[0]??""),T(null),I(null))},[JSON.stringify(l)]),$(()=>{if(!F)return;let g=E=>{E.preventDefault(),E.returnValue=""};return window.addEventListener("beforeunload",g),()=>window.removeEventListener("beforeunload",g)},[F]),$(()=>{A&&!h&&oe.current?.focus()},[A,h]);let j=async(g,E)=>{if(h)return;let De=z.current,fe=++X.current;m(g),c("");let de=()=>De===z.current&&fe===X.current;try{await E(de)}catch(ae){de()&&(c(ae.message),ae instanceof Ye&&ae.status===409&&["save","restore"].includes(g)&&N(!0),g==="publish"&&T(null))}finally{de()&&m("")}},Z=g=>{o(g),b(g.text),w(""),f(null),u(null),N(!1),r(String(g.revision)),T(null),I(null)},K=()=>j("save",async g=>{let E=await D(V,{method:"PUT",body:JSON.stringify({revision:n.revision,text:d,note:y})});g()&&(Z(E),J(`Saved private conventions revision ${E.revision}`),requestAnimationFrame(()=>{g()&&q.current?.focus()}))}),ve=()=>j("compare",async g=>{let E=await D(V);g()&&u(E)}),le=()=>j("preview",async g=>{let E=await O(V+"/restore-preview",{version:Number(v)});g()&&f(E)}),xe=()=>j("restore",async g=>{let E=await O(V+"/restore",s);g()&&(Z(E),J(`Restored as new revision ${E.revision}`),requestAnimationFrame(()=>{g()&&q.current?.focus()}))}),ce=()=>j("inspect",async g=>{T(null);let E=await D(V+`/publication?repo=${L(C)}`);g()&&(T(E),I(null))}),Ee=()=>j("publish",async g=>{let E=await O(V+"/publish",{repo:C,revision:n.revision,sourceHash:R.sourceHash,head:R.head});g()&&(I(E),T(null),J("Conventions file staged; commit it to activate guidance",5e3))}),B=()=>{let g=URL.createObjectURL(new Blob([d],{type:"text/markdown;charset=utf-8"})),E=window.document.createElement("a");E.href=g,E.download="conventions-draft.md",E.click(),setTimeout(()=>URL.revokeObjectURL(g),1e3)};return e("section",{class:"wb-card project-conventions","aria-label":"Versioned project conventions",children:[e("h2",{children:"Project conventions"}),e("p",{class:"help",children:"Save shared guidance privately, review prior versions, then deliberately publish a saved revision to a project repository. Agents read only the committed repository file; private drafts and imported run text are never activated automatically."}),!n&&h?e("p",{role:"status",children:"Loading private conventions\u2026"}):null,n?e(x,{children:[e("label",{class:"lbl",for:`conventions-text-${L(t)}`,children:"Private conventions draft"}),e("textarea",{ref:q,id:`conventions-text-${L(t)}`,class:"field",value:d,disabled:!!h,onInput:g=>b(g.currentTarget.value),placeholder:"Describe coding, review, and verification conventions for this project."}),e("p",{class:"help",children:["Saved revision ",n.revision," \xB7 ",re.toLocaleString()," / 65,536 UTF-8 bytes",F?" \xB7 unsaved changes":"",". The latest 32 revisions are retained."]}),e("label",{class:"lbl",for:`conventions-note-${L(t)}`,children:"Revision note"}),e("input",{id:`conventions-note-${L(t)}`,class:"field",value:y,maxLength:500,disabled:!!h,onInput:g=>w(g.currentTarget.value),placeholder:"Why should this guidance change?"}),e("div",{class:"convention-actions",children:[e("button",{class:"btn primary",disabled:!!h||re>65536||!F&&!y.trim(),onClick:K,children:h==="save"?"Saving\u2026":"Save private revision"}),e("button",{class:"btn",disabled:!!h,onClick:B,children:"Export draft"}),F?e("button",{class:"btn",disabled:!!h,onClick:()=>{b(n.text),w("")},children:"Revert to saved draft"}):null]}),k?e("div",{class:"msg warn",children:[e("p",{children:"Your draft is preserved. Review the latest saved guidance before applying it."}),e("button",{class:"btn",disabled:!!h,onClick:ve,children:"Compare latest revision"})]}):null,p?e("div",{children:[e("div",{class:"convention-compare",children:[e("div",{children:[e("h3",{children:["Latest saved revision ",p.revision]}),e("pre",{children:p.text||"Empty guidance"})]}),e("div",{children:[e("h3",{children:"Your draft"}),e("pre",{children:d||"Empty guidance"})]})]}),e("button",{class:"btn",disabled:!!h,onClick:()=>{o(p),u(null),N(!1),T(null),f(null),requestAnimationFrame(()=>q.current?.focus())},children:"Use latest revision as base and keep my draft"})]}):null,e("details",{children:[e("summary",{children:["Revision history (",n.history.length,")"]}),n.history.length?e(x,{children:[e("label",{class:"lbl",for:`conventions-version-${L(t)}`,children:"Saved conventions version"}),e("select",{id:`conventions-version-${L(t)}`,class:"field",value:v,disabled:!!h,onChange:g=>{r(g.currentTarget.value),f(null)},children:n.history.map(g=>e("option",{value:g.revision,children:["Revision ",g.revision," \xB7 ",new Date(g.at).toLocaleString(),g.note?` \xB7 ${g.note}`:""]},g.revision))}),e("div",{class:"convention-actions",children:e("button",{class:"btn",disabled:!!h||!v,onClick:le,children:"Preview saved revision"})}),s?e("div",{children:[e("h3",{children:["Preview revision ",s.version]}),e("pre",{children:s.text||"Empty guidance"}),e("p",{class:"help",children:["Restoring creates a new private revision. It does not publish or remove the current saved version.",F?" Save or revert your unsaved draft first.":""]}),e("button",{class:"btn",disabled:!!h||F||s.revision!==n.revision,onClick:xe,children:"Restore as new revision"})]}):null]}):e("p",{class:"help",children:"Save the first revision to start a history."})]}),e("h3",{class:"convention-publish",children:"Publish reviewed guidance"}),e("p",{class:"help",children:["Publishing writes and stages ",e("code",{children:".codeflow/conventions.md"}),". Commit the staged file yourself to activate guidance for future runs. The repository must belong to this project, be clean, and have no active code-flow work."]}),e("label",{class:"lbl",for:`conventions-repo-${L(t)}`,children:"Publish conventions to repository"}),e("select",{id:`conventions-repo-${L(t)}`,class:"field",value:C,disabled:!!h,onChange:g=>{S(g.currentTarget.value),T(null),I(null)},children:l.length?l.map(g=>e("option",{value:g,children:g},g)):e("option",{value:"",children:"This project has no repositories"})}),e("div",{class:"convention-actions",children:e("button",{class:"btn",disabled:!!h||!C||!n.revision,onClick:ce,children:h==="inspect"?"Inspecting\u2026":"Inspect repository file"})}),R?e("div",{children:[e("p",{class:"help",children:[R.clean?"Repository is clean":"Repository has changes; commit or save them before publishing"," \xB7 ",R.branch??"Detached HEAD"," \xB7 ",R.head.slice(0,12)," \xB7 ",R.tracked?"File is tracked":R.exists?"File exists outside tracking":"File will be created"]}),e("div",{class:"convention-compare",children:[e("div",{children:[e("h4",{children:"Current repository file"}),e("pre",{children:R.text||"No repository guidance"})]}),e("div",{children:[e("h4",{children:["Saved private revision ",n.revision]}),e("pre",{children:n.text||"Empty guidance"})]})]}),e("button",{class:"btn primary",disabled:!!h||F||!R.clean,onClick:Ee,children:h==="publish"?"Publishing\u2026":"Publish and stage file"}),F?e("p",{class:"help",children:"Save or revert your unsaved draft before publishing a saved revision."}):null]}):null,A?e("p",{class:"msg ok",role:"status",ref:oe,tabIndex:-1,children:["Revision ",A.revision," was staged at ",A.path,". Commit the file in the repository to activate it for future runs."]}):null]}):h?null:e("button",{class:"btn",onClick:()=>{j("reload",async g=>{let E=await D(V);g()&&Z(E)})},children:"Retry loading conventions"}),P?e("p",{class:"msg err",role:"alert",children:P}):null]})}function Ut({projectId:t,projectName:l}){let[n,o]=i(null),[d,b]=i("."),[y,w]=i(""),[v,r]=i("."),[s,f]=i(""),[p,u]=i(!1),[C,S]=i(""),[R,T]=i(""),A=H(0),I=H(t);I.current=t;let h=c=>{b(c.read.allow.join(`
2
+ `)),w(c.read.deny.join(`
3
+ `)),r(c.write.allow.join(`
4
+ `)),f(c.write.deny.join(`
5
+ `))},m=async c=>{let k=++A.current;u(!0),S("");try{let N=await D(`/api/projects/${L(t)}/filesystem-policy`);if(k!==A.current)return;o(N),c?h(N):T("Latest saved revision loaded; your draft is kept. Compare the saved rules before applying it.")}catch(N){k===A.current&&S(N.message)}finally{k===A.current&&u(!1)}};$(()=>(o(null),T(""),m(!0),()=>{A.current++}),[t]);let P=c=>c.split(/\r?\n/).map(k=>k.trim()).filter(Boolean);return e("section",{class:"wb-card filesystem-policy","aria-label":"Project filesystem policy",children:[e("h2",{children:["Filesystem policy",l?` \xB7 ${l}`:""]}),e("p",{class:"help",children:["Allow and deny literal repository paths, one per line. A path covers its directory descendants. Use ",e("code",{children:"."})," for the repository root; an empty allow list denies every path. Deny rules take precedence. Git internals, credential paths and symbolic escapes stay blocked in application file operations."]}),e("p",{class:"help",children:"Any custom restriction pauses all app-managed agent, terminal, setup, checks and service execution across projects because the current host, Docker and SSH backends cannot enforce a filtered filesystem boundary. Close terminals/services and wait for all executions and unresolved remote receipts to finish before applying a policy. Existing runs retain their pinned restrictions; start a new run after deliberately changing policy. Extensions are deferred on restricted startup; clearing policy requires a restart to load them."}),e("form",{onSubmit:async c=>{if(c.preventDefault(),!n||p)return;let k=t,N=++A.current;u(!0),S(""),T("");try{let q=await D(`/api/projects/${L(t)}/filesystem-policy`,{method:"PUT",body:JSON.stringify({revision:n.revision,read:{allow:P(d),deny:P(y)},write:{allow:P(v),deny:P(s)}})});if(k!==I.current||N!==A.current)return;o(q),h(q),T(`Filesystem policy revision ${q.revision} applied.`)}catch(q){k===I.current&&N===A.current&&S(q.message)}finally{k===I.current&&N===A.current&&u(!1)}},children:[e("fieldset",{disabled:p||!n,children:[e("legend",{children:"Project file access"}),e("div",{class:"filesystem-policy-grid",children:[e("label",{children:["Read allow paths",e("textarea",{class:"field",rows:4,value:d,onInput:c=>b(c.currentTarget.value)})]}),e("label",{children:["Read deny paths",e("textarea",{class:"field",rows:4,value:y,onInput:c=>w(c.currentTarget.value)})]}),e("label",{children:["Write allow paths",e("textarea",{class:"field",rows:4,value:v,onInput:c=>r(c.currentTarget.value)})]}),e("label",{children:["Write deny paths",e("textarea",{class:"field",rows:4,value:s,onInput:c=>f(c.currentTarget.value)})]})]})]}),e("div",{class:"filesystem-policy-actions",children:[e("button",{class:"btn primary",disabled:p||!n,type:"submit",children:p?"Applying\u2026":"Stop execution and apply policy"}),e("button",{class:"btn",type:"button",disabled:p,onClick:()=>void m(!1),children:"Reload saved policy and keep draft"}),e("button",{class:"btn",type:"button",disabled:p||!n,onClick:()=>{n&&h(n),T("Draft replaced with the saved policy.")},children:"Use saved policy"})]})]}),n?e("details",{children:[e("summary",{children:["Saved revision ",n.revision," \xB7 ",n.hash.slice(0,12)]}),e("pre",{class:"filesystem-policy-saved",children:JSON.stringify({read:n.read,write:n.write},null,2)})]}):null,C?e("p",{class:"msg err",role:"alert",children:[C," Your draft is kept."]}):null,R?e("p",{class:"help",role:"status",children:R}):null]})}function Ht(){let[t,l]=i(),[n,o]=i("");return $(()=>{let d=!0;return D("/api/extensions").then(b=>{d&&l(b)},b=>{d&&o(b.message)}),()=>{d=!1}},[]),e("section",{class:"wb-card extensions-panel","aria-label":"Provider and workflow extensions",children:[e("h2",{children:"Provider and workflow extensions"}),e("p",{children:"Load explicitly configured, SHA-256 pinned local JavaScript bundles with API version negotiation. Loaded providers appear in team selection; workflows appear in New run."}),e("p",{class:"help",children:"Extensions are trusted server code with the server owner's permissions. Configure CODEFLOW_EXTENSIONS_FILE and restart after reviewing each bundle. Repository files cannot enable extensions. See docs/extensions.md for the contract and configuration example."}),t?e(x,{children:[e("dl",{class:"wb-kv",children:[e("dt",{children:"Host extension API"}),e("dd",{children:[t.api.major,".",t.api.minor]})]}),t.extensions.length?e("div",{class:"wb-list",children:t.extensions.map(d=>e("article",{class:"wb-item",children:[e("div",{class:"wb-item-head",children:[e("h3",{children:[d.id," ",d.version]}),e("span",{class:`badge ${d.error||d.state!=="loaded"?"err":"ok"}`,children:d.state.charAt(0).toUpperCase()+d.state.slice(1)})]}),e("dl",{class:"wb-kv",children:[e("dt",{children:"SHA-256"}),e("dd",{children:e("code",{children:d.sha256})}),d.api?e(x,{children:[e("dt",{children:"Negotiated API"}),e("dd",{children:[d.api.major,".",d.api.minor]})]}):null,e("dt",{children:"Providers"}),e("dd",{children:d.providers.join(", ")||"None"}),e("dt",{children:"Workflows"}),e("dd",{children:d.workflows.join(", ")||"None"})]}),d.error?e("p",{class:"msg err",role:"alert",children:d.error}):null]},d.id))}):e("p",{class:"help",children:"No extensions configured."})]}):null,n?e("p",{role:"alert",class:"msg err",children:n}):null]})}function He({projectId:t,repositories:l}){let[n,o]=i(""),d=l.includes(n)?n:l.includes(Q.value)?Q.value:l[0]??"",[b,y]=i("project"),w=t&&b==="project"?`composerLibrary:${t}`:"composerLibrary";return e("section",{class:"project-run-settings","aria-label":"Project run defaults",children:[e("h2",{children:"Run defaults"}),e("p",{class:"help",children:"Configure each repository once. New runs inherit these defaults; run options can override them. These preferences are saved in this browser for the current workspace."}),l.length>1?e("label",{class:"lbl",children:["Repository",e("select",{class:"field","aria-label":"Project settings repository",value:d,onChange:v=>o(v.currentTarget.value),children:l.map(v=>e("option",{value:v,children:v},v))})]}):null,d?e(Yt,{repository:d},d):e("p",{class:"help",children:"Add a repository to configure its defaults."}),je.value?e(x,{children:[e("h2",{children:"Template library"}),e("p",{class:"help",children:"Use the Template library in New run for built-in tasks, saved workflows and complete run templates. Manage imports and older workflow revisions below."}),t?e("label",{class:"lbl",children:["Library",e("select",{class:"field","aria-label":"Library scope",value:b,onChange:v=>y(v.currentTarget.value),children:[e("option",{value:"project",children:"This project"}),e("option",{value:"personal",children:"Personal library (all projects)"})]})]}):null,e(wt,{libraryKey:w,p:je.value},w)]}):null,t&&d?e(Dt,{projectId:t,repo:d},`${t}:${d}`):null]})}function Yt({repository:t}){let[l,n]=i(()=>Ct(t)),[o,d]=i({check:"",setup:""}),[b,y]=i(!0),[w,v]=i(""),[r,s]=i(!1),[f,p]=i(0);$(()=>{let S=!0;return y(!0),v(""),Promise.all([D(`/api/repo-config?repo=${L(t)}`),D(`/api/check?repo=${L(t)}`)]).then(([R,T])=>{S&&d({check:ee.get(`check:${t}`)??R.config.check??T.command??"",setup:ee.get(`setup:${t}`)??R.config.setup??T.setup??""})}).catch(R=>{S&&(d({check:ee.get(`check:${t}`)??"",setup:ee.get(`setup:${t}`)??""}),v(`Could not load repository defaults: ${R.message}`))}).finally(()=>{S&&y(!1)}),()=>{S=!1}},[t,f]);let u=S=>{n(S),s(!1)},C=()=>{ee.set(`check:${t}`,o.check),ee.set(`setup:${t}`,o.setup),Q.value===t&&(it.value=o.check,ot.value=o.setup),St(t,l),s(!0)};return e("div",{class:"project-default-fields",children:[e("p",{class:"help mono",children:t}),e("label",{class:"lbl",children:["Default check command",e("input",{class:"field mono","aria-label":"Default check command",disabled:b,value:o.check,placeholder:"e.g. npm test",onInput:S=>{d({...o,check:S.currentTarget.value}),s(!1)}})]}),e("label",{class:"lbl",children:["Worktree setup command",e("input",{class:"field mono","aria-label":"Worktree setup command",disabled:b,value:o.setup,placeholder:"e.g. npm ci",onInput:S=>{d({...o,setup:S.currentTarget.value}),s(!1)}})]}),e("label",{class:"lbl",children:["Default verification profile",e("select",{class:"field","aria-label":"Default verification profile",value:l.verification,onChange:S=>u({...l,verification:S.currentTarget.value}),children:[e("option",{value:"",children:"Single configured check"}),e("option",{value:"lightweight",children:"Lightweight"}),e("option",{value:"standard",children:"Standard"}),e("option",{value:"thorough",children:"Thorough"})]})]}),e("label",{class:"checkpoint",children:[e("input",{type:"checkbox",checked:l.container.enabled,onChange:S=>u({...l,container:{...l.container,enabled:S.currentTarget.checked}})}),e("span",{children:"Use Docker isolation by default"})]}),l.container.enabled?e(x,{children:[e("label",{class:"lbl",children:["Default container image",e("input",{class:"field mono","aria-label":"Default container image",value:l.container.image,onInput:S=>u({...l,container:{...l.container,image:S.currentTarget.value}})})]}),e("label",{class:"lbl",children:["Default authentication volume",e("input",{class:"field mono","aria-label":"Default authentication volume",value:l.container.authVolume,onInput:S=>u({...l,container:{...l.container,authVolume:S.currentTarget.value}})})]}),e("p",{class:"help",children:"Use a prebuilt image with compatible, authenticated provider CLIs. Host credentials are not mounted."})]}):null,e("div",{class:"settings-actions",children:[e("button",{class:"btn primary",disabled:b||!!w||l.container.enabled&&!l.container.image.trim(),onClick:C,children:"Save project defaults"}),r?e("span",{role:"status",children:"Project defaults saved."}):null]}),w?e("div",{class:"msg err",role:"alert",children:[w,e("button",{class:"btn",onClick:()=>p(f+1),children:"Retry loading defaults"})]}):null,e(yt,{repository:t,setup:o.setup,check:o.check,base:"",loading:b})]})}function Ft(){let[t,l]=i(null),[n,o]=i(""),[d,b]=i(!1),y=H(0),w=async()=>{let r=++y.current;b(!0),o("");try{let s=await D("/api/doctor/dependencies");r===y.current&&l(s)}catch(s){r===y.current&&o(s.message)}finally{r===y.current&&b(!1)}},v=t?.providers.filter(r=>r.installed&&r.compatible===!0&&r.signedIn===!0)??[];return e("section",{"aria-label":"Guided dependency discovery",class:"dependency-discovery",children:[e("h3",{children:"Check this computer"}),e("p",{class:"help",children:"Git and one compatible, signed-in provider are needed to run a team. Python terminals, browser snapshots and Docker isolation are optional. These checks read installed tools; they do not install software, sign in, pull images or change settings."}),e("button",{class:"btn",disabled:d,onClick:w,children:d?"Checking dependencies\u2026":t?"Check dependencies again":"Check all dependencies"}),n?e("p",{class:"msg err",role:"alert",children:n}):null,t?e("div",{class:"dependency-results",children:[e("p",{role:"status",children:[t.node.ok&&t.git.ok&&v.length?"Core tools are ready.":"Core tools need attention."," Checked ",new Date(t.checkedAt).toLocaleTimeString(),"."]}),e("h4",{children:"Required tools"}),e("ul",{class:"readiness-results",children:[e("li",{children:[e("span",{class:`badge ${t.node.ok?"ok":"err"}`,children:t.node.ok?"Ready":"Too old"}),e("span",{children:[e("b",{children:["Node.js ",t.node.version]}),t.node.ok?null:e("span",{class:"help",children:"Run code-flow with Node.js 22.13 or newer."})]})]}),e("li",{children:[e("span",{class:`badge ${t.git.ok?"ok":"err"}`,children:t.git.ok?"Ready":t.git.installed?"Too old":"Missing"}),e("span",{children:[e("b",{children:["Git ",t.git.version??""]}),t.git.warning?e("span",{class:"help",children:t.git.warning}):null]})]}),t.providers.map(r=>e("li",{children:[e("span",{class:`badge ${r.installed&&r.signedIn===!0&&r.compatible===!0?"ok":r.installed&&(r.compatible===!1||r.signedIn===!1)?"warn":""}`,children:r.installed?r.compatible===!1?"Incompatible":r.signedIn===!1?"Signed out":r.signedIn===null||r.compatible===void 0?"Unknown":"Ready":"Missing"}),e("span",{children:[e("b",{children:[r.name,r.version?` \xB7 ${r.version}`:""]}),r.fix?e("span",{class:"help",children:r.fix}):null,r.warnings?.map(s=>e("span",{class:"help",children:s},s))]})]},r.id))]}),e("h4",{children:"Optional tools"}),e("ul",{class:"readiness-results",children:t.optional.map(r=>e("li",{children:[e("span",{class:`badge ${r.ready?"ok":""}`,children:r.ready?"Ready":r.installed?"Unavailable":"Not installed"}),e("span",{children:[e("b",{children:[r.name,r.version?` \xB7 ${r.version}`:""]}),e("span",{class:"help",children:r.detail}),r.fix?e("span",{class:"help",children:r.fix}):null]})]},r.id))})]}):null]})}function _t(){let t=gt.value,l=(n,o,d)=>{let b=t.providers;he({...t,providers:{...b,[n]:{...b[n],[o]:{...b[n]?.[o],...d}}}})};return e("section",{class:"settings-card","aria-label":"Prompt improvement",children:[e("h3",{children:"Prompt improvement"}),e("p",{class:"help",children:"Improve rewrites your task before you run it. It preserves your intent, clarifies the goal and completion criteria, and flags unclear details. Undo restores your original text."}),e("div",{class:"settings-row",children:[e("div",{children:[e("strong",{children:"Agent"}),e("p",{children:"Independent of your main task\u2019s agents. Uses your local CLI account and subscription."})]}),e("div",{class:"settings-row-control",children:e("select",{class:"field","aria-label":"Prompt improvement agent",value:t.agent,onChange:n=>he({...t,agent:n.currentTarget.value}),children:["auto",...Be].map(n=>e("option",{value:n,children:ie[n]}))})})]}),e("p",{class:"help",children:t.agent==="auto"?"Auto prefers Claude Code, then Codex, then Antigravity, using installation and quota availability. Configure each provider\u2019s models below.":`${ie[t.agent]} will perform every rewrite. If it is unavailable, Improve shows an error without switching agents.`}),e("div",{class:"settings-row",children:[e("div",{children:[e("strong",{children:"Default mode"}),e("p",{children:"Quick uses your text only. Repo also reads a private snapshot of committed files; uncommitted changes are excluded."})]}),e("div",{class:"settings-row-control",children:e("select",{class:"field","aria-label":"Default improvement mode",value:t.defaultMode,onChange:n=>he({...t,defaultMode:n.currentTarget.value}),children:[e("option",{value:"quick",children:"Quick"}),e("option",{value:"repo",children:"Repo"})]})})]}),(t.agent==="auto"?Be:[t.agent]).map(n=>{let o=nt.value[n],d=o&&!("error"in o)?o:void 0,b=ye.value.find(y=>y.id===n)?.available;return e("fieldset",{class:"improve-provider",children:[e("legend",{children:[ie[n],b===!1?" \xB7 Not installed":""]}),["quick","repo"].map(y=>{let w=t.providers[n]?.[y]??{},v=vt(n,y),r=w.model??v.model??"",s=ft(n,r,d),f=`${y==="quick"?"Quick":"Repo"} model \xB7 ${ie[n]}`;return e("div",{class:"improve-model-row",children:[e("label",{children:[y==="quick"?"Quick model":"Repo model",d?.allowCustom===!1?e("select",{class:"field","aria-label":f,value:r,onChange:p=>l(n,y,{model:p.currentTarget.value,effort:void 0}),children:[e("option",{value:"",children:"CLI default"}),d.models.map(p=>e("option",{value:p.id,children:p.label}))]}):e(x,{children:[e("input",{class:"field","aria-label":f,list:`improve-${n}-${y}-models`,placeholder:"CLI default",value:r,maxLength:200,onInput:p=>l(n,y,{model:p.currentTarget.value,effort:void 0})}),e("datalist",{id:`improve-${n}-${y}-models`,children:d?.models.map(p=>e("option",{value:p.id,children:p.label}))})]})]}),e("label",{children:["Reasoning effort",e("select",{class:"field","aria-label":`${y==="quick"?"Quick":"Repo"} effort \xB7 ${ie[n]}`,disabled:!s.length,value:w.effort??"__recommended__",onChange:p=>l(n,y,{effort:p.currentTarget.value==="__recommended__"?void 0:p.currentTarget.value}),children:[e("option",{value:"__recommended__",children:s.length?`Improve default${v.effort&&s.includes(v.effort)?` \xB7 ${v.effort}`:""}`:"No effort choices"}),e("option",{value:"",children:"CLI default"}),w.effort&&!s.includes(w.effort)?e("option",{value:w.effort,children:[w.effort,d?" \xB7 unavailable for this model":" \xB7 loading choices"]}):null,s.map(p=>e("option",{value:p,children:p}))]})]})]},y)}),e("p",{class:"help",children:d?d.allowCustom?"Choose a suggested model or enter its model ID. Leave the model empty to use the CLI default.":"Choose a supported model or use the CLI default.":"Model choices are unavailable. You can enter a model ID; refresh providers to load supported effort choices."})]},n)}),e("div",{class:"settings-actions",children:[e("button",{class:"btn small",onClick:()=>he({agent:"auto",defaultMode:"quick",providers:{}}),children:"Reset Improve defaults"}),e("span",{class:"help",children:"Saved automatically in this browser for this workspace."})]}),e("p",{class:"help",children:"The note below your task shows which agent actually completed the rewrite. Improve does not implement the task."})]})}var Fe=[{key:"opencode",name:"OpenCode",command:"opencode",args:["acp"],install:"npm install -g opencode-ai",login:"opencode auth login",docs:"https://opencode.ai/docs/acp/"},{key:"kilo",name:"Kilo",command:"kilo",args:["acp"],install:"npm install -g @kilocode/cli",login:"kilo auth login",docs:"https://kilo.ai/docs/code-with-ai/platforms/cli-reference"},{key:"cline",name:"Cline",command:"cline",args:["--acp"],install:"npm install -g cline",login:"cline auth",docs:"https://docs.cline.bot/usage/acp",help:"Cline asks before edits and commands by default. Enable Ask me for tool permissions in the run\u2019s permissions controls to approve these requests."}];function Wt(t){return{id:`acp:${t.key}`,name:t.name,command:t.command,args:[...t.args],enabled:!0}}function Vt(){let[t,l]=i(),[n,o]=i(),[d,b]=i(""),[y,w]=i(!1),[v,r]=i(!1),[s,f]=i(""),[p,u]=i(),C=async()=>{try{l(await D("/api/acp-connections")),f("")}catch(c){f(c.message)}};$(()=>{C()},[]);let S=(c,k)=>{o(structuredClone(c)),b(c.args.join(`
6
+ `)),w(k),u(void 0),f("")},R=c=>{o(k=>k&&{...k,...c}),u(void 0)},T=()=>({...n,args:d?d.split(`
7
+ `):[]}),A=async c=>{r(!0),f("");try{await c()}catch(k){f(k.message)}finally{r(!1)}},I=async c=>{l(c),await we(),await Promise.all([Se(),Ce()])},h=async c=>{await I(await O("/api/acp-connections",{revision:t.revision,connection:c}))},m=async c=>{u(void 0),u({name:c.name,probe:await O("/api/acp-connections/check",{connection:c})})},P=Fe.find(c=>n?.id===`acp:${c.key}`);return e("section",{class:"settings-card","aria-label":"ACP connections",children:[e("h3",{children:"Connect another coding agent"}),e("p",{class:"help",children:"Connect OpenCode, Kilo, Cline or another CLI that supports Agent Client Protocol (ACP). Install and sign in through the CLI on this machine first."}),e("p",{class:"help",children:["ACP agents run with your host permissions and require ",e("a",{href:"#/settings/runs",children:"Full access"}),". SSH workers and containers are unavailable. Permission requests are declined unless the run enables interactive tool approvals; the CLI may also allow actions through its own settings."]}),e("div",{class:"settings-actions",children:[Fe.map(c=>e("button",{class:"btn",disabled:v||!t,onClick:()=>{let k=t?.connections.find(N=>N.id===`acp:${c.key}`);S(k??Wt(c),!!k)},children:["Connect ",c.name]},c.key)),e("button",{class:"btn",disabled:v||!t,onClick:()=>S({id:"acp:",name:"",command:"",args:[],enabled:!0},!1),children:"Add compatible CLI"}),e("button",{class:"btn",disabled:v,onClick:()=>void C(),children:"Reload connections"})]}),t?.connections.map(c=>e("article",{class:"wb-item",children:[e("div",{class:"wb-item-head",children:[e("strong",{children:c.name}),e("span",{class:"badge",children:c.enabled?"Enabled":"Disabled"})]}),e("p",{class:"help",children:e("code",{children:[c.command,...c.args].join(" ")})}),e("div",{class:"settings-actions",children:[e("button",{class:"btn small",disabled:v,onClick:()=>S(c,!0),"aria-label":`Edit ${c.name}`,children:"Edit"}),e("button",{class:"btn small",disabled:v,onClick:()=>void A(()=>m(c)),children:["Check ",c.name]}),e("button",{class:"btn small",disabled:v,onClick:()=>void A(()=>h({...c,enabled:!c.enabled})),children:[c.enabled?"Disable":"Enable"," ",c.name]}),e("button",{class:"btn small",disabled:v,onClick:()=>void A(async()=>{await I(await D(`/api/acp-connections/${L(c.id)}?revision=${t.revision}`,{method:"DELETE"})),n?.id===c.id&&o(void 0)}),children:["Remove ",c.name]})]})]},c.id)),n?e("form",{class:"acp-connection-form",onSubmit:c=>{c.preventDefault(),A(async()=>{let k=T();if(!y&&t?.connections.some(N=>N.id===k.id))throw new Error("That connection ID already exists. Edit the saved connection or choose another ID.");await h(k),o(void 0)})},children:[e("h4",{children:y?"Edit connection":"New connection"}),P?e("div",{class:"help",children:[e("p",{children:["Install: ",e("code",{children:P.install}),". Sign in: ",e("code",{children:P.login}),". ",e("a",{href:P.docs,target:"_blank",rel:"noopener noreferrer",children:[P.name," CLI documentation"]})]}),"help"in P?e("p",{children:P.help}):null]}):null,e("div",{class:"settings-grid",children:[e("label",{children:["Connection ID",e("input",{class:"field",disabled:v,"aria-label":"ACP connection ID",required:!0,pattern:"[a-z][a-z0-9-]{0,40}",maxLength:41,readOnly:y,value:n.id.slice(4),onInput:c=>R({id:`acp:${c.currentTarget.value}`})})]}),e("label",{children:["Name",e("input",{class:"field",disabled:v,"aria-label":"ACP connection name",required:!0,maxLength:100,value:n.name,onInput:c=>R({name:c.currentTarget.value})})]})]}),e("label",{class:"lbl",children:["Executable",e("input",{class:"field",disabled:v,"aria-label":"ACP executable",required:!0,maxLength:4e3,placeholder:"opencode or /absolute/path/to/agent",value:n.command,onInput:c=>R({command:c.currentTarget.value})})]}),e("label",{class:"lbl",children:["Arguments \xB7 one per line",e("textarea",{class:"field",disabled:v,"aria-label":"ACP arguments",rows:3,value:d,placeholder:"acp",onInput:c=>{b(c.currentTarget.value),u(void 0)}})]}),e("p",{class:"help",children:"Enter the executable separately from its arguments. Paths with spaces do not need quotes. Use the CLI\u2019s own login; do not put credentials in these fields."}),e("div",{class:"settings-actions",children:[e("button",{type:"button",class:"btn",disabled:v,onClick:()=>void A(()=>m(T())),children:v?"Working\u2026":"Check connection"}),e("button",{type:"submit",class:"btn primary",disabled:v||!t,children:"Save connection"}),e("button",{type:"button",class:"btn",disabled:v,onClick:()=>{o(void 0),u(void 0)},children:"Cancel"})]})]}):null,p?e("div",{class:"msg",role:"status",children:[e("strong",{children:[p.name,": connected"]}),e("p",{children:[p.probe.agent,p.probe.version?` ${p.probe.version}`:""," \xB7 ACP v1 \xB7 ",p.probe.catalog.models.length," models \xB7 Session resume ",p.probe.sessionResume?"available":"unavailable"]}),e("p",{class:"help",children:"Created a session without sending a prompt. Model access and inference have not been tested."})]}):null,s?e("p",{class:"msg err",role:"alert",children:s}):null]})}var _e={archivedRuns:"Archived run logs and recovery records",attachments:"Staged uploads and message attachments",memory:"Private and team memory from retired runs",worktrees:"Clean linked workspaces, keeping branches"},be=Object.keys(_e),Kt=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KiB`:`${(t/(1024*1024)).toFixed(1)} MiB`,zt=t=>`'${t.replace(/'/g,"'''")}'`;function Gt({endpoint:t="/api/maintenance/retention"}){let[l,n]=i(null),[o,d]=i({archivedRuns:"",attachments:"",memory:"",worktrees:""}),[b,y]=i(""),[w,v]=i(""),[r,s]=i(null),[f,p]=i(!1),[u,C]=i(""),[S,R]=i(""),T=async()=>{let m=await D(t);n(m),d(Object.fromEntries(be.map(P=>[P,m.days[P]===null?"":String(m.days[P])]))),y(m.keepRunIds.join(`
8
+ `)),v(m.keepMemoryIds.join(`
9
+ `)),C(""),s(null)};$(()=>{T().catch(m=>C(m.message))},[t]);let A=async()=>{if(!(!l||f)){p(!0),C(""),R("");try{let m=Object.fromEntries(be.map(k=>[k,o[k].trim()?Number(o[k]):null]));if(be.some(k=>m[k]!==null&&(!Number.isInteger(m[k])||m[k]<1||m[k]>36500)))throw new Error("Enter 1\u201336,500 days, or leave blank to keep that data.");let P=k=>[...new Set(k.split(/[\s,]+/).filter(Boolean))],c=await O(t,{expectedRevision:l.revision,days:m,keepRunIds:P(b),keepMemoryIds:P(w)});n(c),s(null),R("Retention settings saved. No data was deleted.")}catch(m){C(m.message)}finally{p(!1)}}},I=async()=>{if(!f){p(!0),C("");try{s(await O(t+"/preview",{}))}catch(m){C(m.message)}finally{p(!1)}}},h=()=>{if(!r)return;let m=new Blob([JSON.stringify(r,null,2)],{type:"application/json"}),P=URL.createObjectURL(m),c=document.createElement("a");c.href=P,c.download=`codeflow-retention-${new Date(r.createdAt).toISOString().replace(/[:.]/g,"-")}.json`,c.click(),setTimeout(()=>URL.revokeObjectURL(P),1e3)};return e("section",{class:"wb-card retention-panel","aria-label":"Data retention",children:[e("h2",{children:"Data retention"}),e("p",{class:"help",children:"Choose separate retention ages for application data. Blank fields keep that data. Saving settings never deletes anything; review a fixed preview and apply it with the server stopped."}),e("p",{class:"help",children:"Active, resumable, unarchived and pinned work is protected. Project knowledge requires individual review and is never bulk-deleted. Live memory provenance and child/deferred run references preserve their sources."}),l?e(x,{children:[e("div",{class:"wb-fields",children:be.map(m=>e("label",{children:[_e[m]," \xB7 days",e("input",{class:"field","aria-label":`Retention days ${m}`,type:"number",min:1,max:36500,placeholder:"Keep indefinitely",value:o[m],onInput:P=>{d(c=>({...c,[m]:P.currentTarget.value})),R("")}})]},m))}),e("div",{class:"wb-fields",children:[e("label",{children:["Keep these run IDs \xB7 one per line",e("textarea",{class:"field",rows:2,"aria-label":"Retention protected run IDs",value:b,onInput:m=>y(m.currentTarget.value)})]}),e("label",{children:["Keep these memory IDs \xB7 one per line",e("textarea",{class:"field",rows:2,"aria-label":"Retention protected memory IDs",value:w,onInput:m=>v(m.currentTarget.value)})]})]}),e("div",{class:"wb-actions",children:[e("button",{class:"btn small primary",disabled:f,onClick:A,children:"Save retention settings"}),e("button",{class:"btn small",disabled:f,onClick:I,children:f?"Inspecting\u2026":"Preview saved retention policy"}),e("button",{class:"btn small",disabled:f,onClick:()=>void T().catch(m=>C(m.message)),children:"Reload saved settings"})]}),S?e("p",{class:"help",role:"status",children:S}):null]}):e("p",{class:"help",children:"Loading retention settings\u2026"}),u?e("p",{class:"msg err",role:"alert",children:[u," Your draft settings are preserved."]}):null,r?e("section",{class:"wb-subsection","aria-label":"Retention preview",children:[e("p",{class:"help",children:["Policy revision ",r.policyRevision," \xB7 preview ",new Date(r.createdAt).toLocaleString()," \xB7 expires ",new Date(r.expiresAt).toLocaleString(),". Known file bytes selected: ",Kt(r.summary.bytes),". Memory bodies are counted separately."]}),e("ul",{children:be.map(m=>e("li",{children:[_e[m],": ",r.summary[m]," selected",r.cutoffs[m]===null?" \xB7 disabled":` \xB7 last updated before ${new Date(r.cutoffs[m]).toLocaleString()}`]},m))}),r.truncated?e("p",{class:"msg err",role:"alert",children:"This scan is incomplete or reached a limit and cannot be applied. Review the protected reasons and narrow the policy or repair the unreadable data."}):null,e("details",{children:[e("summary",{children:["Exact selected targets \xB7 ",r.targets.length]}),e("ul",{children:r.targets.map(m=>e("li",{children:[e("b",{children:m.kind})," \xB7 ",m.path??m.memory?.id??m.runId," \xB7 ",m.detail,m.files?e("ul",{children:m.files.map(P=>e("li",{children:[P.path," \xB7 ",Kt(P.bytes)," \xB7 ",e("code",{children:P.fingerprint})]},P.path))}):e("p",{class:"help",children:["Fingerprint: ",e("code",{children:m.fingerprint})]})]},m.id))})]}),e("details",{children:[e("summary",{children:["Protected data and scan limits \xB7 ",r.protected.length]}),e("ul",{children:r.protected.map((m,P)=>e("li",{children:[m.kind," \xB7 ",m.id,": ",m.reason]},P))})]}),e("p",{class:"help",children:["Manifest fingerprint: ",e("code",{children:r.fingerprint}),". Download after reviewing it, stop the server, then apply the downloaded file. Any policy, ownership or data change invalidates the preview. Workspaces are removed without force and Git branches are kept."]}),e("button",{class:"btn small",disabled:r.truncated,onClick:h,children:"Download reviewed retention plan"}),e("pre",{children:`npm run maintenance -- retention-policy --plan /path/to/downloaded-plan.json --apply --home ${zt(r.home)}`}),e("p",{class:"help",children:"The apply command takes the same exclusive lock as the server. An I/O failure after deletion starts is reported with the applied and remaining targets."})]}):null]})}function Bs({section:t="general",group:l}){let[n,o]=i(""),d=H(null);Ge(()=>{o(""),document.getElementById("main-content")?.scrollTo({top:0})},[t,l]),$(()=>{let s=d.current,f=s?.querySelector("[aria-current='page']");!n&&s&&f&&s.scrollWidth>s.clientWidth&&(s.scrollLeft+=f.getBoundingClientRect().left-s.getBoundingClientRect().left-8)},[t,n]);let b=$e.find(s=>s.id===t),y=Qe(n),w=Re.value,v=Rt().length,r=s=>{o(""),Le.value=s==="workspace"||s==="automations"||s==="insights"?{view:s}:{view:"settings",section:s}};return e("div",{class:`settings-page ${t==="workspace"||t==="insights"?"settings-tools":""}`,children:[e("header",{class:"settings-header",children:[e("div",{children:[e("div",{class:"eyebrow",children:"Your workspace, your way"}),e("h1",{children:"Settings"})]}),e("span",{class:"settings-scope",children:[e(te,{name:w.kind==="local"?"panel":"terminal"}),w.kind==="ssh"?w.name:w.kind==="host"?"Remote server":"This computer"]})]}),e("div",{class:"settings-layout",children:[e("aside",{class:"settings-sidebar",children:[e("div",{class:"settings-search",children:[e(te,{name:"search"}),e("input",{class:"field",type:"search","aria-label":"Search settings",placeholder:"Search settings\u2026",value:n,onInput:s=>o(s.currentTarget.value)})]}),e("nav",{ref:d,"aria-label":"Settings categories",children:["Preferences","Connections","Management"].map(s=>e("div",{class:"settings-nav-group",children:[e("div",{class:"settings-nav-label",children:s}),$e.filter(f=>f.group===s&&!["workspace","automations","insights"].includes(f.id)).map(f=>e("a",{class:`settings-nav-item ${t===f.id&&!n.trim()?"active":""}`,href:`#/settings/${f.id}`,title:f.id==="automations"&&v?`${v} runs need attention`:void 0,"aria-current":t===f.id&&!n.trim()?"page":void 0,onClick:()=>o(""),children:[e(te,{name:f.icon}),f.label,f.id==="automations"&&v?e("span",{class:"count","aria-hidden":"true",children:v}):null]},f.id))]},s))}),e("p",{class:"settings-nav-note",children:["A little more you.",e("br",{}),"A little less setup."]})]}),e("div",{class:"settings-content",children:n.trim()?e("section",{"aria-label":"Settings search results",children:[e("h2",{children:"Search settings"}),e("p",{class:"help",role:"status",children:[y.length," ",y.length===1?"category":"categories"," for \u201C",n.trim(),"\u201D"]}),y.length?y.map(s=>e("button",{class:"settings-result",onClick:()=>r(s.id),children:[e(te,{name:s.icon}),e("span",{children:[e("strong",{children:s.label}),e("span",{children:s.description})]}),e("span",{"aria-hidden":"true",children:"\u2192"})]},s.id)):e("div",{class:"settings-empty",children:[e(te,{name:"search"}),e("h3",{children:"No matching settings"}),e("p",{children:"Try \u201CSSH\u201D, \u201Cmodels\u201D, \u201Ctheme\u201D or \u201Cpermissions\u201D."}),e("button",{class:"btn",onClick:()=>o(""),children:"Clear search"})]})]}):e(x,{children:[e("div",{class:"settings-section-heading",children:[e("h2",{children:b.label}),e("p",{children:b.description})]}),e("div",{class:"settings-section-content",children:[t==="general"?e(Xt,{}):null,t==="agents"?e(Zt,{}):null,t==="runs"?e(en,{}):null,t==="connections"?e(Lt,{purpose:l}):null,t==="notifications"?e(x,{children:[e(Y,{title:"Desktop notifications",children:[e(se,{title:"Run updates",description:"Notify when a run finishes or needs your attention, while you\u2019re away from it.",children:e("button",{class:"settings-switch",role:"switch","aria-label":"Desktop notifications","aria-checked":Ne(),onClick:()=>void Xe(!Ne()),children:e("span",{})})}),e("p",{class:"help",children:"Notification"in window?ze.value==="denied"?"Notifications are blocked. Allow them in your browser\u2019s site permissions to enable this setting.":"This preference is saved in this browser for the current workspace.":"This browser doesn\u2019t support desktop notifications."})]}),e(Ot,{})]}):null,t==="integrations"?e(x,{children:[e(qt,{onImport:s=>{ht.value=s,mt.value=null,ut(`Address ${s.provider} ${s.kind} ${s.key}: ${s.title}`),Le.value={view:"composer"}}}),e(Mt,{projects:W.value})]}):null,t==="workspace"?e(Et,{}):null,t==="insights"?e(Tt,{group:l}):null,t==="automations"?e(It,{}):null,t==="projects"?e(tn,{}):null,t==="extensions"?e(Ht,{}):null,t==="data"?e(Gt,{}):null,t==="advanced"?e(nn,{}):null]},t)]})})]})]})}function Y({title:t,children:l}){return e("section",{class:"settings-card",children:[e("h3",{children:t}),l]})}function se({title:t,description:l,children:n}){return e("div",{class:"settings-row",children:[e("div",{children:[e("strong",{children:t}),e("p",{children:l})]}),e("div",{class:"settings-row-control",children:n})]})}function Xt(){return e(x,{children:[e(Y,{title:"Appearance",children:[e("p",{class:"help",children:"Choose a look. Your preference is saved in this browser and applies to every workspace."}),e("div",{class:"theme-options",role:"group","aria-label":"Appearance",children:["light","dark","system"].map(t=>e("button",{class:`theme-option ${ge.value===t?"selected":""}`,"aria-pressed":ge.value===t,onClick:()=>Je(t),children:[e("span",{class:`theme-preview ${t}`,"aria-hidden":"true",children:[e("span",{}),e("span",{children:[e("i",{}),e("i",{}),e("i",{})]})]}),e("span",{children:[t==="system"?"System":t==="light"?"Light":"Dark",ge.value===t?e("span",{"aria-hidden":"true",children:"\u2713"}):null]})]},t))})]}),e(Y,{title:"Workspace preferences",children:[e(se,{title:"Group runs by",description:"Choose how runs are organized in the sidebar.",children:e("select",{class:"field","aria-label":"Group runs by",value:Pe.value.group,onChange:t=>Me({group:t.currentTarget.value}),children:[e("option",{value:"project",children:"Project"}),e("option",{value:"status",children:"Status"})]})}),e(se,{title:"Show archived runs",description:"Include archived work in your run list.",children:e("button",{class:"settings-switch",role:"switch","aria-label":"Show archived runs","aria-checked":Pe.value.archived,onClick:()=>Me({archived:!Pe.value.archived}),children:e("span",{})})}),e(se,{title:"Keyboard shortcuts",description:"Move around your workspace without leaving the keyboard.",children:e("button",{class:"btn small",onClick:()=>{st.value=!0},children:"View shortcuts"})})]}),e("div",{class:"settings-callout",children:[e(te,{name:"terminal"}),e("div",{children:[e("strong",{children:"Take your workspace further"}),e("p",{children:"Connect a VM and keep your projects and tools on your remote machine."}),e("a",{href:"#/settings/connections/workspace",children:["Set up an SSH connection ",e("span",{"aria-hidden":"true",children:"\u2192"})]})]})]})]})}function Zt(){let[t,l]=i(!1);return e(x,{children:[e(_t,{}),e(Vt,{}),e("details",{class:"settings",children:[e("summary",{children:"Check this computer"}),e("div",{class:"settings-body",children:e(Ft,{})})]}),e("p",{class:"help",children:"Saved model choices apply to new runs in this workspace. Project defaults and individual role overrides can take precedence. Sign in through each agent\u2019s CLI on the machine where it runs."}),e("div",{class:"settings-actions",children:[e("button",{class:"btn",disabled:t,onClick:async()=>{l(!0);try{await we(),await Promise.all([Se(),Ce()])}finally{l(!1)}},children:t?"Checking\u2026":"Refresh providers"}),e("button",{class:"btn",onClick:()=>{ct.value=!0},children:"Health & usage"})]}),ye.value.map(n=>{let o=lt.value?.find(d=>d.id===n.id);return e(Y,{title:n.displayName,children:[e("div",{class:"settings-provider-status",children:[e("span",{class:`badge ${o?.installed&&o.signedIn!==!1?"ok":""}`,children:o?o.installed?o.signedIn===!1?"Signed out":o.signedIn?"Signed in":"Installed \xB7 login unknown":"Not installed":"Checking health\u2026"}),e("span",{class:"help",children:o?.version})]}),n.available?e(Pt,{agent:n,used:!0}):e("p",{class:"help",children:"Install this CLI on the current machine to configure its models."}),o?.fix?e("p",{class:"msg warn",children:o.fix}):null]},n.id)})]})}function Te({label:t,value:l,min:n=1,max:o,step:d=1,optional:b=!1,save:y}){let[w,v]=i(l===void 0?"":String(l));return $(()=>v(l===void 0?"":String(l)),[l]),e("label",{children:[t,e("input",{class:"field",type:"number",min:n,max:o,step:d,required:!b,placeholder:b?"No ceiling":void 0,value:w,onInput:r=>v(r.currentTarget.value),onBlur:r=>{r.currentTarget.validity.valid&&(w||b)?y(w?Number(w):void 0):(v(l===void 0?"":String(l)),J(`Enter a valid value for ${t.toLowerCase()}`))}})]})}function en(){return e(x,{children:[e("p",{class:"help",children:"These are the composer\u2019s remembered choices for this browser and workspace. Changes also update your current draft; running work keeps its existing settings."}),e(Y,{title:"Workflow",children:[e(se,{title:"Default workflow",description:"The team pattern used for a new task.",children:e("select",{class:"field","aria-label":"Default workflow",value:ne.value,onChange:t=>pt(t.currentTarget.value),children:tt.value.map(t=>e("option",{value:t.id,children:t.name},t.id))})}),qe[ne.value]?e(se,{title:"Approve before building",description:`Pause so you can review ${qe[ne.value]}. This choice is remembered per workflow.`,children:e("button",{class:"settings-switch",role:"switch","aria-label":"Approve before building","aria-checked":Oe(ne.value),onClick:()=>dt(!Oe(ne.value),ne.value),children:e("span",{})})}):null]}),e(Y,{title:"Agent permissions",children:[e("label",{class:"sr-only",for:"settings-trust",children:"Agent permissions"}),e("select",{class:"field",id:"settings-trust",value:ke.value,onChange:t=>rt(t.currentTarget.value),children:Object.keys(Ie).map(t=>e("option",{value:t,children:Ie[t].label},t))}),e("p",{class:ke.value==="full"?"full-warn":"help",children:Ie[ke.value].help})]}),e(Y,{title:"Run limits",children:[e("p",{class:"help",children:"Stop when a limit is reached. Changes save when you leave a field."}),e("div",{class:"settings-grid",children:[e(Te,{label:"Minutes per run",value:pe.value.maxMinutes,max:720,save:t=>me({maxMinutes:t})}),e(Te,{label:"Agent steps per run",value:pe.value.maxSteps,max:200,save:t=>me({maxSteps:t})}),e(Te,{label:"Reported token ceiling",value:pe.value.maxTokens,optional:!0,save:t=>me({maxTokens:t})}),e(Te,{label:"API-equivalent cost ceiling ($)",value:pe.value.maxCostUsd,optional:!0,min:.01,step:.01,save:t=>me({maxCostUsd:t})})]}),e("p",{class:"help",children:"Usage ceilings depend on provider reports and are checked between operations. API-equivalent cost is not your subscription bill."})]}),e("p",{class:"help",children:["Repository setup, checks, branch names, team roles and per-run isolation are available in ",e("a",{href:"#/",children:"New run \u2192 Advanced agent settings"}),"."]})]})}function tn(){let[t,l]=i(""),n=W.value.find(o=>o.id===t)??W.value.find(o=>o.repos.includes(Q.value))??W.value[0];return e(x,{children:[e(Y,{title:"Projects",children:e(se,{title:"Repositories",description:"Create projects and change their repositories.",children:e("button",{class:"btn small",onClick:()=>{at.value=!0},children:"Manage projects"})})}),n?e(x,{children:[e("label",{class:"lbl",for:"settings-project",children:"Project"}),e("select",{id:"settings-project",class:"field",value:n.id,onChange:o=>l(o.currentTarget.value),children:W.value.map(o=>e("option",{value:o.id,children:o.name},o.id))}),e(He,{projectId:n.id,repositories:n.repos},n.id),e(Bt,{projectId:n.id,repos:n.repos},`conventions:${n.id}`),e(Ut,{projectId:n.id,projectName:n.name},`policy:${n.id}`)]}):e(x,{children:[e("p",{class:"help",children:"Create a project to configure its conventions and filesystem access."}),e(He,{repositories:Q.value?[Q.value]:[]})]}),e("p",{class:"help",children:["Manage people and project access in ",e("a",{href:"#/settings/connections/sharing",children:"Connections \u2192 Share access"}),"."]})]})}function nn(){let[t,l]=i(),[n,o]=i(!1),[d,b]=i("");return e(x,{children:[e(Y,{title:"Diagnostics",children:[e("p",{class:"help",children:"Collect versions, connection health, resource queues and recent logs for the current machine. Credential-like values are redacted before export."}),e("div",{class:"settings-actions",children:[e("button",{class:"btn",disabled:n,onClick:async()=>{o(!0),b("");try{l({...await D(`/api/diagnostics${Q.value?`?repo=${L(Q.value)}`:""}`),browserPerformance:Ke(),runtime:await D("/api/health")})}catch(y){b(y.message)}finally{o(!1)}},children:n?"Collecting\u2026":"Collect diagnostics"}),t?e("button",{class:"btn",onClick:()=>xt("codeflow-diagnostics.json",JSON.stringify(t,null,2)),children:"Export diagnostics"}):null]}),t?e("details",{children:[e("summary",{children:"Collected diagnostics"}),e("pre",{children:JSON.stringify(t,null,2)})]}):null,d?e("p",{role:"alert",class:"msg err",children:d}):null]}),e(Y,{title:"Server configuration",children:[e("p",{class:"help",children:"Process settings such as the server port, data directory, concurrency, CLI paths and integration credentials are configured through environment variables when starting code-flow. Changes require a server restart."}),e("p",{class:"help",children:["Repository defaults live in ",e("code",{children:".codeflow/config.json"}),". Browser preferences are separate for each SSH workspace."]}),e("a",{href:"https://github.com/midhunxavier/code-flow/blob/main/docs/configuration.md",target:"_blank",rel:"noreferrer",children:"Configuration reference \u2197"})]})]})}export{Bs as SettingsView};