tinybeeai 0.0.0-stage → 0.16.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 (1034) hide show
  1. package/.railway/railway.ts +83 -0
  2. package/.railway/tsconfig.json +13 -0
  3. package/AGENTS.md +102 -0
  4. package/Dockerfile +108 -0
  5. package/LICENSE +21 -0
  6. package/README.md +275 -2
  7. package/bin/localdost.js +29 -0
  8. package/bin/tinybeeai.js +28 -0
  9. package/compose.yml +63 -0
  10. package/demo/payloads/ci_failure.json +46 -0
  11. package/demo/payloads/outage.json +18 -0
  12. package/demo/payloads/pr_comment_edited.json +50 -0
  13. package/demo/payloads/pr_merged.json +80 -0
  14. package/demo/payloads/pr_opened.json +69 -0
  15. package/demo/payloads/pr_synchronize.json +69 -0
  16. package/demo/payloads/ticket_created.json +138 -0
  17. package/demo/sample-app/playwright.config.ts +20 -0
  18. package/demo/sample-app/server.ts +163 -0
  19. package/demo/sample-app/tests/checkout.spec.ts +13 -0
  20. package/demo/sample-app/tests/smoke.spec.ts +8 -0
  21. package/dist/agent/approval-retries.js +59 -0
  22. package/dist/agent/approval-retries.js.map +1 -0
  23. package/dist/agent/approvals.js +390 -0
  24. package/dist/agent/approvals.js.map +1 -0
  25. package/dist/agent/chat-bridge.js +154 -0
  26. package/dist/agent/chat-bridge.js.map +1 -0
  27. package/dist/agent/chat-lead.js +475 -0
  28. package/dist/agent/chat-lead.js.map +1 -0
  29. package/dist/agent/chat-loop.js +106 -0
  30. package/dist/agent/chat-loop.js.map +1 -0
  31. package/dist/agent/chat-mcp.js +49 -0
  32. package/dist/agent/chat-mcp.js.map +1 -0
  33. package/dist/agent/chat-tool-blocks.js +453 -0
  34. package/dist/agent/chat-tool-blocks.js.map +1 -0
  35. package/dist/agent/chat-view.js +94 -0
  36. package/dist/agent/chat-view.js.map +1 -0
  37. package/dist/agent/chat-views.js +781 -0
  38. package/dist/agent/chat-views.js.map +1 -0
  39. package/dist/agent/chat.js +1703 -0
  40. package/dist/agent/chat.js.map +1 -0
  41. package/dist/agent/destinations.js +150 -0
  42. package/dist/agent/destinations.js.map +1 -0
  43. package/dist/agent/llm-cli.js +451 -0
  44. package/dist/agent/llm-cli.js.map +1 -0
  45. package/dist/agent/llm-codex.js +493 -0
  46. package/dist/agent/llm-codex.js.map +1 -0
  47. package/dist/agent/llm-openai.js +211 -0
  48. package/dist/agent/llm-openai.js.map +1 -0
  49. package/dist/agent/llm.js +1464 -0
  50. package/dist/agent/llm.js.map +1 -0
  51. package/dist/agent/memory.js +33 -0
  52. package/dist/agent/memory.js.map +1 -0
  53. package/dist/agent/mock-views.js +93 -0
  54. package/dist/agent/mock-views.js.map +1 -0
  55. package/dist/agent/model-availability.js +207 -0
  56. package/dist/agent/model-availability.js.map +1 -0
  57. package/dist/agent/model-errors.js +188 -0
  58. package/dist/agent/model-errors.js.map +1 -0
  59. package/dist/agent/model-guard.js +311 -0
  60. package/dist/agent/model-guard.js.map +1 -0
  61. package/dist/agent/prompts.js +374 -0
  62. package/dist/agent/prompts.js.map +1 -0
  63. package/dist/agent/qa-lenses/qa-auth.md +32 -0
  64. package/dist/agent/qa-lenses/qa-check-then-act.md +33 -0
  65. package/dist/agent/qa-lenses/qa-control-has-no-effect.md +32 -0
  66. package/dist/agent/qa-lenses/qa-dates.md +31 -0
  67. package/dist/agent/qa-lenses/qa-double-submit.md +34 -0
  68. package/dist/agent/qa-lenses/qa-feature-flag.md +29 -0
  69. package/dist/agent/qa-lenses/qa-migration.md +35 -0
  70. package/dist/agent/qa-lenses/qa-money.md +38 -0
  71. package/dist/agent/qa-lenses/qa-response-shape-break.md +33 -0
  72. package/dist/agent/qa-lenses/qa-validation.md +29 -0
  73. package/dist/agent/qa-prompts.js +660 -0
  74. package/dist/agent/qa-prompts.js.map +1 -0
  75. package/dist/agent/reasoning.js +55 -0
  76. package/dist/agent/reasoning.js.map +1 -0
  77. package/dist/agent/redact.js +48 -0
  78. package/dist/agent/redact.js.map +1 -0
  79. package/dist/agent/rules.js +927 -0
  80. package/dist/agent/rules.js.map +1 -0
  81. package/dist/agent/runs.js +440 -0
  82. package/dist/agent/runs.js.map +1 -0
  83. package/dist/agent/send-retry.js +62 -0
  84. package/dist/agent/send-retry.js.map +1 -0
  85. package/dist/agent/team-notes.js +288 -0
  86. package/dist/agent/team-notes.js.map +1 -0
  87. package/dist/agent/token-meter.js +31 -0
  88. package/dist/agent/token-meter.js.map +1 -0
  89. package/dist/agent/triage.js +506 -0
  90. package/dist/agent/triage.js.map +1 -0
  91. package/dist/api.js +1047 -0
  92. package/dist/api.js.map +1 -0
  93. package/dist/approval-targets.js +107 -0
  94. package/dist/approval-targets.js.map +1 -0
  95. package/dist/bee/cloudflared.js +108 -0
  96. package/dist/bee/cloudflared.js.map +1 -0
  97. package/dist/bee/health.js +99 -0
  98. package/dist/bee/health.js.map +1 -0
  99. package/dist/bee/hive-client.js +75 -0
  100. package/dist/bee/hive-client.js.map +1 -0
  101. package/dist/bee/identity.js +39 -0
  102. package/dist/bee/identity.js.map +1 -0
  103. package/dist/bee/models.js +510 -0
  104. package/dist/bee/models.js.map +1 -0
  105. package/dist/bee/pairing.js +351 -0
  106. package/dist/bee/pairing.js.map +1 -0
  107. package/dist/bee/relay-client.js +50 -0
  108. package/dist/bee/relay-client.js.map +1 -0
  109. package/dist/bee/routes.js +214 -0
  110. package/dist/bee/routes.js.map +1 -0
  111. package/dist/bee/setup-page.js +223 -0
  112. package/dist/bee/setup-page.js.map +1 -0
  113. package/dist/bee/state.js +41 -0
  114. package/dist/bee/state.js.map +1 -0
  115. package/dist/bee/status.js +117 -0
  116. package/dist/bee/status.js.map +1 -0
  117. package/dist/bee/tunnel-manager.js +245 -0
  118. package/dist/bee/tunnel-manager.js.map +1 -0
  119. package/dist/bee/updater.js +268 -0
  120. package/dist/bee/updater.js.map +1 -0
  121. package/dist/boot.js +41 -0
  122. package/dist/boot.js.map +1 -0
  123. package/dist/call/index.js +145 -0
  124. package/dist/call/index.js.map +1 -0
  125. package/dist/case-folders.js +294 -0
  126. package/dist/case-folders.js.map +1 -0
  127. package/dist/cases.js +554 -0
  128. package/dist/cases.js.map +1 -0
  129. package/dist/chat-blocks.js +709 -0
  130. package/dist/chat-blocks.js.map +1 -0
  131. package/dist/chat-parse-util.js +38 -0
  132. package/dist/chat-parse-util.js.map +1 -0
  133. package/dist/chat-results.js +96 -0
  134. package/dist/chat-results.js.map +1 -0
  135. package/dist/chat-stats.js +193 -0
  136. package/dist/chat-stats.js.map +1 -0
  137. package/dist/chat-view-specs.js +186 -0
  138. package/dist/chat-view-specs.js.map +1 -0
  139. package/dist/cli/doctor-ops.js +361 -0
  140. package/dist/cli/doctor-ops.js.map +1 -0
  141. package/dist/cli/doctor.js +289 -0
  142. package/dist/cli/doctor.js.map +1 -0
  143. package/dist/cli/dogfood.js +70 -0
  144. package/dist/cli/dogfood.js.map +1 -0
  145. package/dist/cli/env-file.js +34 -0
  146. package/dist/cli/env-file.js.map +1 -0
  147. package/dist/cli/eval-chat-cases.js +359 -0
  148. package/dist/cli/eval-chat-cases.js.map +1 -0
  149. package/dist/cli/eval-chat-results.js +85 -0
  150. package/dist/cli/eval-chat-results.js.map +1 -0
  151. package/dist/cli/eval-chat.js +508 -0
  152. package/dist/cli/eval-chat.js.map +1 -0
  153. package/dist/cli/eval-designer.js +67 -0
  154. package/dist/cli/eval-designer.js.map +1 -0
  155. package/dist/cli/eval-qa-review.js +284 -0
  156. package/dist/cli/eval-qa-review.js.map +1 -0
  157. package/dist/cli/golden-export.js +35 -0
  158. package/dist/cli/golden-export.js.map +1 -0
  159. package/dist/cli/index.js +90 -0
  160. package/dist/cli/index.js.map +1 -0
  161. package/dist/cli/init.js +746 -0
  162. package/dist/cli/init.js.map +1 -0
  163. package/dist/cli/scan-repo.js +199 -0
  164. package/dist/cli/scan-repo.js.map +1 -0
  165. package/dist/cli/seed.js +108 -0
  166. package/dist/cli/seed.js.map +1 -0
  167. package/dist/cli/tinybee.js +247 -0
  168. package/dist/cli/tinybee.js.map +1 -0
  169. package/dist/config.js +138 -0
  170. package/dist/config.js.map +1 -0
  171. package/dist/connect/aivision-local.js +833 -0
  172. package/dist/connect/aivision-local.js.map +1 -0
  173. package/dist/connect/aivision-token.js +84 -0
  174. package/dist/connect/aivision-token.js.map +1 -0
  175. package/dist/connect/crypto.js +65 -0
  176. package/dist/connect/crypto.js.map +1 -0
  177. package/dist/connect/deps.js +110 -0
  178. package/dist/connect/deps.js.map +1 -0
  179. package/dist/connect/engines.js +144 -0
  180. package/dist/connect/engines.js.map +1 -0
  181. package/dist/connect/github-access.js +74 -0
  182. package/dist/connect/github-access.js.map +1 -0
  183. package/dist/connect/github-app.js +129 -0
  184. package/dist/connect/github-app.js.map +1 -0
  185. package/dist/connect/index.js +9 -0
  186. package/dist/connect/index.js.map +1 -0
  187. package/dist/connect/model-choices.js +201 -0
  188. package/dist/connect/model-choices.js.map +1 -0
  189. package/dist/connect/providers.js +900 -0
  190. package/dist/connect/providers.js.map +1 -0
  191. package/dist/connect/readiness.js +232 -0
  192. package/dist/connect/readiness.js.map +1 -0
  193. package/dist/connect/redact.js +16 -0
  194. package/dist/connect/redact.js.map +1 -0
  195. package/dist/connect/registry.js +406 -0
  196. package/dist/connect/registry.js.map +1 -0
  197. package/dist/connect/store.js +283 -0
  198. package/dist/connect/store.js.map +1 -0
  199. package/dist/connect/tunnel.js +134 -0
  200. package/dist/connect/tunnel.js.map +1 -0
  201. package/dist/connect/types.js +8 -0
  202. package/dist/connect/types.js.map +1 -0
  203. package/dist/connections/index.js +5 -0
  204. package/dist/connections/index.js.map +1 -0
  205. package/dist/connections/manager.js +223 -0
  206. package/dist/connections/manager.js.map +1 -0
  207. package/dist/connections/presets.js +264 -0
  208. package/dist/connections/presets.js.map +1 -0
  209. package/dist/connections/store.js +132 -0
  210. package/dist/connections/store.js.map +1 -0
  211. package/dist/connections/tools.js +206 -0
  212. package/dist/connections/tools.js.map +1 -0
  213. package/dist/db-schema.js +355 -0
  214. package/dist/db-schema.js.map +1 -0
  215. package/dist/db.js +379 -0
  216. package/dist/db.js.map +1 -0
  217. package/dist/delivery.js +49 -0
  218. package/dist/delivery.js.map +1 -0
  219. package/dist/deploy-wait.js +701 -0
  220. package/dist/deploy-wait.js.map +1 -0
  221. package/dist/disk.js +243 -0
  222. package/dist/disk.js.map +1 -0
  223. package/dist/dot-health.js +966 -0
  224. package/dist/dot-health.js.map +1 -0
  225. package/dist/dot-remove.js +246 -0
  226. package/dist/dot-remove.js.map +1 -0
  227. package/dist/events.js +38 -0
  228. package/dist/events.js.map +1 -0
  229. package/dist/evidence-pack.js +423 -0
  230. package/dist/evidence-pack.js.map +1 -0
  231. package/dist/flows/answers.js +289 -0
  232. package/dist/flows/answers.js.map +1 -0
  233. package/dist/flows/change.js +811 -0
  234. package/dist/flows/change.js.map +1 -0
  235. package/dist/flows/checkStatus.js +524 -0
  236. package/dist/flows/checkStatus.js.map +1 -0
  237. package/dist/flows/ci.js +236 -0
  238. package/dist/flows/ci.js.map +1 -0
  239. package/dist/flows/ciFailure.js +76 -0
  240. package/dist/flows/ciFailure.js.map +1 -0
  241. package/dist/flows/common.js +522 -0
  242. package/dist/flows/common.js.map +1 -0
  243. package/dist/flows/default-branch.js +29 -0
  244. package/dist/flows/default-branch.js.map +1 -0
  245. package/dist/flows/defectDraft.js +447 -0
  246. package/dist/flows/defectDraft.js.map +1 -0
  247. package/dist/flows/defects.js +623 -0
  248. package/dist/flows/defects.js.map +1 -0
  249. package/dist/flows/digest.js +295 -0
  250. package/dist/flows/digest.js.map +1 -0
  251. package/dist/flows/impact.js +82 -0
  252. package/dist/flows/impact.js.map +1 -0
  253. package/dist/flows/index.js +23 -0
  254. package/dist/flows/index.js.map +1 -0
  255. package/dist/flows/intent-sources.js +72 -0
  256. package/dist/flows/intent-sources.js.map +1 -0
  257. package/dist/flows/mergeCases.js +169 -0
  258. package/dist/flows/mergeCases.js.map +1 -0
  259. package/dist/flows/nightlyRun.js +82 -0
  260. package/dist/flows/nightlyRun.js.map +1 -0
  261. package/dist/flows/outage.js +64 -0
  262. package/dist/flows/outage.js.map +1 -0
  263. package/dist/flows/postMerge.js +5 -0
  264. package/dist/flows/postMerge.js.map +1 -0
  265. package/dist/flows/prCheck.js +5 -0
  266. package/dist/flows/prCheck.js.map +1 -0
  267. package/dist/flows/prTarget.js +66 -0
  268. package/dist/flows/prTarget.js.map +1 -0
  269. package/dist/flows/qa.js +363 -0
  270. package/dist/flows/qa.js.map +1 -0
  271. package/dist/flows/questions.js +160 -0
  272. package/dist/flows/questions.js.map +1 -0
  273. package/dist/flows/recovery.js +64 -0
  274. package/dist/flows/recovery.js.map +1 -0
  275. package/dist/flows/rerun.js +50 -0
  276. package/dist/flows/rerun.js.map +1 -0
  277. package/dist/flows/testDesign.js +294 -0
  278. package/dist/flows/testDesign.js.map +1 -0
  279. package/dist/flows/testDesignJob.js +46 -0
  280. package/dist/flows/testDesignJob.js.map +1 -0
  281. package/dist/flows/testRepo.js +228 -0
  282. package/dist/flows/testRepo.js.map +1 -0
  283. package/dist/flows/testSavings.js +381 -0
  284. package/dist/flows/testSavings.js.map +1 -0
  285. package/dist/flows/testStatus.js +343 -0
  286. package/dist/flows/testStatus.js.map +1 -0
  287. package/dist/flows/ticketContext.js +425 -0
  288. package/dist/flows/ticketContext.js.map +1 -0
  289. package/dist/flows/ticketReview.js +249 -0
  290. package/dist/flows/ticketReview.js.map +1 -0
  291. package/dist/flows/ticks.js +73 -0
  292. package/dist/flows/ticks.js.map +1 -0
  293. package/dist/hive/admin.js +122 -0
  294. package/dist/hive/admin.js.map +1 -0
  295. package/dist/hive/auth.js +130 -0
  296. package/dist/hive/auth.js.map +1 -0
  297. package/dist/hive/billing.js +278 -0
  298. package/dist/hive/billing.js.map +1 -0
  299. package/dist/hive/config.js +63 -0
  300. package/dist/hive/config.js.map +1 -0
  301. package/dist/hive/db.js +186 -0
  302. package/dist/hive/db.js.map +1 -0
  303. package/dist/hive/embed.js +76 -0
  304. package/dist/hive/embed.js.map +1 -0
  305. package/dist/hive/errors.js +17 -0
  306. package/dist/hive/errors.js.map +1 -0
  307. package/dist/hive/google.js +75 -0
  308. package/dist/hive/google.js.map +1 -0
  309. package/dist/hive/index.js +25 -0
  310. package/dist/hive/index.js.map +1 -0
  311. package/dist/hive/jwt.js +57 -0
  312. package/dist/hive/jwt.js.map +1 -0
  313. package/dist/hive/keys.js +61 -0
  314. package/dist/hive/keys.js.map +1 -0
  315. package/dist/hive/mail.js +27 -0
  316. package/dist/hive/mail.js.map +1 -0
  317. package/dist/hive/native-push.js +255 -0
  318. package/dist/hive/native-push.js.map +1 -0
  319. package/dist/hive/pairing.js +342 -0
  320. package/dist/hive/pairing.js.map +1 -0
  321. package/dist/hive/presence.js +121 -0
  322. package/dist/hive/presence.js.map +1 -0
  323. package/dist/hive/push.js +185 -0
  324. package/dist/hive/push.js.map +1 -0
  325. package/dist/hive/relay.js +205 -0
  326. package/dist/hive/relay.js.map +1 -0
  327. package/dist/hive/routes.js +228 -0
  328. package/dist/hive/routes.js.map +1 -0
  329. package/dist/hive/server.js +12 -0
  330. package/dist/hive/server.js.map +1 -0
  331. package/dist/hive/session.js +28 -0
  332. package/dist/hive/session.js.map +1 -0
  333. package/dist/hive/tenants.js +287 -0
  334. package/dist/hive/tenants.js.map +1 -0
  335. package/dist/hive/tunnel/cloudflare.js +160 -0
  336. package/dist/hive/tunnel/cloudflare.js.map +1 -0
  337. package/dist/hive/tunnel/mock.js +52 -0
  338. package/dist/hive/tunnel/mock.js.map +1 -0
  339. package/dist/hive/tunnel/provider.js +19 -0
  340. package/dist/hive/tunnel/provider.js.map +1 -0
  341. package/dist/hive/updates.js +61 -0
  342. package/dist/hive/updates.js.map +1 -0
  343. package/dist/http-error.js +11 -0
  344. package/dist/http-error.js.map +1 -0
  345. package/dist/impact/classify.js +226 -0
  346. package/dist/impact/classify.js.map +1 -0
  347. package/dist/impact/find.js +259 -0
  348. package/dist/impact/find.js.map +1 -0
  349. package/dist/impact/pr.js +54 -0
  350. package/dist/impact/pr.js.map +1 -0
  351. package/dist/impact/store.js +365 -0
  352. package/dist/impact/store.js.map +1 -0
  353. package/dist/impact/text.js +158 -0
  354. package/dist/impact/text.js.map +1 -0
  355. package/dist/index.js +288 -0
  356. package/dist/index.js.map +1 -0
  357. package/dist/integrations/adf.js +397 -0
  358. package/dist/integrations/adf.js.map +1 -0
  359. package/dist/integrations/bot-marker.js +103 -0
  360. package/dist/integrations/bot-marker.js.map +1 -0
  361. package/dist/integrations/github-issues.js +705 -0
  362. package/dist/integrations/github-issues.js.map +1 -0
  363. package/dist/integrations/github.js +1284 -0
  364. package/dist/integrations/github.js.map +1 -0
  365. package/dist/integrations/issue-create.js +60 -0
  366. package/dist/integrations/issue-create.js.map +1 -0
  367. package/dist/integrations/jira.js +279 -0
  368. package/dist/integrations/jira.js.map +1 -0
  369. package/dist/integrations/linear.js +273 -0
  370. package/dist/integrations/linear.js.map +1 -0
  371. package/dist/integrations/own-identity-warm.js +47 -0
  372. package/dist/integrations/own-identity-warm.js.map +1 -0
  373. package/dist/integrations/own-identity.js +39 -0
  374. package/dist/integrations/own-identity.js.map +1 -0
  375. package/dist/integrations/status-change.js +42 -0
  376. package/dist/integrations/status-change.js.map +1 -0
  377. package/dist/lead-defects.js +202 -0
  378. package/dist/lead-defects.js.map +1 -0
  379. package/dist/lead-digest.js +333 -0
  380. package/dist/lead-digest.js.map +1 -0
  381. package/dist/lead-release.js +286 -0
  382. package/dist/lead-release.js.map +1 -0
  383. package/dist/lead.js +328 -0
  384. package/dist/lead.js.map +1 -0
  385. package/dist/legacy-names.js +51 -0
  386. package/dist/legacy-names.js.map +1 -0
  387. package/dist/limits.js +44 -0
  388. package/dist/limits.js.map +1 -0
  389. package/dist/link-trust.js +224 -0
  390. package/dist/link-trust.js.map +1 -0
  391. package/dist/links.js +219 -0
  392. package/dist/links.js.map +1 -0
  393. package/dist/loopback.js +35 -0
  394. package/dist/loopback.js.map +1 -0
  395. package/dist/model-cap.js +60 -0
  396. package/dist/model-cap.js.map +1 -0
  397. package/dist/model-usage.js +173 -0
  398. package/dist/model-usage.js.map +1 -0
  399. package/dist/monitor/backfill.js +39 -0
  400. package/dist/monitor/backfill.js.map +1 -0
  401. package/dist/monitor/browser-probe.js +198 -0
  402. package/dist/monitor/browser-probe.js.map +1 -0
  403. package/dist/monitor/catch-up.js +31 -0
  404. package/dist/monitor/catch-up.js.map +1 -0
  405. package/dist/monitor/pollers.js +1606 -0
  406. package/dist/monitor/pollers.js.map +1 -0
  407. package/dist/monitor/probes.js +178 -0
  408. package/dist/monitor/probes.js.map +1 -0
  409. package/dist/monitor/self-health.js +228 -0
  410. package/dist/monitor/self-health.js.map +1 -0
  411. package/dist/monitor/statuspage.js +105 -0
  412. package/dist/monitor/statuspage.js.map +1 -0
  413. package/dist/nightly-scheduler.js +127 -0
  414. package/dist/nightly-scheduler.js.map +1 -0
  415. package/dist/nightly.js +141 -0
  416. package/dist/nightly.js.map +1 -0
  417. package/dist/notify/headline.js +114 -0
  418. package/dist/notify/headline.js.map +1 -0
  419. package/dist/notify/push.js +174 -0
  420. package/dist/notify/push.js.map +1 -0
  421. package/dist/object-cards.js +585 -0
  422. package/dist/object-cards.js.map +1 -0
  423. package/dist/object-links.js +47 -0
  424. package/dist/object-links.js.map +1 -0
  425. package/dist/onboarding-checks.js +141 -0
  426. package/dist/onboarding-checks.js.map +1 -0
  427. package/dist/onboarding.js +401 -0
  428. package/dist/onboarding.js.map +1 -0
  429. package/dist/path-filters.js +62 -0
  430. package/dist/path-filters.js.map +1 -0
  431. package/dist/phone/alerts.js +67 -0
  432. package/dist/phone/alerts.js.map +1 -0
  433. package/dist/phone/auth.js +240 -0
  434. package/dist/phone/auth.js.map +1 -0
  435. package/dist/phone/pairing.js +442 -0
  436. package/dist/phone/pairing.js.map +1 -0
  437. package/dist/phone/prefs.js +27 -0
  438. package/dist/phone/prefs.js.map +1 -0
  439. package/dist/phone/tailscale.js +161 -0
  440. package/dist/phone/tailscale.js.map +1 -0
  441. package/dist/pr-scope.js +441 -0
  442. package/dist/pr-scope.js.map +1 -0
  443. package/dist/proc.js +156 -0
  444. package/dist/proc.js.map +1 -0
  445. package/dist/profile/cache.js +108 -0
  446. package/dist/profile/cache.js.map +1 -0
  447. package/dist/profile/ci.js +216 -0
  448. package/dist/profile/ci.js.map +1 -0
  449. package/dist/profile/index.js +8 -0
  450. package/dist/profile/index.js.map +1 -0
  451. package/dist/profile/job.js +135 -0
  452. package/dist/profile/job.js.map +1 -0
  453. package/dist/profile/queries/go-tags.scm +47 -0
  454. package/dist/profile/queries/java-tags.scm +25 -0
  455. package/dist/profile/queries/javascript-tags.scm +104 -0
  456. package/dist/profile/queries/python-tags.scm +19 -0
  457. package/dist/profile/queries/typescript-tags.scm +28 -0
  458. package/dist/profile/scan-thread.js +42 -0
  459. package/dist/profile/scan-thread.js.map +1 -0
  460. package/dist/profile/scan-worker.js +16 -0
  461. package/dist/profile/scan-worker.js.map +1 -0
  462. package/dist/profile/scan.js +351 -0
  463. package/dist/profile/scan.js.map +1 -0
  464. package/dist/profile/stack.js +528 -0
  465. package/dist/profile/stack.js.map +1 -0
  466. package/dist/profile/store.js +35 -0
  467. package/dist/profile/store.js.map +1 -0
  468. package/dist/profile/tests.js +399 -0
  469. package/dist/profile/tests.js.map +1 -0
  470. package/dist/queue.js +350 -0
  471. package/dist/queue.js.map +1 -0
  472. package/dist/refs.js +756 -0
  473. package/dist/refs.js.map +1 -0
  474. package/dist/release-notes.js +272 -0
  475. package/dist/release-notes.js.map +1 -0
  476. package/dist/reports/build.js +243 -0
  477. package/dist/reports/build.js.map +1 -0
  478. package/dist/reports/index.js +211 -0
  479. package/dist/reports/index.js.map +1 -0
  480. package/dist/reports/store.js +150 -0
  481. package/dist/reports/store.js.map +1 -0
  482. package/dist/reports/ticket-titles.js +124 -0
  483. package/dist/reports/ticket-titles.js.map +1 -0
  484. package/dist/reports/trace-map.js +1278 -0
  485. package/dist/reports/trace-map.js.map +1 -0
  486. package/dist/reports/traceability.js +422 -0
  487. package/dist/reports/traceability.js.map +1 -0
  488. package/dist/repos/mirror.js +356 -0
  489. package/dist/repos/mirror.js.map +1 -0
  490. package/dist/repos-github.js +108 -0
  491. package/dist/repos-github.js.map +1 -0
  492. package/dist/repos.js +891 -0
  493. package/dist/repos.js.map +1 -0
  494. package/dist/review/backend-anthropic.js +90 -0
  495. package/dist/review/backend-anthropic.js.map +1 -0
  496. package/dist/review/backend-cli.js +248 -0
  497. package/dist/review/backend-cli.js.map +1 -0
  498. package/dist/review/backend-codex.js +81 -0
  499. package/dist/review/backend-codex.js.map +1 -0
  500. package/dist/review/backend-mock.js +686 -0
  501. package/dist/review/backend-mock.js.map +1 -0
  502. package/dist/review/backend-only.js +168 -0
  503. package/dist/review/backend-only.js.map +1 -0
  504. package/dist/review/backend.js +105 -0
  505. package/dist/review/backend.js.map +1 -0
  506. package/dist/review/baseline/render-v1.js +483 -0
  507. package/dist/review/baseline/render-v1.js.map +1 -0
  508. package/dist/review/change-summary.js +197 -0
  509. package/dist/review/change-summary.js.map +1 -0
  510. package/dist/review/changelog.js +40 -0
  511. package/dist/review/changelog.js.map +1 -0
  512. package/dist/review/check.js +494 -0
  513. package/dist/review/check.js.map +1 -0
  514. package/dist/review/checkout.js +185 -0
  515. package/dist/review/checkout.js.map +1 -0
  516. package/dist/review/classify.js +178 -0
  517. package/dist/review/classify.js.map +1 -0
  518. package/dist/review/coverage.js +347 -0
  519. package/dist/review/coverage.js.map +1 -0
  520. package/dist/review/decision-eval.js +121 -0
  521. package/dist/review/decision-eval.js.map +1 -0
  522. package/dist/review/deliver.js +104 -0
  523. package/dist/review/deliver.js.map +1 -0
  524. package/dist/review/designer-eval.js +280 -0
  525. package/dist/review/designer-eval.js.map +1 -0
  526. package/dist/review/dogfood-digest.js +136 -0
  527. package/dist/review/dogfood-digest.js.map +1 -0
  528. package/dist/review/dogfood-eval.js +486 -0
  529. package/dist/review/dogfood-eval.js.map +1 -0
  530. package/dist/review/environment.js +109 -0
  531. package/dist/review/environment.js.map +1 -0
  532. package/dist/review/eval.js +405 -0
  533. package/dist/review/eval.js.map +1 -0
  534. package/dist/review/glob.js +110 -0
  535. package/dist/review/glob.js.map +1 -0
  536. package/dist/review/golden-export.js +219 -0
  537. package/dist/review/golden-export.js.map +1 -0
  538. package/dist/review/impact.js +406 -0
  539. package/dist/review/impact.js.map +1 -0
  540. package/dist/review/imports.js +542 -0
  541. package/dist/review/imports.js.map +1 -0
  542. package/dist/review/index.js +512 -0
  543. package/dist/review/index.js.map +1 -0
  544. package/dist/review/intent.js +128 -0
  545. package/dist/review/intent.js.map +1 -0
  546. package/dist/review/lenses.js +167 -0
  547. package/dist/review/lenses.js.map +1 -0
  548. package/dist/review/linked-tickets.js +293 -0
  549. package/dist/review/linked-tickets.js.map +1 -0
  550. package/dist/review/merge.js +370 -0
  551. package/dist/review/merge.js.map +1 -0
  552. package/dist/review/on-demand.js +218 -0
  553. package/dist/review/on-demand.js.map +1 -0
  554. package/dist/review/prompt-eval.js +299 -0
  555. package/dist/review/prompt-eval.js.map +1 -0
  556. package/dist/review/prompt-variants.js +37 -0
  557. package/dist/review/prompt-variants.js.map +1 -0
  558. package/dist/review/readability-eval.js +217 -0
  559. package/dist/review/readability-eval.js.map +1 -0
  560. package/dist/review/readability.js +295 -0
  561. package/dist/review/readability.js.map +1 -0
  562. package/dist/review/render.js +2409 -0
  563. package/dist/review/render.js.map +1 -0
  564. package/dist/review/repo.js +194 -0
  565. package/dist/review/repo.js.map +1 -0
  566. package/dist/review/report-plan.js +90 -0
  567. package/dist/review/report-plan.js.map +1 -0
  568. package/dist/review/routes.js +195 -0
  569. package/dist/review/routes.js.map +1 -0
  570. package/dist/review/run-summary.js +34 -0
  571. package/dist/review/run-summary.js.map +1 -0
  572. package/dist/review/run.js +245 -0
  573. package/dist/review/run.js.map +1 -0
  574. package/dist/review/scope.js +454 -0
  575. package/dist/review/scope.js.map +1 -0
  576. package/dist/review/security.js +432 -0
  577. package/dist/review/security.js.map +1 -0
  578. package/dist/review/signals.js +550 -0
  579. package/dist/review/signals.js.map +1 -0
  580. package/dist/review/specs.js +150 -0
  581. package/dist/review/specs.js.map +1 -0
  582. package/dist/review/ste.js +133 -0
  583. package/dist/review/ste.js.map +1 -0
  584. package/dist/review/test-repo-file.js +18 -0
  585. package/dist/review/test-repo-file.js.map +1 -0
  586. package/dist/review/test-repo-lines.js +53 -0
  587. package/dist/review/test-repo-lines.js.map +1 -0
  588. package/dist/review/ticket-on-demand.js +232 -0
  589. package/dist/review/ticket-on-demand.js.map +1 -0
  590. package/dist/review/yaml.js +298 -0
  591. package/dist/review/yaml.js.map +1 -0
  592. package/dist/room.js +361 -0
  593. package/dist/room.js.map +1 -0
  594. package/dist/routes/activity.js +219 -0
  595. package/dist/routes/activity.js.map +1 -0
  596. package/dist/routes/call.js +29 -0
  597. package/dist/routes/call.js.map +1 -0
  598. package/dist/routes/cards.js +40 -0
  599. package/dist/routes/cards.js.map +1 -0
  600. package/dist/routes/cases.js +133 -0
  601. package/dist/routes/cases.js.map +1 -0
  602. package/dist/routes/connect.js +268 -0
  603. package/dist/routes/connect.js.map +1 -0
  604. package/dist/routes/connection-presets.js +32 -0
  605. package/dist/routes/connection-presets.js.map +1 -0
  606. package/dist/routes/connections.js +177 -0
  607. package/dist/routes/connections.js.map +1 -0
  608. package/dist/routes/disk.js +19 -0
  609. package/dist/routes/disk.js.map +1 -0
  610. package/dist/routes/docs.js +71 -0
  611. package/dist/routes/docs.js.map +1 -0
  612. package/dist/routes/dot-suggest.js +1002 -0
  613. package/dist/routes/dot-suggest.js.map +1 -0
  614. package/dist/routes/evidence-pack.js +16 -0
  615. package/dist/routes/evidence-pack.js.map +1 -0
  616. package/dist/routes/health.js +121 -0
  617. package/dist/routes/health.js.map +1 -0
  618. package/dist/routes/impact.js +48 -0
  619. package/dist/routes/impact.js.map +1 -0
  620. package/dist/routes/lead.js +50 -0
  621. package/dist/routes/lead.js.map +1 -0
  622. package/dist/routes/links.js +13 -0
  623. package/dist/routes/links.js.map +1 -0
  624. package/dist/routes/markdown.js +62 -0
  625. package/dist/routes/markdown.js.map +1 -0
  626. package/dist/routes/onboarding.js +47 -0
  627. package/dist/routes/onboarding.js.map +1 -0
  628. package/dist/routes/phone.js +231 -0
  629. package/dist/routes/phone.js.map +1 -0
  630. package/dist/routes/release-notes.js +30 -0
  631. package/dist/routes/release-notes.js.map +1 -0
  632. package/dist/routes/reports.js +102 -0
  633. package/dist/routes/reports.js.map +1 -0
  634. package/dist/routes/repos.js +91 -0
  635. package/dist/routes/repos.js.map +1 -0
  636. package/dist/routes/review.js +283 -0
  637. package/dist/routes/review.js.map +1 -0
  638. package/dist/routes/roles.js +114 -0
  639. package/dist/routes/roles.js.map +1 -0
  640. package/dist/routes/room.js +21 -0
  641. package/dist/routes/room.js.map +1 -0
  642. package/dist/routes/runner.js +156 -0
  643. package/dist/routes/runner.js.map +1 -0
  644. package/dist/routes/runs.js +84 -0
  645. package/dist/routes/runs.js.map +1 -0
  646. package/dist/routes/setup.js +18 -0
  647. package/dist/routes/setup.js.map +1 -0
  648. package/dist/routes/test-runs.js +220 -0
  649. package/dist/routes/test-runs.js.map +1 -0
  650. package/dist/routes/ticket-status.js +17 -0
  651. package/dist/routes/ticket-status.js.map +1 -0
  652. package/dist/routes/traceability.js +143 -0
  653. package/dist/routes/traceability.js.map +1 -0
  654. package/dist/routes/true.js +142 -0
  655. package/dist/routes/true.js.map +1 -0
  656. package/dist/routes/updates.js +70 -0
  657. package/dist/routes/updates.js.map +1 -0
  658. package/dist/runner/adapters/index.js +12 -0
  659. package/dist/runner/adapters/index.js.map +1 -0
  660. package/dist/runner/adapters/playwright.js +68 -0
  661. package/dist/runner/adapters/playwright.js.map +1 -0
  662. package/dist/runner/aivision/cases.js +172 -0
  663. package/dist/runner/aivision/cases.js.map +1 -0
  664. package/dist/runner/aivision/cli.js +201 -0
  665. package/dist/runner/aivision/cli.js.map +1 -0
  666. package/dist/runner/aivision/index.js +281 -0
  667. package/dist/runner/aivision/index.js.map +1 -0
  668. package/dist/runner/aivision/server.js +394 -0
  669. package/dist/runner/aivision/server.js.map +1 -0
  670. package/dist/runner/aivision/shared.js +140 -0
  671. package/dist/runner/aivision/shared.js.map +1 -0
  672. package/dist/runner/artifact-cap.js +189 -0
  673. package/dist/runner/artifact-cap.js.map +1 -0
  674. package/dist/runner/artifacts.js +433 -0
  675. package/dist/runner/artifacts.js.map +1 -0
  676. package/dist/runner/command.js +564 -0
  677. package/dist/runner/command.js.map +1 -0
  678. package/dist/runner/copyfiles.js +221 -0
  679. package/dist/runner/copyfiles.js.map +1 -0
  680. package/dist/runner/engines.js +32 -0
  681. package/dist/runner/engines.js.map +1 -0
  682. package/dist/runner/evidence.js +114 -0
  683. package/dist/runner/evidence.js.map +1 -0
  684. package/dist/runner/host-env.js +160 -0
  685. package/dist/runner/host-env.js.map +1 -0
  686. package/dist/runner/index.js +1221 -0
  687. package/dist/runner/index.js.map +1 -0
  688. package/dist/runner/observe.js +603 -0
  689. package/dist/runner/observe.js.map +1 -0
  690. package/dist/runner/playwright-json.js +108 -0
  691. package/dist/runner/playwright-json.js.map +1 -0
  692. package/dist/runner/pwgen/exec.js +192 -0
  693. package/dist/runner/pwgen/exec.js.map +1 -0
  694. package/dist/runner/pwgen/explore.js +111 -0
  695. package/dist/runner/pwgen/explore.js.map +1 -0
  696. package/dist/runner/pwgen/index.js +423 -0
  697. package/dist/runner/pwgen/index.js.map +1 -0
  698. package/dist/runner/pwgen/propose.js +69 -0
  699. package/dist/runner/pwgen/propose.js.map +1 -0
  700. package/dist/runner/pwgen/source.js +632 -0
  701. package/dist/runner/pwgen/source.js.map +1 -0
  702. package/dist/runner/setup.js +222 -0
  703. package/dist/runner/setup.js.map +1 -0
  704. package/dist/runner/step-reporter.js +107 -0
  705. package/dist/runner/step-reporter.js.map +1 -0
  706. package/dist/runner/test-repo.js +326 -0
  707. package/dist/runner/test-repo.js.map +1 -0
  708. package/dist/runner/typed-value.js +46 -0
  709. package/dist/runner/typed-value.js.map +1 -0
  710. package/dist/runner/verify.js +133 -0
  711. package/dist/runner/verify.js.map +1 -0
  712. package/dist/runner/worktree.js +349 -0
  713. package/dist/runner/worktree.js.map +1 -0
  714. package/dist/sandbox.js +61 -0
  715. package/dist/sandbox.js.map +1 -0
  716. package/dist/server.js +262 -0
  717. package/dist/server.js.map +1 -0
  718. package/dist/shadow-week.js +126 -0
  719. package/dist/shadow-week.js.map +1 -0
  720. package/dist/shutdown.js +92 -0
  721. package/dist/shutdown.js.map +1 -0
  722. package/dist/slack/index.js +645 -0
  723. package/dist/slack/index.js.map +1 -0
  724. package/dist/stages/config.js +147 -0
  725. package/dist/stages/config.js.map +1 -0
  726. package/dist/stages/index.js +41 -0
  727. package/dist/stages/index.js.map +1 -0
  728. package/dist/suites.js +293 -0
  729. package/dist/suites.js.map +1 -0
  730. package/dist/target-url.js +116 -0
  731. package/dist/target-url.js.map +1 -0
  732. package/dist/test-runs.js +662 -0
  733. package/dist/test-runs.js.map +1 -0
  734. package/dist/ticket-keys.js +97 -0
  735. package/dist/ticket-keys.js.map +1 -0
  736. package/dist/ticket-supersede.js +105 -0
  737. package/dist/ticket-supersede.js.map +1 -0
  738. package/dist/tinybee/ed25519.js +99 -0
  739. package/dist/tinybee/ed25519.js.map +1 -0
  740. package/dist/tinybee/models-routes.js +19 -0
  741. package/dist/tinybee/models-routes.js.map +1 -0
  742. package/dist/tinybee/pair-payload.js +41 -0
  743. package/dist/tinybee/pair-payload.js.map +1 -0
  744. package/dist/tinybee/update-manifest.js +77 -0
  745. package/dist/tinybee/update-manifest.js.map +1 -0
  746. package/dist/tinybee/well-known.js +64 -0
  747. package/dist/tinybee/well-known.js.map +1 -0
  748. package/dist/tinybee/workflows/activity.js +23 -0
  749. package/dist/tinybee/workflows/activity.js.map +1 -0
  750. package/dist/tinybee/workflows/cron.js +210 -0
  751. package/dist/tinybee/workflows/cron.js.map +1 -0
  752. package/dist/tinybee/workflows/engine.js +371 -0
  753. package/dist/tinybee/workflows/engine.js.map +1 -0
  754. package/dist/tinybee/workflows/from-text.js +203 -0
  755. package/dist/tinybee/workflows/from-text.js.map +1 -0
  756. package/dist/tinybee/workflows/routes.js +189 -0
  757. package/dist/tinybee/workflows/routes.js.map +1 -0
  758. package/dist/tinybee/workflows/scheduler.js +100 -0
  759. package/dist/tinybee/workflows/scheduler.js.map +1 -0
  760. package/dist/tinybee/workflows/skills.js +227 -0
  761. package/dist/tinybee/workflows/skills.js.map +1 -0
  762. package/dist/tinybee/workflows/store.js +205 -0
  763. package/dist/tinybee/workflows/store.js.map +1 -0
  764. package/dist/tinybee/workflows/types.js +180 -0
  765. package/dist/tinybee/workflows/types.js.map +1 -0
  766. package/dist/tinybee/workflows/yaml.js +323 -0
  767. package/dist/tinybee/workflows/yaml.js.map +1 -0
  768. package/dist/true/api.js +495 -0
  769. package/dist/true/api.js.map +1 -0
  770. package/dist/true/client.js +292 -0
  771. package/dist/true/client.js.map +1 -0
  772. package/dist/true/clock.js +36 -0
  773. package/dist/true/clock.js.map +1 -0
  774. package/dist/true/events.js +125 -0
  775. package/dist/true/events.js.map +1 -0
  776. package/dist/true/hosts.js +98 -0
  777. package/dist/true/hosts.js.map +1 -0
  778. package/dist/true/index.js +29 -0
  779. package/dist/true/index.js.map +1 -0
  780. package/dist/true/key.js +54 -0
  781. package/dist/true/key.js.map +1 -0
  782. package/dist/true/line.js +69 -0
  783. package/dist/true/line.js.map +1 -0
  784. package/dist/true/mask.js +31 -0
  785. package/dist/true/mask.js.map +1 -0
  786. package/dist/true/names.js +114 -0
  787. package/dist/true/names.js.map +1 -0
  788. package/dist/true/outbox.js +233 -0
  789. package/dist/true/outbox.js.map +1 -0
  790. package/dist/true/replay.js +164 -0
  791. package/dist/true/replay.js.map +1 -0
  792. package/dist/true/settings.js +123 -0
  793. package/dist/true/settings.js.map +1 -0
  794. package/dist/true/status.js +189 -0
  795. package/dist/true/status.js.map +1 -0
  796. package/dist/true/sync-cases.js +222 -0
  797. package/dist/true/sync-cases.js.map +1 -0
  798. package/dist/true/sync-manual.js +295 -0
  799. package/dist/true/sync-manual.js.map +1 -0
  800. package/dist/true/sync-runs.js +109 -0
  801. package/dist/true/sync-runs.js.map +1 -0
  802. package/dist/true/worker.js +414 -0
  803. package/dist/true/worker.js.map +1 -0
  804. package/dist/types.js +32 -0
  805. package/dist/types.js.map +1 -0
  806. package/dist/updates/asks.js +38 -0
  807. package/dist/updates/asks.js.map +1 -0
  808. package/dist/updates/index.js +835 -0
  809. package/dist/updates/index.js.map +1 -0
  810. package/dist/updates/owner.js +24 -0
  811. package/dist/updates/owner.js.map +1 -0
  812. package/dist/updates/prefs.js +118 -0
  813. package/dist/updates/prefs.js.map +1 -0
  814. package/dist/updates/route.js +78 -0
  815. package/dist/updates/route.js.map +1 -0
  816. package/dist/updates/sources.js +345 -0
  817. package/dist/updates/sources.js.map +1 -0
  818. package/dist/updates/words.js +452 -0
  819. package/dist/updates/words.js.map +1 -0
  820. package/dist/version.js +53 -0
  821. package/dist/version.js.map +1 -0
  822. package/dist/view-compute.js +382 -0
  823. package/dist/view-compute.js.map +1 -0
  824. package/dist/view-spec.js +894 -0
  825. package/dist/view-spec.js.map +1 -0
  826. package/dist/web/apple-touch-icon.png +0 -0
  827. package/dist/web/assets/ApprovalCard-Br_z5z7G.css +1 -0
  828. package/dist/web/assets/ApprovalCard-CfGhGFo_.js +3 -0
  829. package/dist/web/assets/CardFromRef-BaTGmZ9c.js +2 -0
  830. package/dist/web/assets/CardFromRef-DO7i2uDd.css +1 -0
  831. package/dist/web/assets/Cases-8l_6UcLh.js +2 -0
  832. package/dist/web/assets/Cases-CpfED0uB.css +1 -0
  833. package/dist/web/assets/Chat-BKDiR0qt.js +3 -0
  834. package/dist/web/assets/Chat-DxjdyYUu.css +1 -0
  835. package/dist/web/assets/ConfirmDialog-CIMveD-b.js +2 -0
  836. package/dist/web/assets/ConnectSheet-Cm5vbZdR.js +4 -0
  837. package/dist/web/assets/Docs-HKGuY0WE.js +2 -0
  838. package/dist/web/assets/Docs-fodKx8S7.css +1 -0
  839. package/dist/web/assets/DotDetail-DskS3NWe.js +2 -0
  840. package/dist/web/assets/DotDetail-OWRSD_1x.css +1 -0
  841. package/dist/web/assets/DotStage-BZDclfzV.css +1 -0
  842. package/dist/web/assets/DotStage-CtMNzCN3.js +2 -0
  843. package/dist/web/assets/Dots-BqCsS34m.js +2 -0
  844. package/dist/web/assets/EvidencePack-DQ3kCJX4.js +2 -0
  845. package/dist/web/assets/EvidencePack-DV_9ETsA.css +1 -0
  846. package/dist/web/assets/FailedDeliveries-1F2kFcs9.js +2 -0
  847. package/dist/web/assets/FailedDeliveries-DXa2_VvI.css +1 -0
  848. package/dist/web/assets/Feed-5wiHRTFK.js +2 -0
  849. package/dist/web/assets/GfmView-C-NYaduC.js +4 -0
  850. package/dist/web/assets/ImpactList-C-RNuDB0.js +2 -0
  851. package/dist/web/assets/ImpactList-C612dFdw.css +1 -0
  852. package/dist/web/assets/Inbox-kc1bKVL_.js +2 -0
  853. package/dist/web/assets/JoinScreen-C3L4wmP3.js +2 -0
  854. package/dist/web/assets/JoinScreen-COeAUv5v.css +1 -0
  855. package/dist/web/assets/LeadDialog-N3Zul9Rw.js +8 -0
  856. package/dist/web/assets/LeadDialog-xyWjAuAS.css +1 -0
  857. package/dist/web/assets/ListeningLine-BRFNaczY.js +2 -0
  858. package/dist/web/assets/ListeningLine-pN8CgyiK.css +1 -0
  859. package/dist/web/assets/Mascots-pIyGpxtD.js +2 -0
  860. package/dist/web/assets/ModelChoices-BxO1zyyr.js +2 -0
  861. package/dist/web/assets/ModelChoices-DQJnVxfs.css +1 -0
  862. package/dist/web/assets/NewDotDialog-CDPUWmgN.js +2 -0
  863. package/dist/web/assets/NewDotDialog-DrPPqkSZ.css +1 -0
  864. package/dist/web/assets/NewTestRunDialog-BQBthVHE.js +2 -0
  865. package/dist/web/assets/NoBreakNames-Csxdqdt6.js +2 -0
  866. package/dist/web/assets/Pair-omex_K7H.js +2 -0
  867. package/dist/web/assets/PushSection-CmqHlE_2.js +2 -0
  868. package/dist/web/assets/ReleaseNotes-B6VqFewP.js +2 -0
  869. package/dist/web/assets/ReleaseNotes-DBJUL7Vm.css +1 -0
  870. package/dist/web/assets/ReportPage-BHS1xWEt.js +162 -0
  871. package/dist/web/assets/Reports-BEHnDIb1.js +2 -0
  872. package/dist/web/assets/ReviewChangeDialog-BVSt-cw-.js +2 -0
  873. package/dist/web/assets/ReviewChangeDialog-BbIlHRx0.css +1 -0
  874. package/dist/web/assets/Room-BoG_uge4.js +2 -0
  875. package/dist/web/assets/Room-evAfiW_e.css +1 -0
  876. package/dist/web/assets/RunActions-ZY7yf1AF.js +2 -0
  877. package/dist/web/assets/RunDetail-C8St20GQ.css +1 -0
  878. package/dist/web/assets/RunDetail-qADXjBvd.js +9 -0
  879. package/dist/web/assets/RunRow-BKEJv8ib.js +2 -0
  880. package/dist/web/assets/RunnerTry-Dgpp67-s.js +6 -0
  881. package/dist/web/assets/RunnerTry-DsweWOfO.css +1 -0
  882. package/dist/web/assets/Settings-fs-QJwNM.js +2 -0
  883. package/dist/web/assets/Setup-DI6hBEP-.js +2 -0
  884. package/dist/web/assets/TestRows-wh03T5Li.js +4 -0
  885. package/dist/web/assets/TestRun-DTOyF-Pv.js +2 -0
  886. package/dist/web/assets/TestRuns-ggDjm1Q8.js +2 -0
  887. package/dist/web/assets/TinyBeeAddLaptop-bc3pmh3T.js +2 -0
  888. package/dist/web/assets/TinyBeeAi-CkyOzhm5.js +2 -0
  889. package/dist/web/assets/TinyBeeConnections-B2K_P38u.js +2 -0
  890. package/dist/web/assets/TinyBeeHome-DSpxX5KS.js +3 -0
  891. package/dist/web/assets/TinyBeePlan-BamiLziu.js +2 -0
  892. package/dist/web/assets/TinyBeeSignup-vHcz0Wen.js +2 -0
  893. package/dist/web/assets/TinyBeeSkills-By9RLUse.js +2 -0
  894. package/dist/web/assets/TinyBeeWorkflow-DeNO7Jsh.js +2 -0
  895. package/dist/web/assets/TinyBeeWorkflowEditor-B6OGC2OT.js +2 -0
  896. package/dist/web/assets/TinyBeeWorkflows-BN4-h6lt.js +2 -0
  897. package/dist/web/assets/Trace-BBCI1aIB.css +1 -0
  898. package/dist/web/assets/Trace-aF92UWaH.js +2 -0
  899. package/dist/web/assets/UpdatesSection-CCWEbkue.js +2 -0
  900. package/dist/web/assets/Welcome-CCcy558Q.js +2 -0
  901. package/dist/web/assets/activity-C3qilrDm.css +1 -0
  902. package/dist/web/assets/activity-CBfTSxqw.js +2 -0
  903. package/dist/web/assets/authedMedia-BTYt_tyu.js +2 -0
  904. package/dist/web/assets/beeApi-BHW8Tx1s.js +2 -0
  905. package/dist/web/assets/data-CmXvx3Mj.js +2 -0
  906. package/dist/web/assets/engines-CfdJODFj.css +1 -0
  907. package/dist/web/assets/format-BBZ8vFyT.js +2 -0
  908. package/dist/web/assets/forms-Coc7p2UF.css +1 -0
  909. package/dist/web/assets/hivePush-DZJDokj7.js +2 -0
  910. package/dist/web/assets/impactModel-MY1OFuiP.js +2 -0
  911. package/dist/web/assets/index-B6qKm1NW.js +13 -0
  912. package/dist/web/assets/index-BvKyT1X7.css +1 -0
  913. package/dist/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  914. package/dist/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  915. package/dist/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  916. package/dist/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  917. package/dist/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  918. package/dist/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  919. package/dist/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  920. package/dist/web/assets/lead-BL_P_kri.css +1 -0
  921. package/dist/web/assets/model-BIQy5IVG.js +2 -0
  922. package/dist/web/assets/modelsApi-PUSySRQw.js +2 -0
  923. package/dist/web/assets/newDotModel-BaLLyw57.js +2 -0
  924. package/dist/web/assets/onboarding-bfKqnM4Z.css +1 -0
  925. package/dist/web/assets/phone-Rs7FoyG0.css +1 -0
  926. package/dist/web/assets/phoneApi-BG_1-M-D.js +3 -0
  927. package/dist/web/assets/releaseModel-EynYMVOC.js +2 -0
  928. package/dist/web/assets/releaseNotesModel-A1Rtv3cV.js +2 -0
  929. package/dist/web/assets/reports-BWaA1HhM.js +37 -0
  930. package/dist/web/assets/reports-DXwdWQsB.css +1 -0
  931. package/dist/web/assets/router-W6nZsQ33.js +2 -0
  932. package/dist/web/assets/runs-BY0Owv93.css +1 -0
  933. package/dist/web/assets/shadowWeekModel-BUUiww09.js +2 -0
  934. package/dist/web/assets/storage-yvL36AWt.js +2 -0
  935. package/dist/web/assets/store-IqrqHuFR.js +2 -0
  936. package/dist/web/assets/testruns-BzIZ0cR0.css +1 -0
  937. package/dist/web/assets/testruns-DyaqX4ji.js +2 -0
  938. package/dist/web/assets/true-9Q68cs5b.js +2 -0
  939. package/dist/web/assets/true-DPGBpoir.css +1 -0
  940. package/dist/web/assets/ui-DcmhYyYp.js +13 -0
  941. package/dist/web/assets/ui-DxEDgbIx.css +1 -0
  942. package/dist/web/assets/usePauseDot-BV60ZVy1.js +2 -0
  943. package/dist/web/assets/usePauseDot-NrSzMI1C.css +1 -0
  944. package/dist/web/assets/usePush-Dsm-TjlG.js +2 -0
  945. package/dist/web/assets/useRefChips-CbafNx59.js +68 -0
  946. package/dist/web/assets/useRestoreDot-D0B6W82H.js +2 -0
  947. package/dist/web/assets/view-worker-pyeVAhUT.js +2 -0
  948. package/dist/web/assets/workflowUi-QYsd3n9J.js +2 -0
  949. package/dist/web/favicon.png +0 -0
  950. package/dist/web/icon-192.png +0 -0
  951. package/dist/web/icon-512.png +0 -0
  952. package/dist/web/icon-maskable-512.png +0 -0
  953. package/dist/web/index.html +45 -0
  954. package/dist/web/manifest.webmanifest +23 -0
  955. package/dist/web/mascots/argus-attention.svg +7 -0
  956. package/dist/web/mascots/argus-ok.svg +7 -0
  957. package/dist/web/mascots/argus-outage.svg +7 -0
  958. package/dist/web/mascots/argus-running.svg +7 -0
  959. package/dist/web/mascots/bolt-attention.svg +7 -0
  960. package/dist/web/mascots/bolt-ok.svg +7 -0
  961. package/dist/web/mascots/bolt-outage.svg +7 -0
  962. package/dist/web/mascots/bolt-running.svg +7 -0
  963. package/dist/web/mascots/echo-attention.svg +7 -0
  964. package/dist/web/mascots/echo-ok.svg +7 -0
  965. package/dist/web/mascots/echo-outage.svg +7 -0
  966. package/dist/web/mascots/echo-running.svg +7 -0
  967. package/dist/web/mascots/lens-attention.svg +7 -0
  968. package/dist/web/mascots/lens-ok.svg +7 -0
  969. package/dist/web/mascots/lens-outage.svg +7 -0
  970. package/dist/web/mascots/lens-running.svg +7 -0
  971. package/dist/web/mascots/moss-attention.svg +7 -0
  972. package/dist/web/mascots/moss-ok.svg +7 -0
  973. package/dist/web/mascots/moss-outage.svg +7 -0
  974. package/dist/web/mascots/moss-running.svg +7 -0
  975. package/dist/web/mascots/nit-attention.svg +7 -0
  976. package/dist/web/mascots/nit-ok.svg +7 -0
  977. package/dist/web/mascots/nit-outage.svg +7 -0
  978. package/dist/web/mascots/nit-running.svg +7 -0
  979. package/dist/web/mascots/nova-attention.svg +7 -0
  980. package/dist/web/mascots/nova-ok.svg +7 -0
  981. package/dist/web/mascots/nova-outage.svg +7 -0
  982. package/dist/web/mascots/nova-running.svg +7 -0
  983. package/dist/web/mascots/penn-attention.svg +7 -0
  984. package/dist/web/mascots/penn-ok.svg +7 -0
  985. package/dist/web/mascots/penn-outage.svg +7 -0
  986. package/dist/web/mascots/penn-running.svg +7 -0
  987. package/dist/web/mascots/pip-attention.svg +7 -0
  988. package/dist/web/mascots/pip-ok.svg +7 -0
  989. package/dist/web/mascots/pip-outage.svg +7 -0
  990. package/dist/web/mascots/pip-running.svg +7 -0
  991. package/dist/web/mascots/ward-attention.svg +7 -0
  992. package/dist/web/mascots/ward-ok.svg +7 -0
  993. package/dist/web/mascots/ward-outage.svg +7 -0
  994. package/dist/web/mascots/ward-running.svg +7 -0
  995. package/dist/web/sw.js +98 -0
  996. package/dist/webhook-seen.js +53 -0
  997. package/dist/webhook-seen.js.map +1 -0
  998. package/dist/webhooks.js +625 -0
  999. package/dist/webhooks.js.map +1 -0
  1000. package/dist/zip.js +63 -0
  1001. package/dist/zip.js.map +1 -0
  1002. package/docs/API-V2.md +532 -0
  1003. package/docs/CHAT-EVAL.md +130 -0
  1004. package/docs/CHAT-UI.md +416 -0
  1005. package/docs/CONNECTIONS.md +89 -0
  1006. package/docs/DATA-MODEL.md +518 -0
  1007. package/docs/DEPLOY.md +577 -0
  1008. package/docs/DOGFOOD-LEDGER.md +81 -0
  1009. package/docs/GITHUB.md +148 -0
  1010. package/docs/INTEGRATION-MODEL.md +200 -0
  1011. package/docs/LEAD-DOT.md +553 -0
  1012. package/docs/LIST-PATTERNS.md +52 -0
  1013. package/docs/MULTI-REPO.md +766 -0
  1014. package/docs/PARITY.md +276 -0
  1015. package/docs/PR-REVIEW-QA.md +1266 -0
  1016. package/docs/PR-REVIEW.md +357 -0
  1017. package/docs/SANDBOX.md +320 -0
  1018. package/docs/SETUP.md +776 -0
  1019. package/docs/SLACK.md +80 -0
  1020. package/docs/STAGES.md +619 -0
  1021. package/docs/TRACE-MAP.md +89 -0
  1022. package/docs/TRACKERS.md +225 -0
  1023. package/docs/VOICE.md +36 -0
  1024. package/docs/tinybee/00-README.md +45 -0
  1025. package/docs/tinybee/01-PRD.md +216 -0
  1026. package/docs/tinybee/02-architecture-pairing.md +199 -0
  1027. package/docs/tinybee/03-local-agent.md +222 -0
  1028. package/docs/tinybee/04-local-setup-ui.md +128 -0
  1029. package/docs/tinybee/05-mobile-app-ux.md +199 -0
  1030. package/docs/tinybee/06-environments-and-delivery.md +148 -0
  1031. package/docs/tinybee/07-coding-agent-handoff.md +116 -0
  1032. package/docs/tinybee/OPEN-QUESTIONS.md +26 -0
  1033. package/docs/tinybee/PROGRESS.md +134 -0
  1034. package/package.json +111 -4
@@ -0,0 +1,2 @@
1
+ import{B as e,Bt as t,Cn as n,F as r,G as i,H as a,Ht as o,I as s,J as c,L as l,N as u,Pt as d,R as f,S as p,Tn as m,Vn as h,W as g,Wn as _,at as v,b as y,in as ee,j as te,mn as b,nt as ne,pn as x,q as S,sn as C,ut as re,v as w,x as ie}from"./ui-DcmhYyYp.js";import{r as T,t as E}from"./router-W6nZsQ33.js";import{c as ae,i as D,n as O,r as k,t as oe}from"./store-IqrqHuFR.js";import{a as A,l as j,n as se,t as ce}from"./data-CmXvx3Mj.js";import{l as M,s as le,v as N,y as P}from"./format-BBZ8vFyT.js";import{At as F,Ct as I,Dt as ue,Et as de,Ft as L,Mt as R,Nt as fe,Pt as pe,Rt as me,St as z,Tt as B,a as he,bt as V,jt as H,mn as ge,vt as U,wt as W,xt as G}from"./index-B6qKm1NW.js";import{a as K,i as q,n as _e,o as ve,t as ye}from"./true-9Q68cs5b.js";import{t as be}from"./ReviewChangeDialog-BVSt-cw-.js";import{t as J}from"./NoBreakNames-Csxdqdt6.js";import{a as xe,i as Se,n as Y,o as Ce,r as we,s as Te,t as Ee}from"./releaseModel-EynYMVOC.js";/* empty css */import{t as De}from"./RunActions-ZY7yf1AF.js";import{n as Oe,t as ke}from"./ListeningLine-BRFNaczY.js";import{M as Ae,j as je}from"./ModelChoices-BxO1zyyr.js";/* empty css */import{n as Me,t as Ne}from"./usePauseDot-BV60ZVy1.js";import{V as Pe}from"./RunnerTry-Dgpp67-s.js";import{n as Fe,r as Ie,s as Le,t as Re}from"./LeadDialog-N3Zul9Rw.js";import{t as ze}from"./shadowWeekModel-BUUiww09.js";import{t as Be}from"./useRestoreDot-D0B6W82H.js";import{t as Ve}from"./FailedDeliveries-1F2kFcs9.js";import{t as He}from"./RunRow-BKEJv8ib.js";/* empty css */var X=_(h(),1),Z=b();function Ue(e){return e.split(/(\s+)/).map((e,t)=>e.includes(`-`)?(0,Z.jsx)(`span`,{className:`dot-head__engines-word`,children:e},t):e)}function We({dot:e,onChange:t}){let n=j(),r=je(e.runner.engine,n.data);return r?(0,Z.jsxs)(`span`,{className:`dot-head__engines`,children:[(0,Z.jsxs)(`span`,{className:`dot-head__engines-text`,title:`Test engines: ${Ae(r)}`,children:[`Test engines: `,Ue(Ae(r))]}),t&&(0,Z.jsxs)(`button`,{type:`button`,className:`link-btn dot-head__engines-change`,onClick:t,children:[`Change`,(0,Z.jsx)(`span`,{className:`sr-only`,children:` test engines`})]})]}):null}var Ge=e=>`model-usage:${e}`;function Ke({row:e,total:t}){return(0,Z.jsxs)(`tr`,{className:t?`mu-total`:void 0,"data-stage":e.key,children:[(0,Z.jsx)(`th`,{scope:`row`,children:e.label}),(0,Z.jsx)(`td`,{className:`num`,children:e.today.calls}),(0,Z.jsx)(`td`,{className:`num`,title:q(e.today)?`Some calls reported no token count.`:void 0,children:K(e.today)}),(0,Z.jsx)(`td`,{className:`num`,children:e.week.calls}),(0,Z.jsx)(`td`,{className:`num`,title:q(e.week)?`Some calls reported no token count.`:void 0,children:K(e.week)})]})}function qe({dot:e}){let t=D(Ge(e.id),t=>m.modelUsage(e.id,t),{refreshOn:[`run`],eventFilter:t=>t.type===`run`&&t.run.watchId===e.id,throttleMs:3e3}),n=t.data,r=n?.cap??e.modelCap??null,i=_e(r),o=ye(r),{rows:s,total:c,partial:l}=n?ve(n):{rows:[],total:null,partial:!1};return(0,Z.jsx)(C,{title:`AI use`,description:i??`Calls and tokens the dot used. Set a daily cap in the dot settings.`,"data-model-usage":!0,children:t.loading?(0,Z.jsx)(f,{rows:3,label:`Loading AI use`}):n?(0,Z.jsxs)(Z.Fragment,{children:[o&&(0,Z.jsxs)(`p`,{className:`mu-cap`,role:`status`,children:[(0,Z.jsx)(y,{kind:`attention`,label:o,decorative:!0,size:16}),(0,Z.jsx)(`span`,{children:o})]}),s.length===0?(0,Z.jsx)(`p`,{className:`run-muted`,children:`No AI calls yet. They show here once the dot reviews or answers something.`}):(0,Z.jsx)(`div`,{className:`mu-wrap`,children:(0,Z.jsxs)(`table`,{className:`mu-table`,"aria-label":`AI calls and tokens by stage`,children:[(0,Z.jsxs)(`thead`,{children:[(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`td`,{}),(0,Z.jsx)(`th`,{scope:`colgroup`,colSpan:2,children:`Today`}),(0,Z.jsx)(`th`,{scope:`colgroup`,colSpan:2,children:`Last 7 days`})]}),(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,Z.jsx)(`th`,{scope:`col`,children:`Calls`}),(0,Z.jsx)(`th`,{scope:`col`,children:`Tokens`}),(0,Z.jsx)(`th`,{scope:`col`,children:`Calls`}),(0,Z.jsx)(`th`,{scope:`col`,children:`Tokens`})]})]}),(0,Z.jsx)(`tbody`,{children:s.map(e=>(0,Z.jsx)(Ke,{row:e},e.key))}),c&&(0,Z.jsx)(`tfoot`,{children:(0,Z.jsx)(Ke,{row:c,total:!0})})]})}),l&&(0,Z.jsx)(`p`,{className:`mu-note`,children:`Tokens count only the calls where the model reported them.`})]}):(0,Z.jsx)(a,{compact:!0,error:t.error,title:`Could not load AI use`,onRetry:()=>void t.reload(),retrying:t.refreshing})})}function Je(e){let t=[];return e?.authors?.length&&t.push(`only PRs by ${e.authors.join(`, `)}`),e?.skipDrafts&&t.push(`no drafts`),e?.skipBots&&t.push(`no bots`),t.length?t.join(`; `):`every PR`}function Ye(e){let t=(e??[]).filter(Boolean);return t.length?t.length===1?`with the label ${t[0]}`:`with one of the labels ${t.join(`, `)}`:``}function Xe(e){return(e??[]).filter(e=>e.runTests===!1).map(e=>`${e.repo}: off, reviewed and not tested`)}var Ze=[`review`,`bugs`,`checks`,`release`,`site`,`tests`,`tickets`,`ai`];function Qe(e){if(!e||!(e.status in z)||!e.watching||!e.tiles)throw Error(`The health answer is not in the shape this page reads.`);return e}function $e(e){return V(B(e)),D(B(e),t=>m.dotHealth(e,t).then(Qe),{refreshOn:[`run`,`approval`,`dot`],eventFilter:t=>t.type===`run`?t.run.watchId===e:t.type===`approval`?t.approval.watchId===e:t.type===`dot`&&t.watchId===e,throttleMs:1500})}function et(e,t){try{sessionStorage.setItem(De,JSON.stringify({dotId:e,text:t}))}catch{}T(E({name:`chat`,dotId:e}))}function tt(){let e=document.querySelector(`[data-model-usage]`);e&&(e.scrollIntoView?.({block:`start`,behavior:window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`}),e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}function Q({action:e,dotId:t,canSetUp:n,onSetup:r,primary:i}){let a=`btn btn--${i?`primary`:`secondary`} btn--sm`;if(e.href){let t=de(e);return(0,Z.jsx)(`a`,{className:a,href:e.href,...t?{target:`_blank`,rel:`noopener noreferrer`}:{},children:(0,Z.jsx)(`span`,{className:`btn__label`,children:e.label})})}return e.setup?n?(0,Z.jsx)(x,{size:`sm`,variant:i?`primary`:`secondary`,onClick:()=>r(e.setup),children:e.label}):null:e.run===`site_check`?(0,Z.jsx)(nt,{dotId:t,label:e.label}):e.focus===`model_usage`?(0,Z.jsx)(x,{size:`sm`,onClick:tt,children:e.label}):e.draft?(0,Z.jsx)(x,{size:`sm`,variant:i?`primary`:`secondary`,onClick:()=>et(t,e.draft),children:e.label}):null}function nt({dotId:e,label:t}){let r=S(),{isAdmin:i}=ge(),[a,o]=(0,X.useState)(!1);async function s(){o(!0);try{await m.siteCheck(e)}catch(e){let t=e instanceof n&&(e.status===409||e.status===403);r.show({tone:`error`,title:`Could not check the site`,body:e instanceof n?e.message:void 0,...t?{}:{action:{label:`Try again`,onClick:()=>void s()}}})}finally{o(!1),O(B(e)),O(U)}}return i?(0,Z.jsx)(x,{size:`sm`,loading:a,onClick:()=>void s(),children:t}):null}function rt({tile:e,dotId:t,canSetUp:n,onSetup:r,onRetry:i}){let a=e.state!==`ready`;return(0,Z.jsxs)(`li`,{className:`health-tile${a?` is-quiet`:``}`,"data-state":e.state,children:[(0,Z.jsx)(`h3`,{className:`health-tile__title`,children:e.title}),(0,Z.jsx)(`p`,{className:`health-tile__line`,children:e.line}),(0,Z.jsx)(`div`,{className:`health-tile__foot`,children:e.state===`error`?(0,Z.jsx)(x,{size:`sm`,onClick:i,children:`Try again`}):e.action&&(0,Z.jsx)(Q,{action:e.action,dotId:t,canSetUp:n,onSetup:r})})]})}function it(){return e(1e3)?(0,Z.jsxs)(`div`,{className:`health-skeleton`,role:`status`,"aria-busy":`true`,"aria-label":`Loading the health of this dot`,children:[(0,Z.jsx)(l,{width:260,height:24}),(0,Z.jsx)(l,{width:`100%`,height:72,radius:8}),(0,Z.jsx)(`div`,{className:`health-grid`,children:Ze.map(e=>(0,Z.jsx)(l,{width:`100%`,height:92,radius:8},e))})]}):(0,Z.jsx)(`div`,{role:`status`,"aria-busy":`true`,"aria-label":`Loading the health of this dot`})}function at({health:e,dot:t,canSetUp:n,onSetup:r,onRetry:i,now:a}){let o=e.watching,{isAdmin:s}=ge(),c=ue(o,a??I(e)),l=pe(o),u=H(o),d=z[e.status],f=e.status===`not_watching`&&!t.paused&&!t.archived?e.statusReason:null,p=e.status===`not_watching`&&!!e.statusFix&&!t.paused&&!t.archived,m=p&&n&&s?e.statusFix:null,h=p&&!s;return(0,Z.jsxs)(`section`,{className:`health`,"aria-labelledby":`health-${t.id}`,"data-status":e.status,children:[(0,Z.jsxs)(`header`,{className:`health__head`,children:[(0,Z.jsxs)(`div`,{className:`health__headline`,children:[(0,Z.jsxs)(`h2`,{id:`health-${t.id}`,className:`health__title`,children:[(0,Z.jsx)(`span`,{className:`health__name`,title:t.name,children:t.name}),` `,(0,Z.jsxs)(`span`,{className:`health__rest`,children:[`health:`,` `,(0,Z.jsx)(`span`,{className:`health__word health__word--${e.status}`,"data-health-status":!0,children:d})]})]}),(0,Z.jsx)(`p`,{className:`health__scope`,children:R(t)})]}),(0,Z.jsx)(`span`,{className:`health__badge health__word--${e.status}`,"aria-hidden":`true`,children:(0,Z.jsx)(y,{kind:G[e.status],label:d,decorative:!0,size:24})})]}),(0,Z.jsxs)(`div`,{className:`health-strip`,role:`group`,"aria-label":`Watching`,children:[(0,Z.jsxs)(`div`,{className:`health-strip__top`,children:[(0,Z.jsxs)(`span`,{className:`health-strip__state`,children:[(0,Z.jsx)(y,{kind:o.on?`passed`:`expired`,label:`Watching`,decorative:!0,size:16}),(0,Z.jsx)(`span`,{children:L(o)})]}),l&&(0,Z.jsx)(`span`,{className:`health-strip__trial`,children:l})]}),f&&(0,Z.jsx)(`p`,{className:`health-strip__line`,children:(0,Z.jsx)(J,{text:f})}),m&&(0,Z.jsx)(`p`,{className:`health-strip__line`,children:(0,Z.jsx)(Q,{action:m,dotId:t.id,canSetUp:n,onSetup:r})}),h&&(0,Z.jsx)(`p`,{className:`health-strip__line`,children:`Only an admin can open Setup. Ask your admin to fix this.`}),f&&e.statusDetail&&(0,Z.jsx)(g,{children:(0,Z.jsx)(`p`,{className:`health-strip__line`,children:e.statusDetail})}),c&&(0,Z.jsxs)(`p`,{className:`health-strip__line`,children:[`Last check: `,c.runId?(0,Z.jsx)(`a`,{href:E({name:`run`,id:c.runId}),children:c.label}):(0,Z.jsx)(`span`,{children:c.label}),`, `,c.when]}),o.note&&(0,Z.jsx)(`p`,{className:`health-strip__line`,children:(0,Z.jsx)(J,{text:o.note})}),u&&(0,Z.jsx)(`p`,{className:`health-strip__line`,children:u})]}),(0,Z.jsx)(`ul`,{className:`health-grid`,"aria-label":`Health tiles`,children:Ze.map(a=>(0,Z.jsx)(rt,{tile:e.tiles[a],dotId:t.id,canSetUp:n,onSetup:r,onRetry:i},a))}),e.suggestion&&(0,Z.jsxs)(`div`,{className:`health-suggest`,role:`group`,"aria-label":`Today's suggestion`,children:[(0,Z.jsx)(`h3`,{className:`health-suggest__label`,children:`Today's suggestion`}),(0,Z.jsxs)(`div`,{className:`health-suggest__card`,children:[(0,Z.jsx)(`p`,{className:`health-suggest__text`,children:e.suggestion.text}),e.suggestion.action.setup&&!n?(0,Z.jsx)(`p`,{className:`health-suggest__who`,children:W(e.suggestion.action)}):(0,Z.jsx)(Q,{action:e.suggestion.action,dotId:t.id,canSetUp:n,onSetup:r,primary:!0})]})]})]})}function ot(e){let t=$e(e.dot.id);return t.loading?(0,Z.jsx)(it,{}):t.data?(0,Z.jsxs)(Z.Fragment,{children:[t.error!=null&&(0,Z.jsx)(a,{compact:!0,error:t.error,title:`Could not refresh the health. Showing the last answer.`,onRetry:()=>void t.reload(),retrying:t.refreshing}),(0,Z.jsx)(at,{...e,health:t.data,onRetry:()=>void t.reload()})]}):(0,Z.jsx)(`section`,{className:`health`,"aria-label":`Health`,children:(0,Z.jsx)(a,{error:t.error,title:`Could not load the health of this dot`,onRetry:()=>void t.reload(),retrying:t.refreshing})})}var st=e=>`dotteam:${e}`;function ct(e){if(!e||!(e.status in z)||!Array.isArray(e.members))throw Error(`The team answer is not in the shape this page reads.`);return e}function lt(e,t){V(st(e));let n=new Set([e,...t]);return D(st(e),t=>m.dotTeam(e,t).then(ct),{refreshOn:[`run`,`approval`,`dot`],eventFilter:e=>e.type===`run`?n.has(e.run.watchId):e.type===`approval`?n.has(e.approval.watchId):e.type===`dot`&&n.has(e.watchId),throttleMs:1500})}function ut(e){return e<=0?`Nothing waits in the Inbox across the team.`:`${e} ${e===1?`item waits`:`items wait`} in the Inbox across the team.`}function dt(e){return e?.href&&/^(#\/|https?:\/\/)/.test(e.href)?e.href:null}function ft(e){return dt(e.action)??E({name:`dot`,id:e.id})}function pt({m:e}){let t=z[e.status],n=ft(e),r=/^https?:/.test(n)?{target:`_blank`,rel:`noopener noreferrer`}:{};return(0,Z.jsxs)(`li`,{className:`team-row`,"data-status":e.status,"data-away":e.away,children:[(0,Z.jsxs)(`span`,{className:`team-row__name`,children:[(0,Z.jsx)(`span`,{className:`team-row__icon health__word--${e.status}`,"aria-hidden":`true`,children:(0,Z.jsx)(y,{kind:G[e.status],label:t,decorative:!0,size:18})}),(0,Z.jsxs)(`a`,{className:`team-row__link`,href:E({name:`dot`,id:e.id}),children:[e.name,(0,Z.jsxs)(`span`,{className:`sr-only`,children:[`, `,t]})]})]}),(0,Z.jsxs)(`span`,{className:`team-row__detail`,children:[(0,Z.jsx)(`span`,{className:`team-row__job`,children:e.job}),(0,Z.jsx)(`span`,{className:`team-row__status`,children:(0,Z.jsx)(w,{kind:G[e.status],label:t,collapse:`never`})}),(0,Z.jsx)(`span`,{className:`team-row__need`,children:(0,Z.jsx)(J,{text:e.need})})]}),(0,Z.jsx)(`a`,{className:`btn btn--secondary btn--sm team-row__open`,href:n,...r,"aria-label":`Open ${e.name}`,children:(0,Z.jsx)(`span`,{className:`btn__label`,children:`Open`})}),(0,Z.jsx)(`span`,{className:`team-row__chevron`,"aria-hidden":`true`,children:(0,Z.jsx)(v,{size:16})})]})}function mt({children:e}){return e?(0,Z.jsx)(`div`,{className:`team__actions`,role:`group`,"aria-label":`Dot actions`,children:e}):null}function ht({lead:e,team:t,actions:n}){let r=z[t.status];return(0,Z.jsxs)(`section`,{className:`team`,"aria-labelledby":`team-${e.id}`,"data-status":t.status,children:[(0,Z.jsxs)(`header`,{className:`team__head`,children:[(0,Z.jsxs)(`h2`,{id:`team-${e.id}`,className:`team__title`,children:[(0,Z.jsx)(`span`,{className:`team__label`,children:`Team health:`}),` `,(0,Z.jsxs)(`span`,{className:`team__word health__word--${t.status}`,"data-team-status":!0,children:[(0,Z.jsx)(y,{kind:G[t.status],label:r,decorative:!0,size:22}),(0,Z.jsx)(`span`,{children:r})]})]}),(0,Z.jsx)(`p`,{className:`team__reason`,children:(0,Z.jsx)(J,{text:t.statusReason})}),(0,Z.jsx)(mt,{children:n})]}),t.members.length>0&&(0,Z.jsxs)(`div`,{className:`team-table`,children:[(0,Z.jsxs)(`div`,{className:`team-table__head`,"aria-hidden":`true`,children:[(0,Z.jsx)(`span`,{children:`Dot`}),(0,Z.jsx)(`span`,{children:`Job`}),(0,Z.jsx)(`span`,{children:`Status`}),(0,Z.jsx)(`span`,{children:`Needs a person`}),(0,Z.jsx)(`span`,{})]}),(0,Z.jsx)(`ul`,{className:`team-rows list-box`,"aria-label":`Team members`,children:t.members.map(e=>(0,Z.jsx)(pt,{m:e},e.id))})]}),(0,Z.jsxs)(`p`,{className:`team__inbox`,children:[(0,Z.jsx)(`span`,{children:ut(t.inbox)}),t.inbox>0&&(0,Z.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:E({name:`inbox`}),children:(0,Z.jsx)(`span`,{className:`btn__label`,children:`Open the Inbox`})})]})]})}function gt({actions:t}){let n=e(1e3);return(0,Z.jsxs)(`div`,{className:`team-skeleton`,children:[(0,Z.jsx)(`div`,{role:`status`,"aria-busy":`true`,"aria-label":`Loading the team`,children:n&&(0,Z.jsx)(l,{width:240,height:24})}),(0,Z.jsx)(mt,{children:t}),n&&(0,Z.jsx)(l,{width:`100%`,height:180,radius:8})]})}function _t({dot:e,actions:t}){let n=lt(e.id,e.memberIds??[]);return n.loading?(0,Z.jsx)(gt,{actions:t}):n.data?(0,Z.jsxs)(Z.Fragment,{children:[n.error!=null&&(0,Z.jsx)(a,{compact:!0,error:n.error,title:`Could not refresh the team. Showing the last answer.`,onRetry:()=>void n.reload(),retrying:n.refreshing}),(0,Z.jsx)(ht,{lead:e,team:n.data,actions:t})]}):(0,Z.jsxs)(`section`,{className:`team`,"aria-label":`Team health`,children:[(0,Z.jsx)(mt,{children:t}),(0,Z.jsx)(a,{error:n.error,title:`Could not load the health of this team`,onRetry:()=>void n.reload(),retrying:n.refreshing})]})}function vt({dotId:e,quiet:t}){let r=S(),[i,a]=(0,X.useState)(!1);async function o(){a(!0);try{let t=await m.teamDigest(e);r.show({tone:`success`,title:t.duplicate?`The digest was made a moment ago`:`Making the digest`,body:`It shows in the chat with this lead.`,action:{label:`Open the chat`,onClick:()=>T(E({name:`chat`,dotId:e}))}})}catch(e){r.show({tone:`error`,title:`Could not make the digest`,body:e instanceof n?e.message:void 0,action:{label:`Try again`,onClick:()=>void o()}})}finally{a(!1)}}return(0,Z.jsx)(x,{variant:t?`secondary`:`primary`,loading:i,onClick:()=>void o(),children:`Digest now`})}var yt=(e,t)=>`release:${e}:${t}`;function bt(e){if(!e||!(e.answer in Y)||!Array.isArray(e.reasons))throw Error(`The release answer is not in the shape this page reads.`);return e}function xt(e,t){let n=yt(e.id,t);V(n);let r=new Set([e.id,...e.memberIds??[]]);return D(n,n=>m.releaseCall(e.id,t||void 0,n).then(bt),{refreshOn:[`run`,`approval`,`dot`],eventFilter:e=>e.type===`run`?r.has(e.run.watchId):e.type===`approval`?r.has(e.approval.watchId):e.type===`dot`&&r.has(e.watchId),throttleMs:3e3})}function St({reason:e}){if(!e.href)return null;let t=Ce(e.href);return(0,Z.jsxs)(`a`,{className:`btn btn--secondary btn--sm release__open`,href:e.href,...t?{target:`_blank`,rel:`noopener noreferrer`}:{},"aria-label":`Open: ${e.text}`,children:[(0,Z.jsx)(`span`,{className:`btn__label`,children:`Open`}),(0,Z.jsx)(`span`,{className:`release__chevron`,"aria-hidden":`true`,children:(0,Z.jsx)(v,{size:16})})]})}function Ct({lead:e,call:t,onPick:n,memberName:i,onSave:a,saving:o,quiet:s}){let[c,l]=(0,X.useState)(!1),d=c?t.reasons:t.reasons.slice(0,6),f=t.reasons.length>3&&!c,p=`#/trace?${new URLSearchParams({dot:e.id,...t.milestone?{milestone:t.milestone}:{}}).toString()}`,m=t.answer===`no_tickets`&&!t.milestone;return(0,Z.jsxs)(`section`,{className:`release${s?` release--quiet`:``}`,"aria-labelledby":`release-${e.id}`,"data-answer":t.answer,...c?{"data-every-reason":``}:{},children:[(0,Z.jsxs)(`header`,{className:`release__head`,children:[(0,Z.jsxs)(`h2`,{id:`release-${e.id}`,className:`release__title`,children:[(0,Z.jsx)(`span`,{className:`release__title-full`,children:`Release call`}),(0,Z.jsx)(`span`,{className:`release__title-phone`,children:Te(t.milestone)})]}),t.milestones.length>0&&(0,Z.jsx)(`div`,{className:`release__pick`,children:(0,Z.jsx)(u,{label:`Milestone`,className:`release__pick-field`,children:(0,Z.jsx)(r,{value:t.milestone,onChange:e=>n(e.target.value),options:t.milestones.includes(t.milestone)?t.milestones.map(e=>({value:e,label:e})):[{value:t.milestone,label:t.milestone||`No milestone`},...t.milestones.map(e=>({value:e,label:e}))]})})})]}),(0,Z.jsxs)(`p`,{className:`release__answer release__answer--${t.answer}`,"data-release-answer":!0,children:[(0,Z.jsx)(`span`,{className:`release__answer-icon`,"aria-hidden":`true`,children:(0,Z.jsx)(y,{kind:Ee[t.answer],label:Y[t.answer],decorative:!0,size:20})}),(0,Z.jsxs)(`span`,{className:`release__answer-text`,children:[(0,Z.jsxs)(`strong`,{className:`release__word`,children:[Y[t.answer],`.`]}),(0,Z.jsx)(`span`,{className:`release__summary`,children:m?`No milestone is open. Set a milestone on a member tracker to ask.`:t.summary})]})]}),s&&(0,Z.jsxs)(`p`,{className:`release__quiet`,"data-release-quiet":!0,children:[s.replace(/[.\s]+$/,``),`. The answer is from the last results.`]}),d.length>0&&(0,Z.jsx)(`ul`,{className:`release__reasons list-box`,"aria-label":`Reasons`,children:d.map((e,t)=>(0,Z.jsxs)(`li`,{className:`release__reason`,"data-level":e.level,children:[(0,Z.jsx)(`span`,{className:`release__reason-icon`,"aria-hidden":`true`,children:(0,Z.jsx)(y,{kind:we[e.level],label:e.level===`blocker`?`Blocks the release`:`A risk`,decorative:!0,size:16})}),(0,Z.jsx)(`span`,{className:`release__reason-text`,children:(0,Z.jsx)(J,{text:e.text})}),(0,Z.jsx)(St,{reason:e})]},`${e.level}-${e.ref??``}-${t}`))}),(0,Z.jsxs)(`div`,{className:`release__foot`,children:[(0,Z.jsxs)(g,{children:[(0,Z.jsx)(`dl`,{className:`release__counts`,children:xe(t).map(e=>(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`dt`,{children:e.label}),(0,Z.jsx)(`dd`,{children:e.n})]},e.label))}),t.reasons.length>0&&(0,Z.jsx)(`ul`,{className:`release__sources`,children:t.reasons.map((e,t)=>(0,Z.jsxs)(`li`,{children:[e.text,` `,(0,Z.jsxs)(`span`,{className:`release__from`,children:[`From `,i(e.memberId),`.`]})]},`src-${t}`))}),(0,Z.jsx)(`p`,{className:`release__rule`,children:t.rule}),(0,Z.jsx)(`p`,{className:`release__rule`,children:Se(t)}),a&&t.answer!==`no_tickets`&&(0,Z.jsx)(`p`,{className:`release__save`,children:(0,Z.jsx)(x,{size:`sm`,loading:o,onClick:a,children:`Save as a report page`})})]}),(0,Z.jsxs)(`div`,{className:`release__buttons`,children:[f&&(0,Z.jsx)(x,{size:`sm`,className:`release__more`,"aria-expanded":!1,onClick:()=>l(!0),children:`See the reasons`}),(0,Z.jsx)(`a`,{className:`btn btn--secondary btn--sm release__see`,href:p,children:(0,Z.jsx)(`span`,{className:`btn__label`,children:`See every ticket`})})]})]})]})}function wt(){return e(1e3)?(0,Z.jsxs)(`div`,{className:`release-skeleton`,role:`status`,"aria-busy":`true`,"aria-label":`Loading the release call`,children:[(0,Z.jsx)(l,{width:160,height:22}),(0,Z.jsx)(l,{width:`100%`,height:96,radius:8})]}):(0,Z.jsx)(`div`,{role:`status`,"aria-busy":`true`,"aria-label":`Loading the release call`})}function Tt({dot:e,quiet:t}){let[n,r]=(0,X.useState)(``),i=S(),o=A(),[s,c]=(0,X.useState)(!1),l=xt(e,n),u=new Map((o.data??[]).map(e=>[e.id,e.name]));async function d(){c(!0);try{let{page:t}=await m.saveReadiness(e.id,l.data?.milestone??n);i.show({tone:`success`,title:`Saved as a report page`,action:{label:`Open`,onClick:()=>T(E({name:`report`,id:t.id}))}})}catch(e){i.show({tone:`error`,title:`Could not save the report page`,body:e instanceof Error?e.message:void 0})}finally{c(!1)}}return l.loading?(0,Z.jsx)(wt,{}):l.data?(0,Z.jsxs)(Z.Fragment,{children:[l.error!=null&&(0,Z.jsx)(a,{compact:!0,error:l.error,title:`Could not refresh the release call. Showing the last answer.`,onRetry:()=>void l.reload(),retrying:l.refreshing}),(0,Z.jsx)(Ct,{lead:e,call:l.data,onPick:r,memberName:e=>u.get(e)??`a member`,onSave:()=>void d(),saving:s,quiet:t})]}):(0,Z.jsx)(`section`,{className:`release`,"aria-label":`Release call`,children:(0,Z.jsx)(a,{error:l.error,title:`Could not load the release call`,onRetry:()=>void l.reload(),retrying:l.refreshing})})}var Et={flaky_spec:`Flaky test`,env_quirk:`Environment quirk`,convention:`Convention`,decision:`Decision`,note:`Note`};function $({label:e,value:t,empty:n}){return(0,Z.jsxs)(`div`,{className:`dot-brief__row`,children:[(0,Z.jsx)(`dt`,{children:e}),(0,Z.jsx)(`dd`,{className:t?.trim()?void 0:`run-muted`,children:t?.trim()||n})]})}function Dt({dot:e}){let t=[];e.repo&&t.push([`Repository`,`${e.repo.owner}/${e.repo.name} (${e.repo.defaultBranch})${e.repo.pathFilters?.length?`, paths ${e.repo.pathFilters.join(`, `)}`:``}`]),e.tracker&&t.push([`Tracker`,e.tracker.kind===`jira`?`Jira ${e.tracker.projectKeys.join(`, `)}`:e.tracker.kind===`linear`?`Linear ${e.tracker.teamKeys.join(`, `)}`:`GitHub Issues ${(e.tracker.repos?.length?e.tracker.repos:e.repo?[`${e.repo.owner}/${e.repo.name}`]:[]).join(`, `)} ${Ye(e.tracker.labels?.require)}`.trim()]);for(let n of e.repos??[])n.prScope&&t.push([`PR scope`,`${n.repo}: ${Je(n.prScope)}`]);for(let n of Xe(e.repos))t.push([`Run tests`,n]);e.runner.passEnv?.length&&t.push([`Test login`,(0,Z.jsx)(`span`,{className:`run-break`,children:e.runner.passEnv.join(`, `)},`login`)]);let n=ze(e);n&&t.push([`First week`,`until ${M(n.until)}, you OK every PR comment and check`]),e.baseUrl&&t.push([`App URL`,(0,Z.jsx)(`span`,{className:`run-break`,children:e.baseUrl},`u`)]);for(let n of e.probes??[])t.push([n.kind===`browser`?`Site check (browser)`:`Site check`,(0,Z.jsx)(`span`,{className:`run-break`,children:`${n.url}, every ${e.probeIntervalSec}\u00a0s`},n.url)]);for(let n of e.statusPages??[])t.push([`Site status page`,(0,Z.jsx)(`span`,{className:`run-break`,children:n},n)]);return t.push([`Tests run`,`${e.runner.mode}${e.runner.command?`: ${e.runner.command}`:``}`]),e.runner.setup&&t.push([`Setup steps`,(0,Z.jsx)(`span`,{className:`run-break`,children:e.runner.setup},`setup`)]),e.slackChannel&&t.push([`Slack`,e.slackChannel]),e.connections?.length&&t.push([`Apps`,N(e.connections.length,`app`)]),t.push([e.digestEvery===`week`?`Weekly digest`:`Daily digest`,`${e.digestEvery===`week`?`Mondays at `:``}${String(e.digestHour).padStart(2,`0`)}:00 local time`]),(0,Z.jsx)(`dl`,{className:`run-dl`,children:t.map(([e,t],n)=>(0,Z.jsxs)(`div`,{className:`run-dl__row`,children:[(0,Z.jsx)(`dt`,{children:e}),(0,Z.jsx)(`dd`,{children:t})]},`${e}-${n}`))})}function Ot({dotId:e,dot:t}){let n=D(`feed:dot-recent:${e}`,t=>m.feed({dotId:e,limit:8},t),{refreshOn:[`run`],eventFilter:t=>t.type===`run`&&t.run.watchId===e});return(0,Z.jsx)(C,{flush:!0,title:`Recent runs`,actions:(0,Z.jsx)(`a`,{className:`btn btn--ghost btn--sm`,href:E({name:`feed`,dotId:e}),children:(0,Z.jsx)(`span`,{className:`btn__label`,children:`See all`})}),children:n.loading?(0,Z.jsx)(f,{rows:3,label:`Loading runs`}):n.data?n.data.length===0?(0,Z.jsx)(i,{compact:!0,kind:`first-run`,title:t.kind===`lead`?`No digests yet`:`No runs yet`,body:F(t)}):(0,Z.jsx)(`ul`,{className:`run-rows run-rows--flush list-box`,children:n.data.map(e=>(0,Z.jsx)(He,{run:e,showDot:!1},e.id))}):(0,Z.jsx)(a,{compact:!0,error:n.error,title:`Could not load checks`,onRetry:()=>void n.reload(),retrying:n.refreshing})})}function kt({dotId:e}){let t=D(`memory:${e}`,t=>m.listMemory(e,t)),n=t.data??[],r=n.slice(0,5);return(0,Z.jsx)(C,{title:`Memory`,description:n.length?`${N(n.length,`thing`)} this dot keeps in mind between checks.`:void 0,children:t.loading?(0,Z.jsx)(f,{rows:2,label:`Loading memory`}):t.data?n.length===0?(0,Z.jsx)(`p`,{className:`run-muted`,children:`Nothing yet. The dot learns flaky tests, setup quirks and your decisions as it works.`}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`ul`,{className:`dot-memory`,children:r.map(e=>(0,Z.jsxs)(`li`,{className:`dot-memory__item`,children:[(0,Z.jsx)(`span`,{className:`dot-memory__kind`,children:Et[e.kind]??e.kind}),(0,Z.jsx)(`span`,{className:`dot-memory__text`,children:e.text}),(0,Z.jsxs)(`span`,{className:`dot-memory__meta`,children:[e.source===`user`?`From you`:`Learned`,`, `,P(e.createdAt)]})]},e.id))}),n.length>r.length&&(0,Z.jsxs)(`p`,{className:`run-muted dot-memory__more`,children:[N(n.length-r.length,`more item`),` not shown.`]})]}):(0,Z.jsx)(a,{compact:!0,error:t.error,title:`Could not load memory`,onRetry:()=>void t.reload(),retrying:t.refreshing})})}function At({dot:e,open:t,onClose:n}){let r=S(),[i,o]=(0,X.useState)(e.mission),[l,d]=(0,X.useState)(e.notifyWhen),[f,p]=(0,X.useState)(e.mustNot),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(!1);async function y(t){t.preventDefault(),v(!0),g(null);try{let t=await m.updateDot(e.id,{mission:i.trim(),notifyWhen:l.trim(),mustNot:f.trim()});k(ce.dot(e.id),t),O(ce.dots),r.show({tone:`success`,title:`Goal saved`}),n()}catch(e){g(e)}finally{v(!1)}}return(0,Z.jsx)(c,{open:t,onClose:n,title:`Edit ${e.name}`,description:`The goal tells the dot what to protect, when to speak up, and what it must never do.`,children:(0,Z.jsxs)(`form`,{className:`dot-form`,onSubmit:e=>void y(e),children:[h!=null&&(0,Z.jsx)(a,{compact:!0,error:h,title:`Could not save the goal`}),(0,Z.jsx)(u,{label:`Mission`,children:(0,Z.jsx)(s,{"data-autofocus":!0,rows:3,value:i,onChange:e=>o(e.target.value)})}),(0,Z.jsx)(u,{label:`Tell me when`,children:(0,Z.jsx)(s,{rows:2,value:l,onChange:e=>d(e.target.value)})}),(0,Z.jsx)(u,{label:`Never`,children:(0,Z.jsx)(s,{rows:2,value:f,onChange:e=>p(e.target.value)})}),(0,Z.jsxs)(`div`,{className:`dot-form__footer`,children:[(0,Z.jsx)(x,{onClick:n,children:`Cancel`}),(0,Z.jsx)(x,{type:`submit`,variant:`primary`,loading:_,children:`Save goal`})]})]})})}function jt(){return e(1e3)?(0,Z.jsxs)(`div`,{className:`run-skeleton`,role:`status`,"aria-busy":`true`,"aria-label":`Loading the dot`,children:[(0,Z.jsxs)(`div`,{className:`dot-head`,children:[(0,Z.jsx)(l,{width:56,height:56,radius:999}),(0,Z.jsxs)(`div`,{className:`run-skeleton`,children:[(0,Z.jsx)(l,{width:180,height:22}),(0,Z.jsx)(l,{width:120,height:14})]})]}),(0,Z.jsx)(l,{width:`100%`,height:140,radius:8}),(0,Z.jsx)(l,{width:`100%`,height:200,radius:8})]}):(0,Z.jsx)(`div`,{role:`status`,"aria-busy":`true`,"aria-label":`Loading`})}var Mt=`(max-width: 639px)`;function Nt({id:e,stage:r}){let s=ce.dot(e),c=D(s,t=>m.getDot(e,t),{refreshOn:[`run`,`approval`],eventFilter:t=>t.type===`run`?t.run.watchId===e:t.type===`approval`&&t.approval.watchId===e,throttleMs:1500});ae(t=>{t.type===`dot`&&t.watchId===e&&oe(s)&&k(s,e=>se(e,t))},[`dot`]);let{toggle:l,pendingId:u}=Ne(),{restore:f,pendingId:h}=Be(),{isAdmin:g,canEdit:_}=ge(),v=te(Mt),[y,b]=(0,X.useState)(!1),[S,w]=(0,X.useState)(!1),[O,A]=(0,X.useState)(!1),[j,M]=(0,X.useState)(!1),[N,P]=(0,X.useState)(),F=c.data,I=_&&F&&!F.archived?r:void 0,[ue,de]=(0,X.useState)();I!==ue&&(de(I),I&&(P(I),M(!0))),(0,X.useEffect)(()=>{I&&T({name:`dot`,id:e},{replace:!0})},[I,e]);let L=D(`roles`,e=>m.roles(e)),R=$e(e);if(he({title:F?.name,back:{href:E({name:`dots`}),label:`Dots`}}),c.loading)return(0,Z.jsx)(`div`,{className:`page`,children:(0,Z.jsx)(jt,{})});if(!F){let e=c.error instanceof n&&c.error.status===404;return(0,Z.jsx)(`div`,{className:`page`,children:e?(0,Z.jsx)(i,{kind:`filtered`,title:`Dot not found`,body:`It may have been archived, or the link is wrong.`,action:(0,Z.jsx)(`a`,{href:E({name:`dots`}),children:`Go to Dots`})}):(0,Z.jsx)(a,{error:c.error,title:`Could not load this dot`,onRetry:()=>void c.reload(),retrying:c.refreshing})})}let pe=fe(R.data,me(F)),z=F.kind===`lead`,B=L.data?Pe(F,L.data):L.error&&F.role?le[F.role]??F.role:null,V=()=>{P(void 0),M(!0)},H=z&&R.data?.status===`not_watching`?R.data.statusReason:null,U=(0,Z.jsxs)(`a`,{className:`btn ${z?`btn--secondary`:`btn--primary`} btn--md`,href:E({name:`chat`,dotId:F.id}),children:[(0,Z.jsx)(`span`,{className:`btn__icon`,children:(0,Z.jsx)(ne,{size:14})}),(0,Z.jsx)(`span`,{className:`btn__label`,children:`Ask`})]}),W=F.archived?g&&(0,Z.jsx)(x,{variant:`primary`,loading:h===F.id,onClick:()=>void f(F),children:`Restore dot`}):(0,Z.jsx)(x,{icon:F.paused?(0,Z.jsx)(d,{size:14}):void 0,loading:u===F.id,onClick:()=>void l(F),children:F.paused?`Resume`:`Pause`}),G=_&&!F.archived&&(0,Z.jsx)(x,{icon:(0,Z.jsx)(o,{size:14}),onClick:V,children:`Settings`}),K=g&&(0,Z.jsx)(x,{variant:`danger`,icon:(0,Z.jsx)(ee,{size:14}),onClick:()=>b(!0),children:`Remove dot`}),q=z?(0,Z.jsxs)(Z.Fragment,{children:[!F.archived&&(0,Z.jsx)(vt,{dotId:F.id,quiet:H!==null}),U,G,F.archived&&W]}):null;return(0,Z.jsxs)(`div`,{className:`page dot-page${z?` dot-page--lead`:``}`,children:[c.error!=null&&(0,Z.jsx)(a,{compact:!0,error:c.error,title:`Could not refresh. Showing the last list.`,onRetry:()=>void c.reload(),retrying:c.refreshing}),z&&v?(0,Z.jsx)(`h1`,{className:`sr-only`,children:F.name}):(0,Z.jsxs)(`header`,{className:`dot-head${z?` dot-head--lead`:``}`,children:[(0,Z.jsx)(ie,{name:p(F),state:F.paused?`paused`:pe,size:56}),(0,Z.jsxs)(`div`,{className:`dot-head__main`,children:[(0,Z.jsx)(`h1`,{className:`dot-head__name`,children:F.name}),(0,Z.jsxs)(`div`,{className:`dot-head__meta`,children:[z?(0,Z.jsx)(`span`,{"data-lead-line":!0,children:Fe(F)}):(0,Z.jsxs)(Z.Fragment,{children:[B&&(0,Z.jsx)(`span`,{"data-role":!0,children:B}),F.pendingApprovals>0&&(0,Z.jsxs)(`a`,{href:E({name:`inbox`}),children:[F.pendingApprovals,` to review`]}),(0,Z.jsx)(We,{dot:F,onChange:_?()=>{P(`reviewer`),M(!0)}:void 0}),F.listening!==`none`&&(0,Z.jsx)(ke,{dot:F})]}),(0,Z.jsx)(Me,{dot:F})]})]}),(0,Z.jsx)(`div`,{className:`dot-head__actions`,role:`group`,"aria-label":`Dot actions`,children:z?q:(0,Z.jsxs)(Z.Fragment,{children:[U,W,F.repo&&!F.archived&&(0,Z.jsx)(x,{icon:(0,Z.jsx)(t,{size:14}),onClick:()=>A(!0),children:`Check a PR`}),_&&(0,Z.jsx)(x,{icon:(0,Z.jsx)(re,{size:14}),onClick:()=>w(!0),children:`Edit goal`}),G,K]})})]}),F.archived&&(0,Z.jsxs)(`p`,{className:`run-banner`,role:`status`,children:[`Archived. This dot is not watching, and it is hidden from the sidebar. Its checks and history are kept.`,` `,g?`Restore it to start watching again.`:`Your localdost admin can restore it.`]}),F.paused&&!F.archived&&(0,Z.jsx)(`p`,{className:`run-banner`,role:`status`,children:`Paused. This dot ignores PRs, tickets and site problems until you resume it.`}),!z&&F.listening===`none`&&(0,Z.jsx)(ke,{dot:F,variant:`banner`}),!z&&(0,Z.jsx)(Oe,{dot:F,variant:`banner`}),z?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(_t,{dot:F,actions:v?q:void 0}),(0,Z.jsx)(Tt,{dot:F,quiet:H})]}):(0,Z.jsx)(ot,{dot:F,canSetUp:_&&!F.archived,onSetup:e=>{P(e===`site`?`watcher`:e===`tracker`?`analyst`:void 0),M(!0)}}),(0,Z.jsxs)(`div`,{className:`dot-grid`,children:[(0,Z.jsx)(C,{title:`Goal`,className:`dot-grid__wide`,children:(0,Z.jsxs)(`dl`,{className:`dot-brief`,children:[(0,Z.jsx)($,{label:`Mission`,value:F.mission,empty:`No mission yet. Edit the goal to say what should stay true.`}),(0,Z.jsx)($,{label:`Tell me when`,value:F.notifyWhen,empty:`Not set. The dot uses its role defaults.`}),(0,Z.jsx)($,{label:`Never`,value:F.mustNot,empty:`Not set.`}),F.instructions?.trim()&&(0,Z.jsx)($,{label:`Instructions`,value:F.instructions,empty:``})]})}),(0,Z.jsx)(`div`,{className:`dot-grid__wide`,children:(0,Z.jsx)(Ve,{dotId:F.id})}),(0,Z.jsx)(`div`,{className:`dot-grid__wide`,children:(0,Z.jsx)(Ot,{dotId:F.id,dot:F})}),!z&&(0,Z.jsx)(C,{title:`Sources`,children:(0,Z.jsx)(Dt,{dot:F})}),(0,Z.jsx)(kt,{dotId:F.id}),(0,Z.jsx)(qe,{dot:F})]}),z&&(0,Z.jsxs)(`div`,{className:`dot-manage`,role:`group`,"aria-label":`Manage this dot`,children:[!F.archived&&W,K]}),S&&(0,Z.jsx)(At,{dot:F,open:S,onClose:()=>w(!1)}),O&&(0,Z.jsx)(be,{dot:F,open:O,onClose:()=>A(!1)}),z?(0,Z.jsx)(Re,{open:j,lead:F,onClose:()=>M(!1),onSaved:e=>k(s,()=>e)}):(0,Z.jsx)(Ie,{open:j,openStage:N,dot:F,onClose:()=>M(!1),onSaved:e=>k(s,()=>e),onRemoved:()=>T({name:`dots`})}),(0,Z.jsx)(Le,{open:y,dot:F,onClose:()=>b(!1),onRemoved:()=>T({name:`dots`})})]})}export{Mt as LEAD_PHONE_QUERY,Nt as default};
2
+ //# sourceMappingURL=DotDetail-DskS3NWe.js.map
@@ -0,0 +1 @@
1
+ .mu-cap{align-items:center;gap:var(--space-2);margin:0 0 var(--space-3);color:var(--attention-fg);font-size:var(--text-sm);display:flex}.mu-cap .status-icon{flex:none}.mu-wrap{min-width:0;overflow-x:auto}.mu-table{border-collapse:collapse;width:100%;font-size:var(--text-sm);font-variant-numeric:tabular-nums}.mu-table th,.mu-table td{padding:var(--space-2) var(--space-2);border-bottom:var(--hairline);white-space:nowrap}.mu-table th[scope=row],.mu-table th[scope=col]:first-child{text-align:left}.mu-table thead th{font-size:var(--text-xs);font-weight:var(--weight-medium);color:var(--text-3)}.mu-table thead tr:first-child th{text-align:center;border-bottom:var(--hairline)}.mu-table thead tr:first-child td{border-bottom:0}.mu-table thead tr:last-child th:not(:first-child),.mu-table td{text-align:right}.mu-table tbody th{font-weight:var(--weight-medium)}.mu-table td{color:var(--text-2)}.mu-table tfoot th,.mu-table tfoot td{color:var(--text);font-weight:var(--weight-medium);border-bottom:0}.mu-note{margin:var(--space-2) 0 0;color:var(--text-3);font-size:var(--text-xs)}.team,.team-skeleton{gap:var(--space-3);margin-bottom:var(--space-4);display:grid;container:team/inline-size}.team__head{gap:var(--space-1);min-width:0;display:grid}.team__title{align-items:center;column-gap:var(--space-2);font-size:var(--text-xl);font-weight:var(--weight-semibold);line-height:var(--leading-tight);flex-wrap:wrap;display:flex}.team__actions{gap:var(--space-2);margin-top:var(--space-1);flex-wrap:wrap;display:flex}.team__actions .btn{white-space:nowrap}.team__word{align-items:center;gap:var(--space-2);white-space:nowrap;display:inline-flex}.team__reason{color:var(--text-2);font-size:var(--text-md);overflow-wrap:anywhere;text-wrap:pretty}.team-table{background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);overflow:hidden}.team-table__head,.team-row{align-items:start;column-gap:var(--space-3);padding:var(--space-3) var(--space-4);grid-template-columns:minmax(10rem,1.2fr) minmax(8rem,1fr) 7.5rem minmax(12rem,2.2fr) 4.5rem;display:grid}.team-table__head{padding-block:var(--space-2);background:var(--surface-2);border-bottom:var(--hairline);color:var(--text-3);font-size:var(--text-sm);font-weight:var(--weight-medium);align-items:center}.team-rows{margin:0;padding:0;list-style:none}.team-row+.team-row{border-top:var(--hairline)}.team-row__detail{display:contents}.team-row__name{align-items:flex-start;gap:var(--space-2);min-width:0;font-weight:var(--weight-semibold);display:inline-flex}.team-row__icon{flex:none;padding-top:1px;display:inline-flex}.team-row__link{color:inherit;overflow-wrap:anywhere;text-decoration:none}.team-row__link:hover{text-decoration:underline}.team-row__job,.team-row__need{min-width:0;font-size:var(--text-md);overflow-wrap:anywhere;text-wrap:pretty}.team-row__job{color:var(--text-2)}.team-row__status{font-size:var(--text-md);white-space:nowrap}.team-row__open{white-space:nowrap;flex:none}.team-row__chevron{display:none}.team-row[data-away] .team-row__name,.team-row[data-away] .team-row__need{color:var(--text-3)}.team__inbox{align-items:center;gap:var(--space-2) var(--space-3);color:var(--text-2);font-size:var(--text-md);flex-wrap:wrap;display:flex}.team__inbox .btn{white-space:nowrap;flex:none}@container team (width<=639px){.team__label{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.team-table__head{display:none}.team-row{row-gap:var(--space-1);padding:var(--space-3);grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"name chevron""detail detail";position:relative}.team-row__name{grid-area:name}.team-row__detail{padding-left:calc(18px + var(--space-2));font-size:var(--text-md);overflow-wrap:anywhere;text-wrap:pretty;grid-area:detail;display:block}.team-row__job,.team-row__need{display:inline}.team-row__job{color:var(--text-3)}.team-row__job:after{content:" · "}.team-row__status,.team-row__open{display:none}.team-row__chevron{color:var(--text-3);grid-area:chevron;align-self:center;display:inline-flex}.team-row__link:after{content:"";position:absolute;inset:0}}
@@ -0,0 +1 @@
1
+ .dot-stage{align-items:center;gap:var(--space-1) var(--space-2);text-transform:none;letter-spacing:normal;flex-wrap:wrap;min-width:0;display:inline-flex}.dot-stage__dot{align-items:center;gap:var(--space-1);min-width:0;font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text);display:inline-flex}.dot-stage__name{overflow-wrap:anywhere;min-width:0;color:inherit}a.dot-stage__name:hover{text-decoration:underline}.dot-stage__stage{z-index:1;align-items:center;gap:var(--space-1);font-size:var(--text-xs);font-weight:var(--weight-regular);color:var(--text-3);display:inline-flex;position:relative}.dot-stage__stage:hover{color:var(--accent);text-decoration:underline}
@@ -0,0 +1,2 @@
1
+ import{S as e,g as t,mn as n,x as r,xn as i,yn as a}from"./ui-DcmhYyYp.js";import{c as o,t as s}from"./router-W6nZsQ33.js";import{a as c}from"./store-IqrqHuFR.js";import{t as l}from"./data-CmXvx3Mj.js";import{C as u}from"./format-BBZ8vFyT.js";var d=n();function f(e,t,n=a[e]){return t?`${n} for ${t}`:n}function p({dotId:n,dotName:o,showDot:u=!0,dotLink:p=!1,stage:m,job:h,state:g=`ok`,size:_=20,className:v}){let y=c(l.dots)?.find(e=>e.id===n),b=o??y?.name;if(!(u&&b)&&!m)return null;let x=h??(m?a[m]:``);return(0,d.jsxs)(`span`,{className:[`dot-stage`,v??``].filter(Boolean).join(` `),children:[u&&b&&(0,d.jsxs)(`span`,{className:`dot-stage__dot`,children:[(0,d.jsx)(r,{name:e({id:n,mascot:y?.mascot}),size:_,decorative:!0}),p?(0,d.jsx)(`a`,{className:`dot-stage__name`,href:s({name:`dot`,id:n}),children:b}):(0,d.jsx)(`span`,{className:`dot-stage__name`,children:b})]}),m&&(0,d.jsxs)(`a`,{className:`dot-stage__stage`,"data-stage":m,href:s({name:`dot`,id:n,stage:m}),"aria-label":f(m,b,x),title:`Settings for ${x}`,children:[(0,d.jsx)(r,{name:i[m],state:t(g),size:Math.round(_*.7),decorative:!0}),(0,d.jsx)(`span`,{className:`dot-stage__stage-name`,children:x})]})]})}function m({run:e,...t}){let n=u(e);return(0,d.jsx)(p,{dotId:e.watchId,dotName:e.dotName,stage:o(e),...n?{job:n}:{},...t})}export{m as n,p as t};
2
+ //# sourceMappingURL=DotStage-CtMNzCN3.js.map
@@ -0,0 +1,2 @@
1
+ import{An as e,Cn as t,G as n,H as r,It as i,Mn as a,N as o,P as s,Pt as c,R as l,S as u,Tn as d,U as f,Vn as p,Wn as m,mn as h,nt as g,pn as _,q as v,rt as y,un as b,v as x,x as S,y as C}from"./ui-DcmhYyYp.js";import{r as w,t as T}from"./router-W6nZsQ33.js";import{i as E,n as ee,r as te}from"./store-IqrqHuFR.js";import{a as ne,c as re,t as ie}from"./data-CmXvx3Mj.js";import{s as D,v as O,y as k}from"./format-BBZ8vFyT.js";import{Ct as A,Dt as j,E as M,Mt as N,Nt as P,Ot as F,Rt as I,St as L,h as R,kt as z,mn as B,xt as V,yt as H}from"./index-B6qKm1NW.js";import{a as ae,m as U}from"./phoneApi-BG_1-M-D.js";import{t as W}from"./NoBreakNames-Csxdqdt6.js";import{n as G,t as K}from"./ListeningLine-BRFNaczY.js";import{p as q}from"./ModelChoices-BxO1zyyr.js";import{n as J,t as oe}from"./usePauseDot-BV60ZVy1.js";import{i as Y}from"./LeadDialog-N3Zul9Rw.js";/* empty css */import{t as se}from"./NewDotDialog-CDPUWmgN.js";/* empty css */var X=m(p(),1),Z=h();function ce({health:e,status:t,href:n,pending:r}){if(!e&&r)return(0,Z.jsx)(`span`,{className:`health-word health-word--pending`,"data-health-word":`pending`,"aria-hidden":`true`});let i=e?V[e.status]:C[t],a=e?L[e.status]:b[t];return(0,Z.jsx)(`a`,{className:`health-word`,href:n,"data-health-word":e?.status??`unknown`,children:(0,Z.jsx)(x,{kind:i,label:a,collapse:`never`,className:`dot-row__status`})})}function le({dot:e,onTogglePause:t,pausing:n,stale:r,health:i,healthPending:a}){let o=I(e),s=T({name:`dot`,id:e.id}),l=`dot-${e.id}-name`,d=i?j(i.watching,A(i)):!a&&e.lastRun?{label:``,when:k(e.lastRun.createdAt),runId:e.lastRun.id}:null,f=i&&i.status!==`healthy`&&i.statusReason?i.statusReason:null,p=i?.watching.note??null;return(0,Z.jsxs)(`li`,{className:`dot-row${e.paused?` is-paused`:``}`,"aria-labelledby":l,children:[(0,Z.jsx)(S,{name:u(e),state:e.paused?`paused`:P(i,o),size:40,decorative:!0}),(0,Z.jsxs)(`div`,{className:`dot-row__main`,children:[(0,Z.jsxs)(`div`,{className:`dot-row__head`,children:[(0,Z.jsx)(`a`,{id:l,className:`dot-row__name`,href:s,children:e.name}),(0,Z.jsx)(ce,{health:i,status:o,href:s,pending:a}),e.role&&(0,Z.jsx)(`span`,{className:`dot-row__role`,children:D[e.role]??e.role})]}),(0,Z.jsx)(`p`,{className:`dot-row__finding${f?` dot-row__finding--reason`:``}${f||e.latestFinding?``:` run-muted`}`,children:f?(0,Z.jsx)(W,{text:f}):e.latestFinding??p??(e.lastRun?`No findings yet.`:`No checks yet. The first one starts when a PR or a ticket comes in.`)}),(0,Z.jsxs)(`div`,{className:`dot-row__meta`,children:[e.kind===`lead`&&(0,Z.jsx)(`span`,{className:`dot-row__scope`,children:N(e)}),(0,Z.jsx)(K,{dot:e}),(0,Z.jsx)(J,{dot:e}),(0,Z.jsx)(G,{dot:e}),e.pendingApprovals>0&&(0,Z.jsxs)(`a`,{className:`dot-row__approvals`,href:T({name:`inbox`}),children:[e.pendingApprovals,` to review`]}),d&&(d.runId?(0,Z.jsxs)(`a`,{className:`dot-row__last`,href:T({name:`run`,id:d.runId}),children:[`Last check `,d.when]}):(0,Z.jsxs)(`span`,{className:`dot-row__last`,children:[`Last check `,d.when]}))]})]}),(0,Z.jsxs)(`div`,{className:`dot-row__actions`,role:`group`,"aria-label":`Actions for ${e.name}`,children:[(0,Z.jsxs)(`a`,{className:`btn btn--secondary btn--sm`,href:T({name:`chat`,dotId:e.id}),children:[(0,Z.jsx)(`span`,{className:`btn__icon`,children:(0,Z.jsx)(g,{size:14})}),(0,Z.jsx)(`span`,{className:`btn__label`,children:`Ask`})]}),!r&&(0,Z.jsx)(_,{size:`sm`,icon:e.paused?(0,Z.jsx)(c,{size:14}):void 0,loading:n,onClick:()=>t(e),children:e.paused?`Resume`:`Pause`}),(0,Z.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:s,children:(0,Z.jsx)(`span`,{className:`btn__label`,children:`Open`})})]})]})}var Q=`katalon-true-platform`;function $(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ue({existing:e}){let t=v(),[n,r]=(0,X.useState)(``),[i,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(null),f=e=>te(Y,t=>[...(t??[]).filter(t=>t.id!==e.id),e]),p=async e=>{if(e.preventDefault(),!i){if(u(null),!$(n.trim()))return u(`Use the full address, starting with https://.`);c(!0);try{let e=await a(`/connections/presets/${Q}`,{method:`POST`,body:{params:{url:n.trim()}}});f(e),e.status===`connected`?t.show({title:`True Platform connected`,body:`${e.tools.length} tools listed. Attach it to a dot in Settings to use it.`,tone:`success`}):u(`Saved, but the server did not answer: ${e.error??`no reason given`}`)}catch(e){u(q(e))}finally{c(!1)}}},m=async()=>{if(e&&!i){c(!0),u(null);try{let t=await d.refreshConnection(e.id);f(t),t.status!==`connected`&&u(t.error??`The server did not answer.`)}catch(e){u(q(e))}finally{c(!1)}}};return e?(0,Z.jsxs)(`div`,{className:`ob-check__form`,children:[(0,Z.jsx)(`p`,{className:`ob-error`,role:`alert`,children:l??e.error??`The server did not answer.`}),(0,Z.jsx)(_,{size:`sm`,variant:`secondary`,loading:i,onClick:()=>void m(),children:`Check again`})]}):(0,Z.jsxs)(`form`,{className:`ob-check__form`,onSubmit:e=>void p(e),noValidate:!0,children:[(0,Z.jsx)(o,{label:`Katalon MCP server URL`,error:l,children:(0,Z.jsx)(s,{type:`url`,inputMode:`url`,value:n,onChange:e=>r(e.target.value),placeholder:`https://mcp.example.com/mcp`,autoComplete:`off`,spellCheck:!1})}),(0,Z.jsx)(_,{size:`sm`,variant:`secondary`,type:`submit`,loading:i,"aria-label":`Connect True Platform`,children:`Connect`})]})}function de(){let n=R(),r=re(),i=E(Y,e=>d.listConnections(e),{refreshOn:[`connection`],throttleMs:500}),[a,o]=(0,X.useState)(!1),s=e(),c=E(s?null:ae,e=>U.state(e)),l=s||c.error instanceof t&&c.error.status===403,u=n.view?.progress;if(!u||u.checklistHidden||u.status!==`done`&&u.status!==`dismissed`)return null;let f=r.data?.services??[],p=e=>{let t=f.find(t=>t.key===e)?.state;return t===`ready`||!!n.view?.demo&&t===`demo`},m=c.data?.devices.filter(e=>e.viaInvite).length??0,h=(i.data??[]).find(e=>e.preset===Q),g=M(u,{modelReady:p(`model`),githubReady:p(`github`),trackerReady:p(`linear`)||p(`jira`)||u.tracker?.kind===`github`,slackReady:p(`slack`),platformReady:h?.status===`connected`,teammates:m}).filter(e=>e.key!==`invite`||!l),v=g.filter(e=>!e.done).length,b=async()=>{o(!0);try{await n.save({...u,checklistHidden:!0})}catch{o(!1)}};return(0,Z.jsxs)(`section`,{className:`ob-card`,"aria-labelledby":`ob-card-title`,children:[(0,Z.jsxs)(`header`,{className:`ob-card__head`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{id:`ob-card-title`,className:`ob-card__title`,children:v?`Next steps`:`All set`}),(0,Z.jsx)(`p`,{className:`ob-card__sub num`,children:v?`${g.length-v} of ${g.length} done. Pick up any step where you left it.`:`Every setup step is done.`})]}),(0,Z.jsx)(_,{size:`sm`,variant:`ghost`,loading:a,onClick:()=>void b(),children:`Hide`})]}),(0,Z.jsx)(`ul`,{className:`ob-check`,"aria-label":`Setup steps`,children:g.map(e=>(0,Z.jsxs)(`li`,{className:`ob-check__item${e.done?` is-done`:``}${e.key===`platform`&&!e.done?` has-form`:``}`,"data-item":e.key,children:[(0,Z.jsx)(`span`,{className:`ob-check__mark`,"aria-hidden":`true`,children:e.done?(0,Z.jsx)(y,{size:14}):null}),(0,Z.jsxs)(`span`,{className:`ob-check__label`,children:[e.label,(0,Z.jsx)(`span`,{className:`sr-only`,children:e.done?`, done`:`, not done`})]}),!e.done&&e.key!==`platform`&&(0,Z.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:e.href,children:(0,Z.jsxs)(`span`,{className:`btn__label`,children:[e.action,(0,Z.jsxs)(`span`,{className:`sr-only`,children:[`: `,e.label]})]})}),!e.done&&e.key===`platform`&&(0,Z.jsx)(ue,{existing:h}),e.done&&e.key===`value`&&(0,Z.jsx)(`a`,{className:`btn btn--ghost btn--sm`,href:e.href,children:(0,Z.jsx)(`span`,{className:`btn__label`,children:`Open`})})]},e.key))})]})}function fe({create:e,repo:t}){let a=ne(),{isAdmin:o}=B(),{toggle:s,pendingId:c}=oe(),u=H(),d=a.data??[],p=d.filter(e=>e.kind!==`lead`),m=p.filter(e=>F(u.byId[e.id],I(e))).length,h=p.filter(e=>z(u.byId[e.id])).length,g=p.reduce((e,t)=>e+t.pendingApprovals,0),v=(0,X.useRef)(null),y=()=>w(T({name:`dots`,create:!0}));return(0,Z.jsxs)(`div`,{className:`page`,children:[(0,Z.jsxs)(`header`,{className:`page__header`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h1`,{className:`page__title`,children:`Dots`}),d.length>0&&(0,Z.jsxs)(`p`,{className:`page__subtitle num`,children:[O(d.length,`dot`),m?`, ${m} need${m===1?`s`:``} you`:h?``:`, all quiet`,h?`, ${h} ${h===1?`needs`:`need`} a fix on Setup`:``,g?`, ${g} to review`:``]})]}),o&&(0,Z.jsx)(`div`,{className:`page__actions`,children:(0,Z.jsx)(_,{variant:`primary`,icon:(0,Z.jsx)(i,{size:16}),onClick:y,children:`New dot`})})]}),o&&(0,Z.jsx)(de,{}),a.loading?(0,Z.jsx)(l,{rows:4,label:`Loading dots`,since:a.startedAt}):a.error&&!a.data?(0,Z.jsx)(r,{error:a.error,title:`Could not load your dots`,onRetry:()=>void a.reload(),retrying:a.refreshing}):d.length===0?(0,Z.jsx)(n,{kind:`first-run`,art:(0,Z.jsx)(S,{name:`pip`,state:`ok`,size:72,decorative:!0}),title:o?`Create your first dot`:`No dots yet`,body:o?`A dot is an always-on QA agent. It watches a repo, a ticket queue, or a live URL, runs tests, and tells you what it found.`:`A dot is an always-on QA agent. Ask your localdost admin to create the first one.`,action:o?(0,Z.jsxs)(`div`,{className:`page__actions`,children:[(0,Z.jsx)(`a`,{className:`btn btn--primary btn--md`,href:`#/welcome`,children:(0,Z.jsx)(`span`,{className:`btn__label`,children:`Start guided setup`})}),(0,Z.jsx)(_,{icon:(0,Z.jsx)(i,{size:16}),onClick:y,children:`New dot`})]}):void 0}):(0,Z.jsxs)(Z.Fragment,{children:[a.error!=null&&(0,Z.jsx)(r,{compact:!0,error:a.error,title:`Could not refresh. Showing the last loaded list.`,onRetry:()=>void a.reload(),retrying:a.refreshing}),(0,Z.jsx)(`ul`,{className:`rows dot-rows`,"aria-label":`Dots`,children:d.map(e=>(0,Z.jsx)(le,{dot:e,onTogglePause:e=>void s(e),pausing:c===e.id,stale:f(a.error),health:u.byId[e.id],healthPending:!u.settled},e.id))})]}),(0,Z.jsx)(se,{open:!!e&&o,repo:t,onClose:()=>{let e=v.current;v.current=null,w(T(e?{name:`dot`,id:e}:{name:`dots`}),{replace:!0})},onSaved:e=>{ee(ie.dots),v.current=e.id}})]})}export{fe as default};
2
+ //# sourceMappingURL=Dots-BqCsS34m.js.map
@@ -0,0 +1,2 @@
1
+ import{Cn as e,E as t,G as n,H as r,L as i,R as a,Tn as o,Vn as s,W as c,Wn as l,b as u,mn as d,v as f}from"./ui-DcmhYyYp.js";import{t as p}from"./router-W6nZsQ33.js";import{i as m}from"./store-IqrqHuFR.js";import{_ as h,f as g,i as _,p as v,y}from"./format-BBZ8vFyT.js";import{on as b}from"./index-B6qKm1NW.js";import{n as x}from"./authedMedia-BTYt_tyu.js";import{t as S}from"./TestRows-wh03T5Li.js";import{l as C,o as w}from"./releaseNotesModel-A1Rtv3cV.js";var T=l(s(),1);async function E(e){try{return await navigator.clipboard.writeText(e),!0}catch{let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n;try{n=document.execCommand(`copy`)}catch{n=!1}return t.remove(),n}}var D=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`;function O(e){return e.tests?[e.truncated?`${D(e.tests,`test`)} (the first ${e.shown} listed)`:D(e.tests,`test`),D(e.steps,`step`),D(e.screenshots,`screenshot`),D(e.videos,`video`)].join(`, `):`No tests ran`}function k(e){return JSON.stringify(e,null,2)}function A(e){return e===0?`No token, cookie value or password was found in the text of this run.`:`${D(e,`value`)} that looked like a token, a cookie or a password ${e===1?`was`:`were`} hidden as [redacted].`}var j=d();function M({pack:e}){let[t,n]=(0,T.useState)(`idle`),r=(0,T.useRef)(void 0);return(0,T.useEffect)(()=>()=>clearTimeout(r.current),[]),(0,j.jsx)(`span`,{className:`ep-copy`,role:`status`,children:(0,j.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:()=>{E(k(e)).then(e=>{n(e?`copied`:`failed`),clearTimeout(r.current),r.current=setTimeout(()=>n(`idle`),2500)})},children:t===`copied`?`Copied`:t===`failed`?`Could not copy`:`Copy JSON`})})}function N({file:e,title:t}){let{src:n,error:a}=x(e.url);return a?(0,j.jsx)(r,{compact:!0,error:a,title:`Could not load this video`}):n?(0,j.jsx)(`video`,{className:`ep-video`,controls:!0,muted:!0,playsInline:!0,preload:`metadata`,src:n,"aria-label":`Video of ${t}`}):(0,j.jsx)(i,{width:`100%`,height:`var(--tap)`})}function P(e){let t=e.currentTarget.parentElement;t&&t.scrollWidth>t.clientWidth&&(t.scrollLeft=(t.scrollWidth-t.clientWidth)/2)}function F({step:e,title:t}){let n=e.screenshot,{src:r,error:a}=x(n?.url);return n?a?(0,j.jsx)(`p`,{className:`ep-step__none`,children:`Could not load this screenshot.`}):r?(0,j.jsxs)(`div`,{className:`ep-shotbox`,children:[(0,j.jsx)(`a`,{className:`ep-shot`,href:r,target:`_blank`,rel:`noreferrer noopener`,tabIndex:-1,children:(0,j.jsx)(`img`,{className:`ep-shot__img`,src:r,alt:`${t}, step ${e.n}: ${e.step}`,onLoad:P})}),(0,j.jsx)(`a`,{className:`ep-shot__open`,href:r,target:`_blank`,rel:`noreferrer noopener`,"aria-label":`Open the screenshot of step ${e.n} of ${t} full size`,children:`Full size`})]}):(0,j.jsx)(i,{width:`100%`,height:160,radius:8}):(0,j.jsx)(`p`,{className:`ep-step__none`,children:`No screenshot for this step.`})}function I({test:e,index:t}){let n=S[e.status],r=`ep-test-${t}`,i=h(e.title);return(0,j.jsxs)(`section`,{className:`ep-test`,"aria-labelledby":r,children:[(0,j.jsxs)(`h2`,{id:r,className:`ep-test__title`,children:[(0,j.jsx)(u,{kind:e.status,label:n.label}),(0,j.jsx)(`span`,{className:`ep-test__name`,children:i})]}),(0,j.jsxs)(`p`,{className:`ep-test__meta`,children:[n.label,` in `,v(e.durationMs),e.video?` · video ${g(e.video.size)}`:``]}),e.error&&(0,j.jsx)(`p`,{className:`ep-test__error`,children:b(e.error)}),e.errorDetails&&(0,j.jsx)(c,{className:`ep-test__details`,children:(0,j.jsx)(`pre`,{className:`ep-test__output`,children:e.errorDetails})}),e.video?(0,j.jsx)(N,{file:e.video,title:i}):(0,j.jsx)(`p`,{className:`ep-muted`,children:`No video for this test.`}),e.steps.length>0?(0,j.jsx)(`ol`,{className:`ep-steps`,"aria-label":`Steps of ${i}`,children:e.steps.map(e=>(0,j.jsxs)(`li`,{className:`ep-step${e.failed?` ep-step--failed`:``}`,children:[(0,j.jsxs)(`p`,{className:`ep-step__text`,children:[(0,j.jsx)(`span`,{className:`ep-step__n num`,children:e.n}),(0,j.jsx)(`span`,{className:`ep-step__name`,children:e.step}),e.failed&&(0,j.jsx)(f,{kind:`failed`,label:`Failed here`,collapse:`never`,className:`ep-step__failed`})]}),(0,j.jsx)(F,{step:e,title:i})]},e.n))}):(0,j.jsx)(`p`,{className:`ep-muted`,children:`This test left no screenshots.`})]})}function L({pack:e}){let{issue:r,pr:i,verdict:a}=e;return(0,j.jsxs)(`div`,{className:`page ep qd-touch`,children:[(0,j.jsxs)(`header`,{className:`page__header`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h1`,{className:`page__title`,children:`Evidence pack`}),(0,j.jsxs)(`p`,{className:`page__subtitle`,children:[e.run.kindLabel,` on `,e.run.dot.name,`, `,y(e.run.startedAt),`.`]})]}),(0,j.jsxs)(`div`,{className:`page__actions ep-actions`,children:[(0,j.jsx)(M,{pack:e}),(0,j.jsx)(`a`,{className:`link-btn`,href:p({name:`run`,id:e.run.id}),children:`Open the check`})]})]}),(0,j.jsx)(`section`,{className:`ep-summary`,"aria-label":`Summary`,children:(0,j.jsxs)(`dl`,{className:`ep-facts`,children:[(0,j.jsxs)(`div`,{className:`ep-fact`,children:[(0,j.jsx)(`dt`,{children:`Issue`}),(0,j.jsxs)(`dd`,{children:[(0,j.jsxs)(`span`,{className:`ep-line`,children:[(0,j.jsx)(t,{source:w(r.tracker),refKey:C(r.key),href:r.url??void 0}),r.title&&(0,j.jsx)(`span`,{className:`ep-line__title`,children:r.title})]}),r.milestone&&(0,j.jsxs)(`span`,{className:`ep-line__sub`,children:[`Milestone `,r.milestone]})]})]}),e.moreIssues.length>0&&(0,j.jsxs)(`div`,{className:`ep-fact`,children:[(0,j.jsx)(`dt`,{children:`Other issues`}),(0,j.jsx)(`dd`,{children:e.moreIssues.map(e=>(0,j.jsxs)(`span`,{className:`ep-line`,children:[(0,j.jsx)(t,{source:w(e.tracker),refKey:C(e.key),href:e.url??void 0}),e.title&&(0,j.jsx)(`span`,{className:`ep-line__title`,children:e.title})]},e.ref))})]}),i&&(0,j.jsxs)(`div`,{className:`ep-fact`,children:[(0,j.jsx)(`dt`,{children:`Pull request`}),(0,j.jsx)(`dd`,{children:(0,j.jsxs)(`span`,{className:`ep-line`,children:[(0,j.jsx)(t,{source:`github-pr`,refKey:`#${i.number}`,href:i.url}),i.title&&(0,j.jsx)(`span`,{className:`ep-line__title`,children:i.title})]})})]}),a&&(0,j.jsxs)(`div`,{className:`ep-fact`,children:[(0,j.jsx)(`dt`,{children:`Verdict`}),(0,j.jsxs)(`dd`,{children:[(0,j.jsx)(f,{kind:_[a.outcome],label:a.label,collapse:`never`}),a.headline&&(0,j.jsx)(`span`,{className:`ep-line__sub`,children:a.headline})]})]}),(0,j.jsxs)(`div`,{className:`ep-fact`,children:[(0,j.jsx)(`dt`,{children:`Evidence`}),(0,j.jsx)(`dd`,{children:O(e.counts)})]})]})}),e.tests.length===0?(0,j.jsx)(n,{kind:`zero`,title:`No tests ran`,body:`This run names an issue but left no steps, screenshots or video.`}):e.tests.map((e,t)=>(0,j.jsx)(I,{test:e,index:t},`${e.title}|${t}`)),(0,j.jsx)(c,{children:(0,j.jsxs)(`dl`,{className:`ep-details`,children:[(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Run`}),(0,j.jsx)(`dd`,{className:`num`,children:e.run.id})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`JSON`}),(0,j.jsx)(`dd`,{className:`num`,children:e.links.api})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Left out`}),(0,j.jsx)(`dd`,{children:`Traces, the test command and the test output. They can hold cookies and tokens.`})]}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`dt`,{children:`Hidden`}),(0,j.jsx)(`dd`,{children:A(e.scrubbed)})]})]})})]})}function R({id:t}){let i=m(`evidence-pack:${t}`,e=>o.evidencePack(t,e));if(i.loading)return(0,j.jsx)(a,{label:`Loading the evidence pack`});if(!i.data){let a=i.error instanceof e?i.error.status:0;return a===404||a===409?(0,j.jsx)(`div`,{className:`page`,children:(0,j.jsx)(n,{kind:`filtered`,title:a===404?`Check not found`:`No evidence pack`,body:a===404?`It may have been removed, or the link is wrong.`:i.error.message,action:(0,j.jsx)(`a`,{href:p({name:`run`,id:t}),children:`Open the check`})})}):(0,j.jsx)(r,{title:`Could not load the evidence pack`,error:i.error,onRetry:()=>void i.reload(),retrying:i.refreshing})}return(0,j.jsx)(L,{pack:i.data})}export{R as default};
2
+ //# sourceMappingURL=EvidencePack-DQ3kCJX4.js.map
@@ -0,0 +1 @@
1
+ .ep-actions{align-items:center;gap:var(--space-4);white-space:nowrap;flex-wrap:nowrap}.ep-copy{align-items:center;display:inline-flex}.ep-summary{margin-bottom:var(--space-5);padding:0 var(--space-4);border:var(--hairline);border-radius:var(--radius-md);background:var(--surface)}.ep-facts{margin:0}.ep-fact{gap:var(--space-3);padding:var(--space-3) 0;border-bottom:var(--hairline);grid-template-columns:96px minmax(0,1fr);display:grid}.ep-fact:last-child{border-bottom:0}.ep-fact dt{color:var(--text-3);font-size:var(--text-sm)}.ep-fact dd{min-width:0;margin:0}.ep-line{align-items:baseline;gap:var(--space-1) var(--space-2);flex-wrap:wrap;min-width:0;display:flex}.ep-line+.ep-line{margin-top:var(--space-1)}.ep-line__title{min-width:0;font-weight:var(--weight-medium);overflow-wrap:anywhere}.ep-line__sub{color:var(--text-3);font-size:var(--text-sm);overflow-wrap:anywhere;margin-top:2px;display:block}.ep-test{margin-bottom:var(--space-6)}.ep-test__title{align-items:flex-start;gap:var(--space-2);font-size:var(--text-lg);margin:0;display:flex}.ep-test__title .status-icon{flex:none;margin-top:2px}.ep-test__name{overflow-wrap:anywhere;min-width:0}.ep-test__meta{margin:var(--space-1) 0 var(--space-3);color:var(--text-3);font-size:var(--text-sm)}.ep-test__error{margin:0 0 var(--space-3);padding:var(--space-3);border-radius:var(--radius);background:var(--outage-bg);color:var(--outage-fg);font-size:var(--text-sm);white-space:pre-wrap;overflow-wrap:anywhere}.ep-test__details{margin:0 0 var(--space-3)}.ep-test__output{font-family:var(--font-mono);font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.ep-muted{margin:0 0 var(--space-3);color:var(--text-3);font-size:var(--text-sm)}.ep-video{aspect-ratio:16/9;border:var(--hairline);border-radius:var(--radius-md);background:var(--surface-2);object-fit:contain;width:100%;max-width:640px;display:block}.ep-steps{gap:var(--space-4);margin:var(--space-4) 0 0;grid-template-columns:minmax(0,1fr);padding:0;list-style:none;display:grid}.ep-step{gap:var(--space-2);flex-direction:column;min-width:0;display:flex}.ep-step__text{align-items:flex-start;gap:var(--space-2);font-weight:var(--weight-medium);overflow-wrap:anywhere;margin:0;display:flex}.ep-step__name{flex:auto;min-width:0}.ep-step__failed{white-space:nowrap;flex:none}.ep-step--failed .ep-step__n{background:var(--outage-bg);color:var(--outage-fg)}.ep-step__n{border-radius:var(--radius-full);background:var(--surface-3);min-width:22px;height:22px;color:var(--text-2);font-size:var(--text-xs);flex:none;justify-content:center;align-items:center;display:inline-flex}.ep-step__none{padding:var(--space-4);border:var(--hairline);border-radius:var(--radius-md);background:var(--surface-2);color:var(--text-3);font-size:var(--text-sm);margin:0}.ep-shotbox{align-items:flex-start;gap:var(--space-1);flex-direction:column;min-width:0;display:flex}.ep-shot{border:var(--hairline);border-radius:var(--radius-md);background:var(--surface-2);width:-moz-fit-content;width:fit-content;max-width:100%;display:block;overflow:hidden}.ep-shot:focus-visible{box-shadow:var(--focus-ring);outline:none}.ep-shot__img{width:auto;max-width:100%;height:auto;max-height:520px;display:block}.ep-shot__open{font-size:var(--text-sm);white-space:nowrap}.ep-details{font-size:var(--text-sm);margin:0}.ep-details>div{gap:var(--space-3);padding:var(--space-1) 0;grid-template-columns:80px minmax(0,1fr);display:grid}.ep-details dt{color:var(--text-3)}.ep-details dd{overflow-wrap:anywhere;margin:0}@media (max-width:639px){.ep-shot{overscroll-behavior-x:contain;scrollbar-width:thin;width:100%;overflow:auto hidden}.ep-shot__img{zoom:.65;max-width:none;max-height:none}}
@@ -0,0 +1,2 @@
1
+ import{Cn as e,Tn as t,Vn as n,Wn as r,mn as i,pn as a,q as o,sn as s}from"./ui-DcmhYyYp.js";import{i as c,n as l}from"./store-IqrqHuFR.js";import{y as u}from"./format-BBZ8vFyT.js";var d=r(n(),1),f=i(),p={slack:`Slack`,push:`the phone`};function m(e){let t=(e.failed??[]).map(e=>p[e]);return`Not sent to ${t.length>1?`${t.slice(0,-1).join(`, `)} and ${t[t.length-1]}`:t[0]??`a channel`}`}function h(e){return(e.failed??[]).flatMap(t=>{let n=(e.attempts??[]).filter(e=>e.channel===t),r=n[n.length-1];return r?.error?[`${p[t]}: ${r.error} (${n.length} tries)`]:[]})}function g({items:e,showDot:t,actions:n}){return(0,f.jsx)(`ul`,{className:`fd-rows`,children:e.map(e=>{let r=n?.busyId===e.id,i=!!n?.busyId;return(0,f.jsxs)(`li`,{className:`fd-item`,children:[(0,f.jsx)(`a`,{className:`fd-row`,href:e.runId?`#/runs/${encodeURIComponent(e.runId)}`:`#/chat/${encodeURIComponent(e.watchId)}`,children:(0,f.jsxs)(`span`,{className:`fd-row__main`,children:[(0,f.jsx)(`span`,{className:`fd-row__title`,children:e.title}),(0,f.jsxs)(`span`,{className:`fd-row__meta`,children:[(0,f.jsx)(`span`,{className:`fd-row__status`,children:m(e)}),e.approvalSettled&&(0,f.jsx)(`span`,{children:`Approval already settled`}),t&&e.dotName&&(0,f.jsx)(`span`,{children:e.dotName}),(0,f.jsx)(`time`,{className:`fd-row__when`,dateTime:e.createdAt,children:u(e.createdAt)})]}),h(e).map(e=>(0,f.jsx)(`span`,{className:`fd-row__error`,children:e},e))]})}),n&&(0,f.jsxs)(`div`,{className:`fd-actions`,children:[!e.approvalSettled&&(0,f.jsx)(a,{size:`sm`,loading:r,disabled:i&&!r,onClick:()=>n.onRetry(e),"aria-label":`Retry sending ${e.title}`,children:`Retry`}),(0,f.jsx)(a,{size:`sm`,variant:`ghost`,disabled:i,onClick:()=>n.onDismiss(e),"aria-label":`Dismiss ${e.title}`,children:`Dismiss`})]})]},e.id)})})}var _=e=>e.map(e=>p[e]).join(` and `);function v({dotId:n}){let r=o(),[i,u]=(0,d.useState)(null),[m,h]=(0,d.useState)(!1),[v,y]=(0,d.useState)(!1),b=c(`updates:failed:${n??`all`}`,e=>t.failedUpdates(n,e),{refreshOn:[`update`],eventFilter:e=>e.type===`update`&&(!n||e.update.watchId===n)});if(!b.data)return null;let{total:x}=b.data;if(x===0&&!v)return null;let S=()=>l(`updates:failed:`),C=(t,n)=>{r.show({tone:`error`,title:t,body:n instanceof e?n.message:void 0}),S()};async function w(e){u(e.id);try{let n=await t.retryUpdate(e.id);n.cleared?r.show({tone:`success`,title:`Alert sent again`,body:`Delivered to ${_(n.sent)}.`}):r.show({tone:`error`,title:`Still not arriving`,body:n.failed.map(e=>`${p[e.channel]}: ${e.error}`).join(` `)}),S()}catch(e){C(`Could not send the alert again`,e)}finally{u(null)}}async function T(e){u(e.id);try{await t.dismissUpdate(e.id),S()}catch(e){C(`Could not dismiss the alert`,e)}finally{u(null)}}async function E(){h(!0);try{let e=await t.dismissFailedUpdates(n?{dotId:n}:{});y(!0),r.show({tone:`success`,title:e.dismissed===1?`1 alert dismissed`:`${e.dismissed} alerts dismissed`}),S()}catch(e){C(`Could not dismiss the alerts`,e)}finally{h(!1)}}return(0,f.jsx)(s,{flush:!0,title:`Alerts that did not arrive`,description:`The dot tried several times and keeps trying every 15 minutes. The message is in the chat. Retry sends it now. Dismiss stops the tries and hides it.`,actions:x>0?(0,f.jsxs)(a,{size:`sm`,variant:`ghost`,loading:m,disabled:!!i,onClick:()=>void E(),children:[`Dismiss all `,x]}):void 0,children:x===0?(0,f.jsx)(`p`,{className:`fd-left`,children:`0 left`}):(0,f.jsx)(g,{items:b.data.items,showDot:!n,actions:{busyId:i,onRetry:e=>void w(e),onDismiss:e=>void T(e)}})})}export{v as t};
2
+ //# sourceMappingURL=FailedDeliveries-1F2kFcs9.js.map
@@ -0,0 +1 @@
1
+ .fd-rows{margin:0;padding:0;list-style:none}.fd-rows>li+li{border-top:var(--hairline)}.fd-item{align-items:center;gap:var(--space-2) var(--space-3);flex-wrap:wrap;padding-inline-end:var(--space-4);display:flex}.fd-row{min-width:0;padding:var(--space-3) var(--space-4);color:inherit;flex:16rem;text-decoration:none;display:block}.fd-actions{gap:var(--space-2);padding-block:var(--space-2);flex:none;margin-inline-start:auto;display:flex}.fd-row:hover{background:var(--surface-2)}.fd-row__main{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}.fd-row__title{font-weight:var(--weight-semibold);overflow-wrap:anywhere}.fd-row__meta{align-items:center;gap:var(--space-1) var(--space-2);font-size:var(--text-sm);color:var(--text-3);flex-wrap:wrap;display:flex}.fd-row__status{color:var(--attention-fg)}.fd-row__meta>*+:before{content:"·";margin-right:var(--space-2);color:var(--text-3)}.fd-row__when{white-space:nowrap}.fd-row__error{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-2);overflow-wrap:anywhere}.fd-left{padding:var(--space-3) var(--space-4);font-size:var(--text-sm);color:var(--text-2);margin:0}
@@ -0,0 +1,2 @@
1
+ import{F as e,G as t,H as n,N as r,R as i,Tn as a,Vn as o,Wn as s,Y as c,at as l,b as u,it as d,mn as f,ot as p,pn as m,pt as h}from"./ui-DcmhYyYp.js";import{r as g,t as _}from"./router-W6nZsQ33.js";import{i as v}from"./store-IqrqHuFR.js";import{a as y,o as b}from"./data-CmXvx3Mj.js";import{a as x,m as S,o as C,r as w}from"./format-BBZ8vFyT.js";import{a as T,f as E,i as D,p as O,r as k,s as A,t as j}from"./activity-CBfTSxqw.js";import{t as M}from"./RunRow-BKEJv8ib.js";/* empty css */var N=s(o(),1),P=f();function F({data:e,error:t,loading:r,progress:a,showDot:o,onRetry:s,onNavigate:c,hideWaiting:l}){if(!e&&t)return(0,P.jsx)(n,{compact:!0,title:`Could not load activity`,error:t,onRetry:s});if(!e&&r)return(0,P.jsx)(i,{rows:4,label:`Loading activity`});let u=A(e?.items??[]);return(0,P.jsxs)(`div`,{className:`activity-tree`,children:[l?null:(0,P.jsx)(L,{count:e?.waiting??0,onNavigate:c}),t?(0,P.jsx)(`p`,{className:`activity-tree__stale`,role:`status`,children:`Could not refresh. Showing the last result.`}):null,(0,P.jsx)(I,{notes:e?.notes??[],showDot:o}),u.length===0&&!e?.notes?.length?(0,P.jsx)(`p`,{className:`activity-tree__empty`,children:`No work yet. When a PR or ticket arrives, the dot shows it here.`}):u.map(e=>(0,P.jsx)(V,{group:e,progress:a,showDot:o,onNavigate:c},`${e.kind}:${e.name}`))]})}function I({notes:e,showDot:t}){return e.length?(0,P.jsx)(`ul`,{className:`activity-rows list-box activity-notes`,"aria-label":`Also in progress`,children:e.map(e=>(0,P.jsx)(`li`,{className:`activity-row`,children:(0,P.jsxs)(`div`,{className:`activity-row__link activity-row__link--static`,children:[(0,P.jsx)(u,{kind:e.held?`paused`:`running`,label:e.held?`Waiting`:`Working on it`,size:14}),(0,P.jsxs)(`span`,{className:`activity-row__text`,children:[(0,P.jsx)(`span`,{className:`activity-row__title`,children:e.text}),t?(0,P.jsx)(`span`,{className:`activity-row__sub`,children:e.dotName}):null]})]})},e.dotId))}):null}function L({count:e,onNavigate:t}){let n=T(e);return(0,P.jsxs)(`a`,{className:`activity-waiting${e?` activity-waiting--some`:``}`,href:`#/inbox`,onClick:t,"aria-label":`${n}. Open the Inbox`,children:[(0,P.jsx)(u,{kind:`waiting`,label:``,size:14,decorative:!0}),(0,P.jsx)(`span`,{className:`activity-waiting__text`,children:n}),(0,P.jsx)(l,{size:14})]})}function R(){return(0,P.jsxs)(`svg`,{className:`activity-group__icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.75`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,children:[(0,P.jsx)(`path`,{d:`M5 4h11a3 3 0 0 1 3 3v13H8a3 3 0 0 1-3-3z`}),(0,P.jsx)(`path`,{d:`M5 17a3 3 0 0 1 3-3h11`})]})}function z(){return(0,P.jsx)(`svg`,{className:`activity-group__icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.75`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,children:(0,P.jsx)(`path`,{d:`M4 8a2 2 0 0 0 0 4v0a2 2 0 0 1 0 4v2h16v-2a2 2 0 0 1 0-4v0a2 2 0 0 0 0-4V6H4z`})})}function B(){return(0,P.jsx)(`svg`,{className:`activity-group__icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.75`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,children:(0,P.jsx)(`path`,{d:`M3 12h4l3-7 4 14 3-7h4`})})}function V({group:e,progress:t,showDot:n,onNavigate:r}){let[i,a]=(0,N.useState)(!0),o=e.kind===`repo`?R:e.kind===`project`?z:B;return(0,P.jsxs)(`section`,{className:`activity-group`,"aria-label":e.name,children:[(0,P.jsxs)(`button`,{type:`button`,className:`activity-group__head`,"aria-expanded":i,onClick:()=>a(e=>!e),children:[i?(0,P.jsx)(d,{size:12}):(0,P.jsx)(l,{size:12}),(0,P.jsx)(o,{}),(0,P.jsx)(`span`,{className:`activity-group__name`,title:e.name,children:e.name}),(0,P.jsx)(`span`,{className:`activity-group__count num`,children:e.items.length})]}),i&&(0,P.jsx)(`ul`,{className:`activity-rows list-box`,children:e.items.map(e=>(0,P.jsx)(H,{item:e,live:e.runId?t[e.runId]:void 0,showDot:n,onNavigate:r},`${e.dotId}|${e.key}`))})]})}function H({item:e,live:t,showDot:n,onNavigate:r}){let i=E(e,t),a=O(e),o=[e.sub,n?e.dotName:``].filter(Boolean).join(` · `),s=e.merged&&e.state!==`working`&&e.state!==`draft`,c=`${e.title}. ${D[e.state]}${i?`: ${i}`:``}`,l=(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(u,{kind:k[e.state],label:D[e.state],size:14}),(0,P.jsxs)(`span`,{className:`activity-row__text`,children:[(0,P.jsx)(`span`,{className:`activity-row__title`,children:e.title}),o?(0,P.jsx)(`span`,{className:`activity-row__sub`,children:o}):null,i?(0,P.jsx)(`span`,{className:`activity-row__step`,children:i}):null]}),a?(0,P.jsx)(`span`,{className:`activity-row__tag`,children:a}):null]});return(0,P.jsx)(`li`,{className:`activity-row${s?` activity-row--faded`:``}`,children:e.runId?(0,P.jsx)(`a`,{className:`activity-row__link`,href:_({name:`run`,id:e.runId}),onClick:r,title:c,children:l}):(0,P.jsx)(`div`,{className:`activity-row__link activity-row__link--static`,title:c,children:l})})}function U({dotId:e,onNavigate:t}){let n=j(e);return(0,P.jsx)(F,{data:n.data,error:n.error,loading:n.loading,progress:n.progress,showDot:!e,onRetry:()=>void n.reload(),onNavigate:t,hideWaiting:!0})}function W({dotId:e}){return(0,P.jsxs)(`aside`,{className:`feed-tree`,"aria-label":`Work by repo and project`,children:[(0,P.jsx)(`h2`,{className:`feed-tree__title`,children:`Repos and projects`}),(0,P.jsx)(U,{dotId:e})]})}function G({dotId:e,open:t,onOpen:n,onClose:r}){return(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(m,{className:`feed-tree-btn`,size:`sm`,icon:(0,P.jsx)(h,{size:14}),onClick:n,"aria-haspopup":`dialog`,children:`Repos and projects`}),(0,P.jsx)(c,{open:t,onClose:r,title:`Repos and projects`,description:`Work grouped by repo or tracker project`,hideDescription:!0,className:`feed-tree-sheet`,children:(0,P.jsx)(U,{dotId:e,onNavigate:r})})]})}function K({dotId:e}){let t=j(e).data?.notes??[];return t.length?(0,P.jsx)(`ul`,{className:`feed-notes`,"aria-label":`Also in progress`,children:t.map(t=>(0,P.jsxs)(`li`,{className:`feed-notes__row`,children:[(0,P.jsx)(u,{kind:t.held?`paused`:`running`,label:t.held?`Waiting`:`Working on it`,size:14}),(0,P.jsx)(`span`,{children:e?t.text:`${t.text} (${t.dotName})`})]},t.dotId))}):null}var q=50,J=Object.keys(w).map(e=>({value:e,label:w[e]})),Y=[{value:``,label:`Any outcome`},{value:`running`,label:`Running now`},...C.map(e=>({value:e,label:x[e]})),{value:`no_verdict`,label:`No result yet`}];function X(e,t){return t?t===`running`?e.status===`running`:t===`no_verdict`?e.status!==`running`&&!e.verdict:e.verdict?.outcome===t:!0}function Z({dotId:o}){let s=y(),c=b().data?.demo??!1,[l,u]=(0,N.useState)(``),[d,f]=(0,N.useState)(``),[h,x]=(0,N.useState)(1),C=q*h,T=`feed:${o??``}:${l}:${C}`,E=v(T,e=>a.feed({dotId:o,kind:l||void 0,limit:C},e),{refreshOn:[`run`],throttleMs:1e3}),[D,O]=(0,N.useState)(null);E.data&&E.data!==D?.runs&&O({key:T,runs:E.data});let k=e=>e.split(`:`).slice(0,3).join(`:`),A=E.data??(D&&k(D.key)===k(T)?D.runs:void 0),j=!A&&E.loading,F=!E.data&&!!A&&E.loading,I=(A??[]).filter(e=>X(e,d)),L=S(I,e=>e.createdAt),R=(A??[]).length,z=R>=C&&C<200,B=!!(o||l||d),V=o?s.data?.find(e=>e.id===o)?.name??`this dot`:null,H=e=>{x(1),g(_({name:`feed`,dotId:e||void 0}),{replace:!0})},U=()=>{u(``),f(``),x(1),o&&g(_({name:`feed`}),{replace:!0})},Z=[];o&&Z.push({label:`Dot: ${V}`,clear:()=>H(``)}),l&&Z.push({label:`Kind: ${w[l]}`,clear:()=>{u(``),x(1)}}),d&&Z.push({label:`Outcome: ${Y.find(e=>e.value===d)?.label}`,clear:()=>f(``)});let[Q,$]=(0,N.useState)(!1);return(0,P.jsxs)(`div`,{className:`page page--feed`,children:[(0,P.jsxs)(`header`,{className:`page__header`,children:[(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`h1`,{className:`page__title`,children:`Activity`}),(0,P.jsx)(`p`,{className:`page__subtitle`,children:`Every check your dots made, newest first.`})]}),(0,P.jsx)(G,{dotId:o,open:Q,onOpen:()=>$(!0),onClose:()=>$(!1)})]}),(0,P.jsx)(K,{dotId:o}),(0,P.jsxs)(`div`,{className:`feed-layout`,children:[(0,P.jsx)(W,{dotId:o}),(0,P.jsxs)(`div`,{className:`feed-main`,children:[(0,P.jsxs)(`div`,{className:`feed-filters`,role:`search`,"aria-label":`Filter checks`,children:[(0,P.jsx)(r,{label:`Dot`,children:(0,P.jsxs)(e,{value:o??``,onChange:e=>H(e.target.value),children:[(0,P.jsx)(`option`,{value:``,children:`All dots`}),(s.data??[]).map(e=>(0,P.jsx)(`option`,{value:e.id,children:e.name},e.id)),o&&!s.data?.some(e=>e.id===o)&&(0,P.jsx)(`option`,{value:o,children:V})]})}),(0,P.jsx)(r,{label:`Kind`,children:(0,P.jsxs)(e,{value:l,onChange:e=>{u(e.target.value),x(1)},children:[(0,P.jsx)(`option`,{value:``,children:`Any kind`}),J.map(e=>(0,P.jsx)(`option`,{value:e.value,children:e.label},e.value))]})}),(0,P.jsx)(r,{label:`Outcome`,children:(0,P.jsx)(e,{value:d,onChange:e=>f(e.target.value),options:Y})})]}),Z.length>0&&(0,P.jsxs)(`div`,{className:`filter-chips`,"aria-label":`Active filters`,children:[Z.map(e=>(0,P.jsxs)(`button`,{type:`button`,className:`filter-chip`,onClick:e.clear,"aria-label":`Remove filter ${e.label}`,children:[(0,P.jsx)(`span`,{children:e.label}),(0,P.jsx)(p,{size:12,"aria-hidden":`true`})]},e.label)),(0,P.jsx)(`button`,{type:`button`,className:`link-btn filter-chips__clear`,onClick:U,children:`Clear all`})]}),j?(0,P.jsx)(i,{rows:8,label:`Loading checks`,since:E.startedAt}):A?(0,P.jsxs)(P.Fragment,{children:[E.error!=null&&(0,P.jsx)(n,{compact:!0,error:E.error,title:`Could not refresh. Showing the last list.`,onRetry:()=>void E.reload(),retrying:E.refreshing}),I.length===0?B?(0,P.jsx)(t,{kind:`filtered`,title:`No checks match these filters`,body:d&&z?`Only the newest checks are searched. Load more or clear a filter.`:`Try another dot, kind, or outcome.`,action:(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(m,{onClick:U,children:`Clear filters`}),d&&z&&(0,P.jsx)(m,{onClick:()=>x(e=>e+1),children:`Load more`})]})}):(0,P.jsx)(t,{kind:`first-run`,title:`Nothing yet`,body:c?`Every check a dot makes shows up here. You can simulate one from Settings.`:`Every check a dot makes shows up here.`,action:(0,P.jsx)(`a`,{href:_({name:`dots`}),children:`Go to Dots`})}):(0,P.jsx)(`div`,{className:`feed-groups`,children:L.map(e=>(0,P.jsxs)(`section`,{className:`feed-group`,"aria-labelledby":`day-${e.key}`,children:[(0,P.jsx)(`h2`,{id:`day-${e.key}`,className:`feed-group__title`,children:e.label}),(0,P.jsx)(`ul`,{className:`rows run-rows`,children:e.items.map(e=>(0,P.jsx)(M,{run:e,showDot:!o},e.id))})]},e.key))}),z&&I.length>0&&(0,P.jsx)(`div`,{className:`feed-more`,children:(0,P.jsx)(m,{loading:F,onClick:()=>x(e=>e+1),children:`Load more`})}),R>=200&&(0,P.jsx)(`p`,{className:`run-muted feed-more`,children:`Showing the newest 200 checks. Filter by dot or kind to see older ones.`})]}):(0,P.jsx)(n,{error:E.error,title:`Could not load activity`,onRetry:()=>void E.reload(),retrying:E.refreshing})]})]})]})}export{Z as default};
2
+ //# sourceMappingURL=Feed-5wiHRTFK.js.map
@@ -0,0 +1,4 @@
1
+ import{Tn as e,Vn as t,Wn as n,mn as r}from"./ui-DcmhYyYp.js";import{a as i,o as a,t as o}from"./useRefChips-CbafNx59.js";var s=n(t(),1),c=new Set(`details.summary.br.sub.sup.kbd.b.strong.i.em.code.ins.del.s.hr.p.ul.ol.li.blockquote.pre.table.thead.tbody.tr.th.td.dl.dt.dd`.split(`.`));function l(e){return e.replace(/&(?!#?[a-z0-9]+;)/gi,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}var u=/(<\/?[A-Za-z][A-Za-z0-9-]*(?:\s[^<>]*)?\/?>)/;function d(e){return e.replace(/<!--[\s\S]*?(?:-->|$)/g,``).split(u).map((e,t)=>{if(t%2==0)return l(e);let n=/^<(\/?)([A-Za-z][A-Za-z0-9-]*)([^>]*)>$/.exec(e),r=n?.[2].toLowerCase()??``;return!n||!c.has(r)?l(e):n[1]?`</${r}>`:r===`details`&&/\bopen\b/i.test(n[3])?`<details open>`:`<${r}>`}).join(``)}var f=new a({gfm:!0,breaks:!1,async:!1,renderer:{html({text:e}){return d(e)}}});function p(e){try{return f.parse(e)}catch{return`<p>${l(e)}</p>`}}var m=new Set([...c,`a`,`img`,`input`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`span`,`div`,`g-emoji`,`tt`,`mark`,`small`,`caption`,`colgroup`,`col`,`tfoot`]),h=new Set([`script`,`style`,`iframe`,`object`,`embed`,`svg`,`math`,`template`,`form`,`button`,`select`,`textarea`,`link`,`meta`,`base`,`noscript`]),g=/^(?:pl-[a-z0-9]+|highlight(?:-[a-z0-9-]+)?|task-list-item(?:-checkbox)?|contains-task-list)$/;function _(e){let t=e.tagName.toLowerCase();for(let n of[...e.attributes]){let r=n.name.toLowerCase();r===`href`&&t===`a`||r===`title`&&(t===`a`||t===`img`)||(r===`src`||r===`alt`||r===`width`||r===`height`)&&t===`img`||r===`open`&&t===`details`||r===`align`&&(t===`td`||t===`th`)||(r===`type`||r===`checked`||r===`disabled`)&&t===`input`||r===`class`||e.removeAttribute(n.name)}let n=e.getAttribute(`class`);if(n!==null){let t=n.split(/\s+/).filter(e=>g.test(e));t.length?e.setAttribute(`class`,t.join(` `)):e.removeAttribute(`class`)}if(t===`a`){let t=i(e.getAttribute(`href`));t?(e.setAttribute(`href`,t),/^https?:/i.test(t)&&(e.setAttribute(`target`,`_blank`),e.setAttribute(`rel`,`noopener noreferrer`))):e.removeAttribute(`href`)}if(t===`img`){let t=i(e.getAttribute(`src`));!t||/^mailto:/i.test(t)?e.replaceWith(e.ownerDocument.createTextNode(e.getAttribute(`alt`)??``)):(e.setAttribute(`src`,t),e.setAttribute(`loading`,`lazy`))}t===`input`&&((e.getAttribute(`type`)??``).toLowerCase()===`checkbox`?(e.setAttribute(`disabled`,``),e.setAttribute(`aria-label`,e.hasAttribute(`checked`)?`Done`:`Not done`)):e.remove())}function v(e,t){for(let n of[...e.childNodes]){if(n.nodeType===8){n.remove();continue}if(n.nodeType!==1)continue;let e=n,r=e.tagName.toLowerCase();if(h.has(r)||r===`a`&&/\banchor\b/.test(e.getAttribute(`class`)??``)){e.remove();continue}if(v(e,t),!m.has(r)){e.replaceWith(...e.childNodes);continue}if(_(e),t.demoteHeadings&&/^h[1-6]$/.test(r)&&e.isConnected){let t=e.ownerDocument.createElement(`p`);t.className=`md-heading md-heading--${r[1]}`,t.append(...e.childNodes),e.replaceWith(t)}}}function y(e,t={}){if(typeof DOMParser>`u`)return l(e.replace(/<[^>]*>/g,``));let n=new DOMParser().parseFromString(`<body>${e}</body>`,`text/html`);v(n.body,t);for(let e of n.body.querySelectorAll(`li > input[type="checkbox"], li > p > input[type="checkbox"]`))e.closest(`li`)?.classList.add(`task-list-item`),e.classList.add(`task-list-item-checkbox`),e.closest(`ul, ol`)?.classList.add(`contains-task-list`);return n.body.innerHTML}function b(e,t={}){return y(p(e),t)}var x=r(),S=100,C=new Map;function w(e,t){C.size>=S&&C.delete(C.keys().next().value),C.set(e,t)}function T(e){return e.replace(/^[ \t]*<!--\s*(?:qa(?:dots)?|localdost):[^\n]*?-->[ \t]*\r?\n/gm,``).replace(/[ \t]*<!--\s*(?:qa(?:dots)?|localdost):[\s\S]*?-->/g,``).replace(/\n{3,}/g,`
2
+
3
+ `)}function E({text:t,dotId:n,className:r,demoteHeadings:i,...a}){let c=(0,s.useMemo)(()=>T(t),[t]),l=n?`${n}\n${c}`:``,u=(0,s.useMemo)(()=>b(c,{demoteHeadings:i}),[c,i]),[,d]=(0,s.useState)(0);(0,s.useEffect)(()=>{if(!l||!c.trim()||C.has(l))return;let t=new AbortController;return e.markdownPreview(n,c,t.signal).then(e=>{e.html!==null&&(w(l,e.html),d(e=>e+1))}).catch(()=>{}),()=>t.abort()},[l,c,n]);let f=l?C.get(l):void 0,p=f!==void 0,m=(0,s.useMemo)(()=>f===void 0?u:y(f,{demoteHeadings:i}),[f,u,i]),{ref:h,chips:g}=o(m);return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(`div`,{...a,ref:h,className:[`md`,`gfm`,r??``].filter(Boolean).join(` `),"data-source":p?`github`:`local`,dangerouslySetInnerHTML:{__html:m}}),g]})}export{E as t};
4
+ //# sourceMappingURL=GfmView-C-NYaduC.js.map
@@ -0,0 +1,2 @@
1
+ import{E as e,En as t,F as n,H as r,I as i,It as a,N as o,P as s,R as c,Tn as l,Vn as u,Wn as d,Y as f,fn as p,in as m,mn as h,pn as g,q as _,ut as v,v as y}from"./ui-DcmhYyYp.js";import{i as b,n as x,r as S}from"./store-IqrqHuFR.js";import{l as C,y as w}from"./format-BBZ8vFyT.js";import{y as T}from"./model-BIQy5IVG.js";import{E,S as D,T as O,_ as ee,a as k,b as A,d as j,f as M,g as N,h as P,i as te,m as F,n as ne,p as I,s as L,t as R,u as z,v as B,w as V,x as H,y as U}from"./impactModel-MY1OFuiP.js";var W=d(u(),1),G=h(),K=e=>({title:e?.title??``,kind:e?.kind??`manual`,priority:e?.priority??`should`,status:e?.status??`draft`,refs:(e?.requirementRefs??[]).join(`, `),specPath:e?.specPath??``,steps:e?.steps.length?e.steps.map(e=>({action:e.action,expected:e.expected??``})):[{action:``,expected:``}]});function q(e){return{title:e.title.trim(),kind:e.kind,priority:e.priority,status:e.status,requirementRefs:O(e.refs),specPath:e.kind===`manual`?null:e.specPath.trim()||null,steps:e.steps.map(e=>({action:e.action.trim(),expected:(e.expected??``).trim()})).filter(e=>e.action||e.expected).map(e=>e.expected?e:{action:e.action})}}function J({initial:e,saving:t,error:r,onSave:c,onCancel:l}){let[u,d]=(0,W.useState)(()=>K(e)),f=e=>d(t=>({...t,...e})),h=(e,t)=>f({steps:u.steps.map((n,r)=>r===e?{...n,...t}:n)});return(0,G.jsxs)(`form`,{className:`case-form`,"aria-label":e?`Edit ${e.key}`:`New test case`,onSubmit:e=>{e.preventDefault(),c(q(u))},children:[(0,G.jsx)(o,{label:`Title`,required:!0,children:(0,G.jsx)(s,{value:u.title,maxLength:200,onChange:e=>f({title:e.target.value}),"data-autofocus":!0})}),(0,G.jsxs)(`div`,{className:`case-form__row`,children:[(0,G.jsx)(o,{label:`Kind`,children:(0,G.jsx)(n,{value:u.kind,onChange:e=>f({kind:e.target.value}),children:I.map(e=>(0,G.jsx)(`option`,{value:e,children:F[e]},e))})}),(0,G.jsx)(o,{label:`Priority`,children:(0,G.jsx)(n,{value:u.priority,onChange:e=>f({priority:e.target.value}),children:P.map(e=>(0,G.jsx)(`option`,{value:e,children:N[e]},e))})}),(0,G.jsx)(o,{label:`Status`,children:(0,G.jsx)(n,{value:u.status,onChange:e=>f({status:e.target.value}),children:H.map(e=>(0,G.jsx)(`option`,{value:e,children:D[e]},e))})})]}),(0,G.jsx)(o,{label:`Requirements`,hint:`Keys such as SHOP-12 or owner/name#12, split by commas.`,children:(0,G.jsx)(s,{value:u.refs,onChange:e=>f({refs:e.target.value})})}),u.kind!==`manual`&&(0,G.jsx)(o,{label:`Spec file`,hint:`Path in the repo. A run of this file writes the result here.`,children:(0,G.jsx)(s,{value:u.specPath,placeholder:`e2e/checkout.spec.ts`,onChange:e=>f({specPath:e.target.value}),className:`num`})}),(0,G.jsxs)(`fieldset`,{className:`case-steps`,children:[(0,G.jsx)(`legend`,{className:`field__label`,children:`Steps`}),(0,G.jsx)(`ol`,{className:`case-steps__list`,children:u.steps.map((e,t)=>(0,G.jsxs)(`li`,{className:`case-steps__item`,children:[(0,G.jsxs)(`div`,{className:`case-steps__fields`,children:[(0,G.jsx)(o,{label:`Step ${t+1}`,children:(0,G.jsx)(i,{rows:2,value:e.action,onChange:e=>h(t,{action:e.target.value})})}),(0,G.jsx)(o,{label:`Expected result ${t+1}`,children:(0,G.jsx)(s,{value:e.expected??``,onChange:e=>h(t,{expected:e.target.value})})})]}),(0,G.jsx)(p,{icon:(0,G.jsx)(m,{size:14}),label:`Remove`,size:`sm`,disabled:u.steps.length===1,onClick:()=>f({steps:u.steps.filter((e,n)=>n!==t)}),"aria-label":`Remove step ${t+1}`})]},t))}),(0,G.jsx)(g,{size:`sm`,icon:(0,G.jsx)(a,{size:14}),onClick:()=>f({steps:[...u.steps,{action:``,expected:``}]}),children:`Add step`})]}),r&&(0,G.jsx)(`p`,{className:`field__error`,role:`alert`,children:r}),(0,G.jsxs)(`div`,{className:`case-actions`,children:[(0,G.jsx)(g,{type:`submit`,variant:`primary`,loading:t,children:e?`Save`:`Add test case`}),(0,G.jsx)(g,{onClick:l,children:`Cancel`})]})]})}var Y=(e,t)=>`case:${e}:${t}`,X=e=>`cases:${e}:`,Z=e=>e instanceof Error?e.message:`Something went wrong.`;function Q({title:e,count:t,children:n}){return(0,G.jsxs)(`section`,{className:`case-sec`,children:[(0,G.jsxs)(`h3`,{className:`case-sec__title`,children:[e,t!==void 0&&(0,G.jsx)(`span`,{className:`case-sec__count num`,children:t})]}),n]})}function re({r:n}){return(0,G.jsxs)(`li`,{className:`case-result`,children:[(0,G.jsxs)(`div`,{className:`case-result__head`,children:[(0,G.jsx)(y,{kind:B[n.result],label:U[n.result]}),n.runId?(0,G.jsx)(e,{source:`run`,title:n.source===`run`?`From a run`:`Run`,href:`#/runs/${encodeURIComponent(n.runId)}`}):(0,G.jsx)(`span`,{className:`muted`,children:`Added by hand`}),(0,G.jsx)(`time`,{className:`case-result__at muted`,dateTime:n.at,title:C(n.at),children:w(n.at)})]}),n.notes&&(0,G.jsx)(`p`,{className:`case-result__notes`,children:n.notes}),n.runId&&n.evidence.length>0&&(0,G.jsx)(`ul`,{className:`case-evidence`,"aria-label":`Evidence`,children:n.evidence.map(e=>(0,G.jsx)(`li`,{children:(0,G.jsx)(`a`,{href:t(n.runId,e),target:`_blank`,rel:`noreferrer`,children:e.split(`/`).pop()})},e))})]})}function ie({c:e,onAdded:t}){let r=_(),[a,s]=(0,W.useState)(`passed`),[c,u]=(0,W.useState)(``),[d,f]=(0,W.useState)(!1),p=async()=>{f(!0);try{await l.addCaseResult(e.id,{result:a,...c.trim()?{notes:c.trim()}:{}}),u(``),r.show({title:`${U[a]} saved on ${e.key}`,tone:`success`}),t()}catch(e){r.show({title:`Could not save the result`,body:Z(e),tone:`error`})}finally{f(!1)}};return(0,G.jsxs)(`div`,{className:`case-add`,children:[(0,G.jsx)(o,{label:`Result`,className:`case-add__result`,children:(0,G.jsx)(n,{value:a,onChange:e=>s(e.target.value),children:ee.map(e=>(0,G.jsx)(`option`,{value:e,children:U[e]},e))})}),(0,G.jsx)(o,{label:`Notes`,className:`case-add__notes`,children:(0,G.jsx)(i,{rows:2,value:c,onChange:e=>u(e.target.value)})}),(0,G.jsx)(g,{onClick:()=>void p(),loading:d,children:`Save result`})]})}function ae({c:t,repo:n,onEdit:r,onChanged:i}){let a=_(),[o,s]=(0,W.useState)(!1),[c,u]=(0,W.useState)(!1),d=async()=>{u(!0);try{await l.updateCase(t.dotId,t.id,{status:`ready`}),a.show({title:`${t.key} is ready. It runs on the next pass.`,tone:`success`}),i()}catch(e){a.show({title:`Could not mark the test case ready`,body:Z(e),tone:`error`})}finally{u(!1)}},f=async()=>{s(!0);try{await l.retireCase(t.dotId,t.id),a.show({title:`${t.key} is archived. Its results stay.`,tone:`success`}),i()}catch(e){a.show({title:`Could not archive the test case`,body:Z(e),tone:`error`})}finally{s(!1)}};return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(E,{dotId:t.dotId,kind:`case`,id:t.id}),(0,G.jsxs)(`dl`,{className:`case-meta`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`Kind`}),(0,G.jsx)(`dd`,{children:F[t.kind]})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`Priority`}),(0,G.jsx)(`dd`,{children:N[t.priority]})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`Status`}),(0,G.jsx)(`dd`,{children:D[t.status]})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`Written by`}),(0,G.jsx)(`dd`,{children:A[t.source]})]}),t.specPath&&(0,G.jsxs)(`div`,{className:`case-meta__wide`,children:[(0,G.jsx)(`dt`,{children:`Spec file`}),(0,G.jsx)(`dd`,{className:`num`,children:t.specPath})]})]}),(0,G.jsxs)(`div`,{className:`case-actions`,children:[t.status===`draft`&&(0,G.jsx)(g,{variant:`primary`,onClick:()=>void d(),loading:c,children:`Mark ready`}),(0,G.jsx)(g,{icon:(0,G.jsx)(v,{size:14}),onClick:r,children:`Edit`}),t.status!==`retired`&&(0,G.jsx)(g,{variant:`ghost`,onClick:()=>void f(),loading:o,children:`Archive`})]}),(0,G.jsx)(Q,{title:`Requirements`,count:t.requirements.length,children:t.requirements.length===0?(0,G.jsx)(`p`,{className:`muted`,children:`No requirement is linked.`}):(0,G.jsx)(`div`,{className:`cases-chips cases-chips--wrap`,children:t.requirements.map(t=>(0,G.jsx)(e,{...V(t,n)},t.ref))})}),(0,G.jsx)(Q,{title:`Steps`,count:t.steps.length,children:t.steps.length===0?(0,G.jsx)(`p`,{className:`muted`,children:`No steps yet.`}):(0,G.jsx)(`ol`,{className:`case-steps-view`,children:t.steps.map((e,t)=>(0,G.jsxs)(`li`,{children:[(0,G.jsx)(`p`,{children:e.action}),e.expected&&(0,G.jsxs)(`p`,{className:`case-steps-view__expected`,children:[(0,G.jsx)(`span`,{className:`muted`,children:`Expected: `}),e.expected]})]},t))})}),(0,G.jsxs)(Q,{title:`Latest results`,count:t.results.length,children:[t.results.length===0?(0,G.jsx)(`p`,{className:`muted`,children:t.specPath?`Not run yet. A run of the spec file writes its result here.`:`Not run yet.`}):(0,G.jsx)(`ul`,{className:`case-results list-box`,children:t.results.slice(0,10).map(e=>(0,G.jsx)(re,{r:e},e.id))}),t.status!==`retired`&&(0,G.jsx)(ie,{c:t,onAdded:i})]})]})}function oe({dotId:e,caseRef:t,repo:n,folderId:i,onClose:a,onCreated:o}){let s=t===`new`,[u,d]=(0,W.useState)(null),[p,m]=(0,W.useState)(!1),[h,g]=(0,W.useState)(null),_=b(t&&!s?Y(e,t):null,n=>l.testCase(e,t,n),{refreshOn:[`run`],throttleMs:1500}),v=t&&!s?_.data:void 0,y=!!v&&u===v.id,C=()=>{x(X(e)),t&&!s&&x(Y(e,t))},w=()=>{d(null),g(null),a()},T=async n=>{m(!0),g(null);try{if(s){let t=await l.createCase(e,i?{...n,folderId:i}:n);S(Y(e,t.key),t),x(X(e)),o(t.key)}else if(v){let r=await l.updateCase(e,v.id,n);S(Y(e,t),r),x(X(e)),d(null)}}catch(e){g(Z(e))}finally{m(!1)}},E=s?`New test case`:v?`${v.key} ${v.title}`:t??`Test case`;return(0,G.jsxs)(f,{open:!!t,onClose:w,side:`right`,title:E,description:`Test case details`,hideDescription:!0,className:`case-drawer`,children:[s&&(0,G.jsx)(J,{saving:p,error:h,onSave:e=>void T(e),onCancel:w},`new`),!s&&_.error&&!v?(0,G.jsx)(r,{compact:!0,title:`Could not load this test case`,error:_.error,onRetry:()=>void _.reload()}):null,!s&&!v&&!_.error?(0,G.jsx)(c,{label:`Loading the test case`}):null,v&&y&&(0,G.jsx)(J,{initial:v,saving:p,error:h,onSave:e=>void T(e),onCancel:()=>{d(null),g(null)}},v.id),v&&!y&&(0,G.jsx)(ae,{c:v,repo:n,onEdit:()=>d(v.id),onChanged:C})]})}var $=e=>e instanceof Error?e.message:`Something went wrong.`;function se({item:e}){let t=k(e.currentSteps,e.changes);return t.length?(0,G.jsxs)(`details`,{className:`impact-row__steps`,children:[(0,G.jsx)(`summary`,{children:t.length===1?`Show the changed step`:`Show the ${t.length} changed steps`}),(0,G.jsx)(`ol`,{className:`impact-steps`,children:t.map(e=>(0,G.jsxs)(`li`,{className:`impact-steps__pair`,children:[(0,G.jsxs)(`span`,{className:`impact-steps__n num`,children:[`Step `,e.n]}),(0,G.jsxs)(`p`,{className:`impact-steps__before`,children:[(0,G.jsx)(`span`,{className:`impact-steps__label`,children:`Now`}),` `,e.before?j(e.before):`No step`]}),(0,G.jsxs)(`p`,{className:`impact-steps__after`,children:[(0,G.jsx)(`span`,{className:`impact-steps__label`,children:`New`}),` `,e.after?j(e.after):`Step removed`]})]},e.n))})]}):null}function ce({item:e,onDone:t}){let n=_(),[r,i]=(0,W.useState)(null);if(e.state!==`open`||e.verdict===`valid`)return null;if(e.verdict===`obsolete`)return(0,G.jsx)(`div`,{className:`impact-row__actions`,children:(0,G.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:`#/inbox`,children:(0,G.jsx)(`span`,{className:`btn__label`,children:`Decide in the Inbox`})})});let a=e.subject===`spec`,o=async r=>{i(r);try{await l.decideImpact(e.dotId,e.id,r),x(L(e.dotId)),x(X(e.dotId)),x(T(e.dotId)),n.show({title:r===`accept`?a?`Marked as updated`:`${e.caseKey} has a new version`:a?`Dismissed`:`Draft rejected`,body:r===`accept`&&!a?`The old version stays in its history.`:void 0,tone:`success`}),t()}catch(e){n.show({title:`Could not save the decision`,body:$(e),tone:`error`})}finally{i(null)}};return(0,G.jsxs)(`div`,{className:`impact-row__actions`,children:[(0,G.jsx)(g,{size:`sm`,variant:`primary`,loading:r===`accept`,disabled:r!==null,onClick:()=>void o(`accept`),children:a?`Mark as updated`:`Accept new version`}),(0,G.jsx)(g,{size:`sm`,loading:r===`reject`,disabled:r!==null,onClick:()=>void o(`reject`),children:a?`Dismiss`:`Reject`})]})}function le({items:t,repo:n,showTicket:r=!1,onDone:i=()=>{}}){return(0,G.jsx)(`ul`,{className:`impact-list`,"aria-label":`Existing tests checked`,children:t.map(t=>(0,G.jsx)(`li`,{className:`impact-row mark-cq`,"data-verdict":t.verdict,"data-state":t.state,children:(0,G.jsxs)(`div`,{className:`impact-row__grid`,children:[(0,G.jsx)(`div`,{className:`impact-row__status`,children:(0,G.jsx)(ne,{item:t,fold:`always`})}),(0,G.jsxs)(`div`,{className:`impact-row__main`,children:[(0,G.jsxs)(`div`,{className:`impact-row__chips`,children:[(0,G.jsx)(e,{...t.subject===`case`?te(t):z(t)}),r&&(0,G.jsx)(e,{...M(t,n)})]}),(0,G.jsxs)(`p`,{className:`impact-row__note`,children:[t.note,t.confidence===`low`&&t.verdict===`valid`&&(0,G.jsxs)(`span`,{className:`impact-row__conf muted`,children:[` `,R.low,`.`]})]}),t.ticketLine&&(0,G.jsxs)(`p`,{className:`impact-row__line`,children:[(0,G.jsx)(`span`,{className:`muted`,children:`The ticket says:`}),` `,t.ticketLine]}),t.verdict===`update`&&t.subject===`case`&&(0,G.jsx)(se,{item:t})]}),(0,G.jsx)(ce,{item:t,onDone:i})]})},t.id))})}export{oe as n,X as r,le as t};
2
+ //# sourceMappingURL=ImpactList-C-RNuDB0.js.map
@@ -0,0 +1 @@
1
+ .impact-list{background:var(--surface);border:var(--hairline);border-radius:var(--radius-md);margin:0;padding:0;list-style:none;overflow:hidden}.impact-row+.impact-row{border-top:var(--hairline)}.impact-row__grid{grid-template-columns:calc(var(--space-12) * 3) minmax(0, 1fr) auto;align-items:start;gap:var(--space-3);padding:var(--space-3);font-size:var(--text-sm);display:grid}.impact-row__status{padding-top:var(--space-0-5);min-width:0}.impact-row__main{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}.impact-row__chips{align-items:center;gap:var(--space-1) var(--space-2);flex-wrap:wrap;min-width:0;display:flex}.impact-row__note,.impact-row__line{overflow-wrap:anywhere;margin:0}.impact-row__line{color:var(--text-2)}.impact-row__actions{justify-content:flex-end;gap:var(--space-2);flex-wrap:wrap;display:flex}.impact-row__actions .btn{white-space:nowrap;flex:none}.impact-row__steps summary{cursor:pointer;color:var(--text-2);font-size:var(--text-xs)}.impact-steps{margin:var(--space-2) 0 0;border:var(--hairline);border-radius:var(--radius-md);padding:0;list-style:none}.impact-steps__pair{gap:var(--space-1);padding:var(--space-2) var(--space-3);display:grid}.impact-steps__pair+.impact-steps__pair{border-top:var(--hairline)}.impact-steps__pair p{overflow-wrap:anywhere;margin:0}.impact-steps__n{color:var(--text-3);font-size:var(--text-xs)}.impact-steps__label{min-width:var(--space-8);color:var(--text-3);font-size:var(--text-xs);display:inline-block}.impact-steps__after{font-weight:var(--weight-medium)}@container markcq (width<=560px){.impact-row__grid{gap:var(--space-2);grid-template-columns:minmax(0,1fr)}.impact-row__actions{justify-content:flex-start}}.impact-panel{margin-bottom:var(--space-4)}.impact-panel__summary{align-items:center;gap:var(--space-2);min-height:var(--row);cursor:pointer;font-weight:var(--weight-semibold);font-size:var(--text-md);display:flex}.impact-panel__count{color:var(--text-3);font-weight:var(--weight-regular);font-size:var(--text-sm)}.impact-panel__words{margin:var(--space-1) 0 var(--space-3);color:var(--text-2);font-size:var(--text-sm)}.needs-review{min-width:0;display:inline-flex}
@@ -0,0 +1,2 @@
1
+ import{B as e,E as t,G as n,H as r,L as i,R as a,Tn as o,U as s,Vn as c,W as l,Wn as u,_ as d,b as f,mn as p,n as m,q as h,x as g,z as _}from"./ui-DcmhYyYp.js";import{i as v}from"./store-IqrqHuFR.js";import{s as y}from"./data-CmXvx3Mj.js";import{$t as b,Bt as x,Ht as S,Qt as C,Ut as w,cn as T,en as E,tn as D,un as O,zt as k}from"./index-B6qKm1NW.js";import{t as A}from"./ApprovalCard-CfGhGFo_.js";import{r as j,t as M}from"./CardFromRef-BaTGmZ9c.js";import{t as N}from"./FailedDeliveries-1F2kFcs9.js";var P=u(c(),1),F=p();function I({group:e,dotId:t}){let n=E(e);return n?(0,F.jsx)(`div`,{className:`inbox__group-card`,children:(0,F.jsx)(j,{children:(0,F.jsx)(M,{...n,dotId:t,quiet:!0})})}):null}var L=`approvals:recent`;function R({item:t}={}){let i=y(),c=v(L,e=>o.listApprovals({limit:40},e),{refreshOn:[`approval`],throttleMs:300}),u=h(),[d,f]=(0,P.useState)(()=>Date.now());(0,P.useEffect)(()=>{let e=setInterval(()=>f(Date.now()),6e4);return()=>clearInterval(e)},[]);let p=(0,P.useMemo)(()=>(i.data??[]).filter(e=>w(e,d)===`pending`).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),[i.data,d]),m=(0,P.useMemo)(()=>{let e=new Set(p.map(e=>e.id)),t=[...(i.data??[]).filter(t=>!e.has(t.id)),...(c.data??[]).filter(e=>e.status!==`pending`||w(e,d)===`expired`)];return[...new Map(t.map(e=>[e.id,e])).values()].filter(t=>!e.has(t.id)).sort((e,t)=>(t.decidedAt??t.expiresAt??t.createdAt).localeCompare(e.decidedAt??e.expiresAt??e.createdAt)).slice(0,30)},[p,i.data,c.data,d]),_=p.some(e=>e.id===t);(0,P.useEffect)(()=>{if(!t||!_)return;let e=document.querySelector(`[data-approval-id="${CSS.escape(t)}"]`);if(!e)return;e.scrollIntoView?.({block:`center`}),e.classList.add(`approval--linked`);let n=setTimeout(()=>e.classList.remove(`approval--linked`),4e3);return()=>clearTimeout(n)},[t,_]);let x=e(1e3,i.startedAt)&&i.loading,S=p.length,C=(0,P.useMemo)(()=>b(p),[p]),T=m.filter(e=>e.status===`superseded`),E=m.filter(e=>e.status!==`superseded`);return(0,F.jsxs)(`div`,{className:`page inbox`,children:[(0,F.jsx)(`header`,{className:`page__header`,children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`h1`,{className:`page__title`,children:`Inbox`}),i.data&&(0,F.jsx)(`p`,{className:`page__subtitle`,children:S===0?`Nothing to review`:S===1?`1 item to review`:`${S} items to review`})]})}),(0,F.jsxs)(`section`,{className:`inbox__section`,"aria-labelledby":`inbox-waiting`,children:[(0,F.jsxs)(`h2`,{id:`inbox-waiting`,className:`inbox__heading`,children:[`To review`,i.refreshing&&(0,F.jsx)(`span`,{className:`inbox__refresh`,children:`Updating`})]}),i.loading?(0,F.jsx)(V,{since:i.startedAt}):i.error&&!i.data?(0,F.jsx)(r,{compact:!0,title:`Could not load the items to review`,error:i.error,onRetry:()=>void i.reload()}):S===0?(0,F.jsx)(n,{kind:`zero`,art:(0,F.jsx)(g,{name:`moss`,state:`ok`,size:64,decorative:!0}),title:`Nothing to review`,body:`Posts and test runs that need you show up here.`}):(0,F.jsxs)(F.Fragment,{children:[i.error&&(0,F.jsx)(r,{compact:!0,title:`Could not refresh. Showing the last list.`,error:i.error,onRetry:()=>void i.reload()}),(0,F.jsx)(`div`,{className:`inbox__groups`,children:C.map(e=>(0,F.jsxs)(`section`,{className:`inbox__group`,"aria-label":e.repo?`${e.label} in ${e.repo}`:e.label,children:[(0,F.jsxs)(`h3`,{className:`inbox__group-head`,children:[(0,F.jsx)(z,{group:e}),(0,F.jsxs)(`span`,{className:`inbox__group-meta`,children:[e.repo&&(0,F.jsx)(`span`,{children:e.repo}),(0,F.jsx)(`span`,{children:e.items.length===1?`1 item`:`${e.items.length} items`})]})]}),e.head&&(0,F.jsx)(l,{className:`inbox__group-details`,children:(0,F.jsxs)(`p`,{children:[`Reviewed version `,(0,F.jsx)(`code`,{title:e.head,children:e.head.slice(0,7)})]})}),(0,F.jsx)(I,{group:e,dotId:e.items[0]?.watchId}),(0,F.jsx)(`ul`,{className:`inbox__list`,children:e.items.map(e=>(0,F.jsx)(`li`,{children:(0,F.jsx)(A,{approval:e,stale:s(i.error),onSettled:(e,t)=>u.show({tone:e.retry?`info`:`success`,...O(e,t)})})},e.id))})]},e.key))})]})]}),(0,F.jsx)(N,{}),(0,F.jsxs)(`section`,{className:`inbox__section`,"aria-labelledby":`inbox-recent`,children:[(0,F.jsx)(`h2`,{id:`inbox-recent`,className:`inbox__heading`,children:`Decided`}),c.loading&&!m.length?(0,F.jsx)(a,{rows:4,delayMs:x?0:1e3,label:`Loading what you decided`,since:c.startedAt}):c.error&&!c.data&&!m.length?(0,F.jsx)(r,{compact:!0,title:`Could not load what you decided`,error:c.error,onRetry:()=>void c.reload()}):m.length===0?(0,F.jsx)(`p`,{className:`inbox__none`,children:`Nothing decided yet. What you post, skip or let drop shows up here.`}):(0,F.jsxs)(F.Fragment,{children:[E.length>0&&(0,F.jsx)(`ul`,{className:`rows`,children:E.map(e=>(0,F.jsx)(B,{a:e},e.id))}),T.length>0&&(0,F.jsxs)(`details`,{className:`inbox__superseded`,children:[(0,F.jsxs)(`summary`,{children:[T.length===1?`1 older version`:`${T.length} older versions`,(0,F.jsx)(`span`,{className:`inbox__superseded-hint`,children:` replaced by a newer one, nothing sent`})]}),(0,F.jsx)(`ul`,{className:`rows`,children:T.map(e=>(0,F.jsx)(B,{a:e},e.id))})]})]})]})]})}function z({group:e}){let n=D(e);return n?(0,F.jsx)(t,{className:`inbox__group-chip`,...n}):(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(`span`,{className:`inbox__group-icon`,"aria-hidden":`true`,children:(0,F.jsx)(m,{kind:e.items[0]?.action.kind??``})}),(0,F.jsx)(`span`,{className:`inbox__group-title`,children:e.label})]})}function B({a:e}){let t=w(e),n=t===`expired`?e.decidedAt??e.expiresAt:e.executedAt??e.decidedAt,r=(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(f,{kind:k[t],label:x[t],decorative:!0}),(0,F.jsxs)(`span`,{className:`row__main`,children:[(0,F.jsx)(`span`,{className:`row__title inbox__row-title`,children:e.action.title||S(e.action.kind)}),(0,F.jsxs)(`span`,{className:`row__meta inbox__row-meta`,children:[(0,F.jsx)(`span`,{className:`inbox__row-phase narrow-hide`,children:x[t]}),(0,F.jsx)(d,{icon:(0,F.jsx)(m,{kind:e.action.kind,size:14}),label:S(e.action.kind)}),t===`expired`&&e.closedReason&&(0,F.jsx)(`span`,{children:e.closedReason.replace(/\.$/,``)}),e.dotName&&(0,F.jsx)(`span`,{children:e.dotName}),e.decidedBy&&(t===`executed`||t===`approved`||t===`rejected`)&&(0,F.jsxs)(`span`,{children:[`by `,e.decidedBy]}),n&&(0,F.jsx)(`time`,{dateTime:n,title:C(n),children:T(n)})]})]})]});return(0,F.jsx)(`li`,{children:e.runId?(0,F.jsx)(`a`,{className:`row inbox__row`,href:`#/runs/${encodeURIComponent(e.runId)}`,children:r}):(0,F.jsx)(`div`,{className:`row inbox__row`,children:r})})}function V({since:t}){let n=e(1e3,t);return(0,F.jsxs)(`div`,{className:`inbox__list`,role:`status`,"aria-label":`Loading items to review`,"aria-busy":`true`,children:[n&&[0,1].map(e=>(0,F.jsxs)(`div`,{className:`approval inbox__skeleton`,children:[(0,F.jsx)(i,{width:`30%`,height:10}),(0,F.jsx)(i,{width:`70%`,height:16}),(0,F.jsx)(i,{width:`45%`,height:10}),(0,F.jsx)(i,{width:`100%`,height:72,radius:6}),(0,F.jsxs)(`div`,{className:`inbox__skeleton-actions`,children:[(0,F.jsx)(i,{width:96,height:40,radius:6}),(0,F.jsx)(i,{width:72,height:40,radius:6}),(0,F.jsx)(i,{width:80,height:40,radius:6})]})]},e)),(0,F.jsx)(_,{since:t,ready:n})]})}export{R as default};
2
+ //# sourceMappingURL=Inbox-kc1bKVL_.js.map
@@ -0,0 +1,2 @@
1
+ import{Cn as e,M as t,N as n,Nn as r,P as i,Tn as a,Vn as o,W as s,Wn as c,bt as l,mn as u,nt as d,pn as f,pt as p,x as m}from"./ui-DcmhYyYp.js";import{r as h}from"./router-W6nZsQ33.js";import{n as g,o as _}from"./store-IqrqHuFR.js";import{i as v,r as y}from"./index-B6qKm1NW.js";import{m as b,s as ee}from"./phoneApi-BG_1-M-D.js";import{r as x,t as S}from"./UpdatesSection-CCWEbkue.js";var C=c(o(),1),w=u(),T=[{key:`code`,label:`Join`},{key:`updates`,label:`Updates`},{key:`tour`,label:`Tour`}],E=[{icon:(0,w.jsx)(l,{size:18}),title:`Inbox`,body:`Posts wait here for your OK. Post or skip one, and your name goes on it.`},{icon:(0,w.jsx)(p,{size:18}),title:`A check page`,body:`Each check has a page with what the dot read, what it found, and what it wants to post.`},{icon:(0,w.jsx)(d,{size:18}),title:`@dot in Slack`,body:`Mention the dot in Slack to ask a question or run the tests again. It answers in the thread.`}];function D(t){if(t instanceof e){if(t.status===400)return`That code is wrong or has expired. Ask your admin for a new one.`;if(t.status===429)return`Too many wrong tries. Wait a few minutes, then try again.`;if(t.status===409||t.status===422||t.status===0)return t.message}return t instanceof Error?t.message:String(t)}function O({code:o}){let[c,l]=(0,C.useState)(`code`),[u,d]=(0,C.useState)(null),[p,O]=(0,C.useState)(null),[te,k]=(0,C.useState)(!1),[A,j]=(0,C.useState)(``),[M,N]=(0,C.useState)(o??``),[P,F]=(0,C.useState)(!1),[ne,I]=(0,C.useState)(null),[L,R]=(0,C.useState)(null),[z,B]=(0,C.useState)(`everything`),[V,H]=(0,C.useState)({on:!1,start:`22:00`,end:`08:00`}),[U,W]=(0,C.useState)(null),[G,K]=(0,C.useState)(``),[q,J]=(0,C.useState)(null),[Y,X]=(0,C.useState)(!1),Z=(0,C.useRef)(null),Q=(0,C.useRef)(!0),re=typeof location>`u`?`this server`:location.hostname,$=p??re;(0,C.useEffect)(()=>{let e=new AbortController;return b.join(e.signal).then(e=>{O(e.name),k(e.empty===!0)}).catch(()=>void 0),()=>e.abort()},[]),(0,C.useEffect)(()=>{o&&h(`#/join`,{replace:!0})},[o]),(0,C.useEffect)(()=>{document.title=`Join ${$} - localdost`},[$]),(0,C.useEffect)(()=>{if(Q.current){Q.current=!1;return}Z.current?.focus({preventScroll:!0})},[c]);let ie=async t=>{t.preventDefault();let n=A.trim(),i=M.trim();if(I(n?null:`Type your name so the team can see who gave the OK.`),R(i?null:`Type the code your admin sent.`),n&&i){F(!0);try{let e=await b.exchange({code:i,name:n});v(),r(e.token),_.restart(),g(``),d(e.device),N(``),l(`updates`)}catch(t){t instanceof e&&(t.status===409||t.status===422)?I(D(t)):R(D(t))}finally{F(!1)}}},ae=async e=>{e.preventDefault();let t=G.trim();if(!t){J(`Paste the admin key.`);return}X(!0),J(null);try{let e=await ee(t);if(e===`wrong`)return J(`That is not the admin key. Not the admin? Use the invite code from your admin.`);if(e===`unreachable`)return J(`Could not reach the server. Try again.`);r(t),_.restart(),g(``),K(``),h(`#/welcome`)}finally{X(!1)}},oe=async()=>{if(u){F(!0),W(null);try{await a.saveUpdatePrefs(`device:${u.id}`,{level:z,quiet:V}),l(`tour`)}catch(e){W(`${e instanceof Error?e.message:`Could not save.`} Try again, or skip for now.`)}finally{F(!1)}}};return(0,w.jsx)(`main`,{className:`join qd-touch`,"aria-labelledby":`join-title`,children:(0,w.jsxs)(`div`,{className:`join__card`,children:[(0,w.jsxs)(`div`,{className:`join__brand`,children:[(0,w.jsx)(m,{name:`pip`,state:`ok`,size:32,decorative:!0}),(0,w.jsx)(`span`,{className:`join__brand-name`,children:`localdost`})]}),(0,w.jsx)(`ol`,{className:`join__steps`,"aria-label":`Steps`,children:T.map((e,t)=>(0,w.jsxs)(`li`,{className:`join__step${e.key===c?` is-current`:``}`,"aria-current":e.key===c?`step`:void 0,children:[(0,w.jsx)(`span`,{className:`join__step-n num`,"aria-hidden":`true`,children:t+1}),e.label]},e.key))}),c===`code`&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`h1`,{id:`join-title`,className:`join__title`,ref:Z,tabIndex:-1,children:[`Join `,$]}),(0,w.jsx)(`p`,{className:`join__lead`,children:`Use the invite code from your admin.`}),(0,w.jsxs)(`form`,{className:`join__form`,onSubmit:e=>void ie(e),noValidate:!0,children:[(0,w.jsx)(n,{label:`Your name`,hint:`Teammates see this name when you OK something.`,error:ne,children:(0,w.jsx)(i,{value:A,onChange:e=>j(e.target.value),maxLength:60,autoComplete:`name`,"data-testid":`join-name`})}),(0,w.jsx)(n,{label:`Invite code`,hint:`8 letters and digits, for example K7QM-4ZTP.`,error:L,children:(0,w.jsx)(i,{value:M,onChange:e=>N(e.target.value.toUpperCase()),autoComplete:`one-time-code`,autoCapitalize:`characters`,autoCorrect:`off`,spellCheck:!1,maxLength:12,className:`join__code`,"data-testid":`join-code`})}),(0,w.jsx)(f,{type:`submit`,variant:`primary`,size:`lg`,block:!0,loading:P,children:`Join`})]}),te?(0,w.jsxs)(`form`,{className:`join__admin`,onSubmit:e=>void ae(e),noValidate:!0,"aria-labelledby":`join-admin-title`,children:[(0,w.jsx)(`h2`,{id:`join-admin-title`,className:`join__sub`,children:`Admin? Enter the admin key`}),(0,w.jsx)(n,{label:`Admin key`,hint:`Your admin has it. Teammates use the invite code instead.`,error:q,children:(0,w.jsx)(i,{type:`password`,value:G,onChange:e=>K(e.target.value),autoComplete:`off`,spellCheck:!1,"data-testid":`join-token`})}),(0,w.jsx)(s,{children:(0,w.jsx)(`p`,{children:`The LOCALDOST_TOKEN set on the server: the service Variables on Railway, or the .env file next to compose.yml.`})}),(0,w.jsx)(f,{type:`submit`,variant:`secondary`,size:`lg`,block:!0,loading:Y,children:`Save and open Getting started`})]}):(0,w.jsxs)(`p`,{className:`join__alt`,children:[`Are you the admin? `,(0,w.jsx)(`a`,{href:`#/settings`,children:`Add the admin key in Settings`}),`.`]})]}),c===`updates`&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(`h1`,{id:`join-title`,className:`join__title`,ref:Z,tabIndex:-1,children:`Updates`}),(0,w.jsxs)(`p`,{className:`join__lead`,children:[`Joined as `,u?.name,`, `,u?.role===`editor`?`an editor`:`a member`,`. Choose which alerts reach this device.`]}),(0,w.jsxs)(`div`,{className:`join__form`,children:[(0,w.jsx)(x,{value:z,onChange:B,label:`Updates for you`}),(0,w.jsx)(`p`,{className:`join__help`,children:S[z]}),(0,w.jsx)(t,{checked:V.on,onChange:e=>H({...V,on:e}),label:`Quiet hours`,description:`Alerts that arrive in these hours are skipped, not sent later. The Inbox keeps everything to review.`}),V.on&&(0,w.jsxs)(`div`,{className:`join__quiet`,children:[(0,w.jsx)(n,{label:`From`,children:(0,w.jsx)(i,{type:`time`,value:V.start,onChange:e=>e.target.value&&H({...V,start:e.target.value})})}),(0,w.jsx)(n,{label:`To`,children:(0,w.jsx)(i,{type:`time`,value:V.end,onChange:e=>e.target.value&&H({...V,end:e.target.value})})})]}),U&&(0,w.jsx)(`p`,{className:`join__error`,role:`alert`,children:U}),(0,w.jsxs)(`div`,{className:`join__actions`,children:[(0,w.jsx)(f,{variant:`primary`,size:`lg`,loading:P,onClick:()=>void oe(),children:`Continue`}),(0,w.jsx)(f,{variant:`ghost`,size:`lg`,onClick:()=>l(`tour`),children:`Skip`})]})]})]}),c===`tour`&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(`h1`,{id:`join-title`,className:`join__title`,ref:Z,tabIndex:-1,children:`Quick tour`}),(0,w.jsx)(`p`,{className:`join__lead`,children:`Where to find things.`}),(0,w.jsx)(`ol`,{className:`join__tour`,children:E.map((e,t)=>(0,w.jsxs)(`li`,{className:`join__tour-card`,children:[(0,w.jsx)(`span`,{className:`join__tour-icon`,"aria-hidden":`true`,children:e.icon}),(0,w.jsxs)(`span`,{className:`join__tour-text`,children:[(0,w.jsxs)(`span`,{className:`join__tour-title`,children:[(0,w.jsxs)(`span`,{className:`num`,children:[t+1,`.`]}),` `,e.title]}),(0,w.jsx)(`span`,{className:`join__tour-body`,children:e.body})]})]},e.title))}),(0,w.jsx)(f,{variant:`primary`,size:`lg`,block:!0,onClick:()=>{y(),h(`#/inbox`)},children:`Open Inbox`})]})]})})}export{O as default,D as joinError};
2
+ //# sourceMappingURL=JoinScreen-C3L4wmP3.js.map
@@ -0,0 +1 @@
1
+ .join{min-height:100dvh;padding:clamp(var(--space-6), 10vh, 96px) var(--gutter) var(--space-10);background:var(--bg);justify-content:center;align-items:flex-start;display:flex}.join__card{gap:var(--space-4);width:100%;min-width:0;max-width:440px;padding:var(--space-6);background:var(--surface);border:var(--hairline);border-radius:var(--radius-lg);box-shadow:var(--shadow-1);flex-direction:column;display:flex}.join__brand{align-items:center;gap:var(--space-2);display:flex}.join__brand-name{font-weight:var(--weight-semibold)}.join__steps{gap:var(--space-1) var(--space-4);font-size:var(--text-sm);color:var(--text-3);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.join__step{align-items:center;gap:var(--space-2);white-space:nowrap;display:inline-flex}.join__step-n{border-radius:var(--radius-full);border:1px solid var(--border-strong);width:20px;height:20px;font-size:var(--text-xs);justify-content:center;align-items:center;display:inline-flex}.join__step.is-current{color:var(--text);font-weight:var(--weight-medium)}.join__step.is-current .join__step-n{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}.join__title{font-size:var(--text-xl);overflow-wrap:anywhere}.join__title:focus{outline:none}.join__lead{color:var(--text-2);margin-top:calc(var(--space-2) * -1)}.join__form{gap:var(--space-4);flex-direction:column;min-width:0;display:flex}.join__code,input.join__code{font-family:var(--font-mono);letter-spacing:.08em;font-size:20px}.join__alt{font-size:var(--text-sm);color:var(--text-3)}.join__admin{gap:var(--space-3);min-width:0;padding-top:var(--space-4);border-top:var(--hairline);flex-direction:column;display:flex}.join__sub{font-size:var(--text-md);font-weight:var(--weight-semibold)}.join__help{font-size:var(--text-sm);color:var(--text-3);max-width:64ch}.join__error{font-size:var(--text-sm);color:var(--outage-fg)}.join__quiet{gap:var(--space-3);flex-wrap:wrap;display:flex}.join__quiet .field{flex:130px;min-width:0}.join__actions{gap:var(--space-2);flex-wrap:wrap;display:flex}.join .updates__levels{overflow-x:auto}.join .updates__levels .segmented__item{white-space:nowrap;flex:none}.join__tour{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.join__tour-card{align-items:flex-start;gap:var(--space-3);padding:var(--space-3);background:var(--surface-2);border-radius:var(--radius-md);display:flex}.join__tour-icon{border-radius:var(--radius-full);background:var(--surface);width:32px;height:32px;color:var(--text-2);flex:none;justify-content:center;align-items:center;display:inline-flex}.join__tour-text{gap:var(--space-0-5);flex-direction:column;min-width:0;display:flex}.join__tour-title{font-weight:var(--weight-semibold)}.join__tour-body{font-size:var(--text-sm);color:var(--text-2);text-wrap:pretty}@media (max-width:480px){.join__card{padding:var(--space-5)}}
@@ -0,0 +1,8 @@
1
+ import{Cn as e,D as t,F as n,G as r,H as i,I as a,It as o,J as s,L as c,Lt as l,M as u,Mn as d,N as f,P as p,R as m,Tn as h,Vn as g,W as _,Wn as v,_n as y,at as b,b as x,bn as S,cn as C,gn as w,h as T,in as E,it as D,mn as O,pn as k,q as A,sn as ee,ut as j,v as M,x as te,xt as N,yn as P}from"./ui-DcmhYyYp.js";import{s as ne}from"./router-W6nZsQ33.js";import{i as F,n as I,r as L}from"./store-IqrqHuFR.js";import{a as re,c as ie,l as ae,o as oe,t as R}from"./data-CmXvx3Mj.js";import{Tt as se,mn as ce,vt as le}from"./index-B6qKm1NW.js";import{r as z}from"./true-9Q68cs5b.js";/* empty css */import{N as ue,f as de,k as fe,t as pe,w as me}from"./ModelChoices-BxO1zyyr.js";import{B as he,C as B,D as ge,E as _e,F as ve,G as ye,H as be,I as xe,K as Se,L as Ce,O as we,P as V,R as Te,T as Ee,U as De,W as Oe,_ as ke,a as Ae,d as je,f as Me,g as Ne,h as Pe,i as Fe,j as Ie,k as Le,l as Re,m as ze,n as Be,o as Ve,p as He,r as Ue,s as We,t as Ge,u as Ke,v as qe,w as Je,z as Ye}from"./RunnerTry-Dgpp67-s.js";import{t as Xe}from"./ConfirmDialog-CIMveD-b.js";/* empty css */var H=v(g(),1),U=O();function Ze(e,t){return t.trim()===e.name.trim()}var Qe=[`Checks and their reports`,`Items to review and sent items`,`Memory and chat`,`Test cases and their results`,`Updates it received, and queued jobs`,`Artifacts: screenshots, videos, and traces`];function $e({open:e,dot:t,onClose:n,onRemoved:r}){let a=A(),o=!!t.archived,[c,l]=(0,H.useState)(`archive`),[u,d]=(0,H.useState)(``),[m,g]=(0,H.useState)(!1),[_,v]=(0,H.useState)(null),[y,b]=(0,H.useState)(null),x=(0,H.useRef)(null),[S,C]=(0,H.useState)(null),[w,T]=(0,H.useState)(e);e!==w&&(T(e),e&&(C(null),l(`archive`),d(``),v(null),b(null),g(!1))),(0,H.useEffect)(()=>{if(!e)return;let n=new AbortController;return h.deletePreview(t.id,n.signal).then(C).catch(()=>void 0),()=>n.abort()},[e,t.id]),(0,H.useEffect)(()=>{y&&x.current?.scrollIntoView?.({block:`nearest`})},[y]);let E=o?`delete`:c,D=E===`archive`||Ze(t,u),O=async()=>{if(!m){if(!D){b(`Type ${t.name} exactly to delete it.`),x.current?.querySelector(`input`)?.focus({preventScroll:!0});return}g(!0),v(null);try{let e=await h.removeDot(t.id,E,E===`delete`?u.trim():void 0);I(R.dots),a.show(E===`archive`?{tone:`success`,title:`${t.name} is archived`,body:`Restore it any time from Settings, under Archived dots.`}:{tone:`success`,title:`${t.name} is deleted`}),r?.(E,e),n()}catch(e){v(e)}finally{g(!1)}}};return(0,U.jsx)(s,{open:e,onClose:m?()=>{}:n,title:o?`Delete ${t.name} permanently?`:`Remove ${t.name}?`,description:o?`This dot is archived. You can restore it, or delete it for good.`:`Pick what happens to this dot.`,role:`alertdialog`,size:`md`,className:`rd`,initialFocus:`[data-cancel]`,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(k,{variant:`ghost`,"data-cancel":!0,onClick:n,disabled:m,children:`Cancel`}),(0,U.jsx)(k,{variant:E===`archive`?`primary`:`danger`,loading:m,onClick:()=>void O(),children:E===`archive`?`Archive dot`:`Delete permanently`})]}),children:(0,U.jsxs)(`div`,{className:`rd__body`,children:[_!=null&&(0,U.jsx)(i,{compact:!0,error:_,title:E===`archive`?`Could not archive the dot`:`Could not delete the dot`}),!o&&(0,U.jsxs)(`fieldset`,{className:`choice-row choice-row--stack rd__choices`,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`What should happen?`}),(0,U.jsxs)(`label`,{className:`choice${c===`archive`?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`rd-mode`,value:`archive`,checked:c===`archive`,onChange:()=>l(`archive`)}),(0,U.jsxs)(`span`,{className:`choice__text`,children:[(0,U.jsx)(`span`,{className:`choice__label`,children:`Archive`}),(0,U.jsx)(`span`,{className:`choice__help`,children:`The dot stops watching and leaves the sidebar. Its runs, test cases, and history stay. You can restore it later from Settings.`})]})]}),(0,U.jsxs)(`label`,{className:`choice${c===`delete`?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`rd-mode`,value:`delete`,checked:c===`delete`,onChange:()=>l(`delete`)}),(0,U.jsxs)(`span`,{className:`choice__text`,children:[(0,U.jsx)(`span`,{className:`choice__label`,children:`Delete permanently`}),(0,U.jsx)(`span`,{className:`choice__help`,children:`Removes the dot and everything it holds. This cannot be undone.`})]})]})]}),E===`archive`?(0,U.jsxs)(`p`,{className:`rd__note`,children:[`Items from `,t.name,` that wait in the Inbox are dropped, and any check in progress is stopped.`]}):(0,U.jsxs)(`div`,{className:`rd__danger`,role:`group`,"aria-label":`What is deleted`,children:[(0,U.jsxs)(`p`,{className:`rd__note`,children:[`Deleting `,t.name,` removes all of this for good. `,(0,U.jsx)(`strong`,{children:`This cannot be undone.`})]}),(0,U.jsx)(`ul`,{className:`rd__list`,children:Qe.map(e=>(0,U.jsx)(`li`,{children:e},e))}),(0,U.jsx)(`p`,{className:`rd__note`,children:`Items waiting in the Inbox are dropped first.`}),S?.otherRunItems.map(e=>(0,U.jsxs)(`p`,{className:`rd__note`,"data-testid":`other-run-items`,children:[`Also removes `,e.count,` test run `,e.count===1?`item`:`items`,` of `,e.name,`.`]},e.dotId)),S?.onlyMemberOf&&(0,U.jsxs)(`p`,{className:`rd__note`,role:`alert`,"data-testid":`only-member`,children:[t.name,` is the only dot of `,S.onlyMemberOf.name,`. Add another dot to the lead, or delete the lead first.`]}),(0,U.jsx)(`div`,{ref:x,className:`rd__confirm`,children:(0,U.jsx)(f,{label:`Type ${t.name} to confirm`,error:y,children:(0,U.jsx)(p,{"data-field":`confirm-name`,value:u,onChange:e=>{d(e.target.value),b(null)},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),O())},autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})})})]})]})})}var W={verify:!0,minConfidence:.6,showFrom:`medium`,blockOn:null,toolMode:`none`,maxPromptKb:160};function et(e){return{enabled:e.hasRepo,...W,...e.review??{}}}var tt=[.5,.6,.7,.8,.9],nt=[{value:`critical`,label:`Critical only`},{value:`high`,label:`High and above`},{value:`medium`,label:`Medium and above`},{value:`low`,label:`All, including low`}],rt=[{value:`never`,label:`Never`},{value:`critical`,label:`A confirmed critical risk`},{value:`high`,label:`A confirmed high or critical risk`},{value:`medium`,label:`A confirmed medium risk or worse`},{value:`low`,label:`Any confirmed risk`}],G=(e,t)=>t?`${e} (default)`:e;function it({value:e,hasRepo:t,onChange:r}){let i=et({hasRepo:t,review:e});return t?(0,U.jsxs)(`div`,{className:`review-opts`,children:[(0,U.jsx)(u,{checked:i.enabled,onChange:e=>r(`enabled`,e),label:`Review pull requests`,description:i.enabled?`Each PR gets a QA review in its comment and run page.`:`Off. Pull requests only run tests.`}),i.enabled&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(u,{checked:i.verify,onChange:e=>r(`verify`,e),label:`Second pass on each finding`,description:i.verify?`A verifier confirms or drops each risk against the code. Default.`:`Off. Findings show as unverified, and reviews finish faster.`}),(0,U.jsxs)(`div`,{className:`review-opts__grid`,children:[(0,U.jsx)(f,{label:`Confidence floor`,hint:`Risks the reviewer is less sure of are hidden.`,children:(0,U.jsx)(n,{"data-field":`review.minConfidence`,value:String(i.minConfidence??W.minConfidence),onChange:e=>r(`minConfidence`,Number(e.target.value)),options:tt.map(e=>({value:String(e),label:G(`${Math.round(e*100)}%`,e===W.minConfidence)}))})}),(0,U.jsx)(f,{label:`Show risks`,hint:`Lower risks stay on the check page under Review details.`,children:(0,U.jsx)(n,{"data-field":`review.showFrom`,value:i.showFrom??W.showFrom,onChange:e=>r(`showFrom`,e.target.value),options:nt.map(e=>({...e,label:G(e.label,e.value===W.showFrom)}))})}),(0,U.jsx)(f,{label:`Fail the GitHub check on`,hint:`Test failures fail the check either way.`,children:(0,U.jsx)(n,{"data-field":`review.blockOn`,value:i.blockOn??`never`,onChange:e=>r(`blockOn`,e.target.value===`never`?null:e.target.value),options:rt.map(e=>({...e,label:G(e.label,e.value===`never`)}))})}),(0,U.jsx)(f,{label:`What the reviewer reads`,hint:`Reading files is slower and finds callers outside the diff.`,children:(0,U.jsx)(n,{"data-field":`review.toolMode`,value:i.toolMode??W.toolMode,onChange:e=>r(`toolMode`,e.target.value),options:[{value:`none`,label:G(`The diff and its context`,!0)},{value:`read`,label:`The diff, plus files in the repo`}]})})]})]})]}):(0,U.jsx)(`div`,{className:`review-opts`,children:(0,U.jsx)(`p`,{className:`review-opts__note`,children:`This dot has no repository. Add one under Sources, and localdost reviews its pull requests.`})})}var at=[1,2,3,4,5,6,0],ot=e=>e?`Server time (${e}).`:`Server time.`;function st({draft:e,clock:t,onOpen:n}){let r=Ne(e);return(0,U.jsxs)(`div`,{className:`wd-nightly-line`,"data-nightly-summary-block":!0,children:[(0,U.jsx)(`span`,{className:`field__label`,children:`Nightly test run`}),(0,U.jsx)(`p`,{className:`wd-note`,"data-nightly-summary":!0,children:e.nightlyOn?`${r}, server time${t?` (${t})`:``}.`:`${r}.`}),(0,U.jsx)(k,{size:`sm`,className:`wd-nightly-line__open`,onClick:n,children:e.nightlyOn?`Change in Advanced, Test settings`:`Turn on in Advanced, Test settings`})]})}function ct({draft:e,update:t,show:n,touch:r,clock:i}){let a=n=>{t(`nightlyDays`,e.nightlyDays.includes(n)?e.nightlyDays.filter(e=>e!==n):[...e.nightlyDays,n].sort((e,t)=>e-t)),r(`nightlyDays`)},o=n(`nightlyDays`);return(0,U.jsxs)(`fieldset`,{className:`wd-switches`,"data-nightly-fields":!0,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Test settings`}),(0,U.jsx)(u,{checked:e.nightlyOn,onChange:e=>t(`nightlyOn`,e),label:`Nightly test run`,description:`Runs the tests of the Tests repo against the Base URL on a schedule. The result shows in Activity and in the morning digest.`}),e.nightlyOn&&(0,U.jsxs)(`div`,{className:`wd-nightly`,children:[(0,U.jsx)(f,{label:`Time`,error:n(`nightlyTime`),hint:ot(i),children:(0,U.jsx)(p,{"data-field":`nightlyTime`,className:`wd-narrow`,type:`time`,step:60,value:e.nightlyTime,onChange:e=>t(`nightlyTime`,e.target.value),onBlur:()=>r(`nightlyTime`),autoComplete:`off`})}),(0,U.jsxs)(`fieldset`,{className:`wd-days`,"data-nightly-days":!0,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Days`}),(0,U.jsx)(`div`,{className:`wd-days__row`,children:at.map((t,n)=>(0,U.jsx)(`button`,{type:`button`,className:`wd-day${e.nightlyDays.includes(t)?` is-selected`:``}`,"aria-pressed":e.nightlyDays.includes(t),"aria-label":V(t),...n===0?{"data-field":`nightlyDays`}:{},"data-day":t,onClick:()=>a(t),children:V(t).slice(0,3)},t))}),o&&(0,U.jsx)(`p`,{className:`field__error`,children:o})]})]})]})}function lt({names:e,delayMs:t=300}){let n=e.join(`,`),[r,i]=(0,H.useState)(n);(0,H.useEffect)(()=>{let e=setTimeout(()=>i(n),t);return()=>clearTimeout(e)},[n,t]);let a=F(r?`pass-env:${r}`:null,e=>h.passEnvStatus(r.split(`,`),e).then(e=>e.names));if(!n)return null;let o=a.data??[],s=e.map(e=>o.find(t=>t.name===e)).filter(e=>!!e),l=s.some(e=>!e.set);return(0,U.jsxs)(`div`,{className:`wd-env-box`,"data-pass-env":!0,children:[a.error?(0,U.jsx)(`p`,{className:`wd-note`,role:`status`,children:`Could not check which of these variables the server has set.`}):s.length?(0,U.jsx)(`ul`,{className:`wd-env`,"aria-label":`Test login variables on the localdost host`,children:s.map(e=>(0,U.jsxs)(`li`,{className:`wd-env__row`,"data-name":e.name,"data-set":e.set,children:[(0,U.jsxs)(`span`,{className:`wd-env__name`,children:[(0,U.jsx)(`code`,{children:e.name}),(0,U.jsxs)(`span`,{className:`wd-env__as`,children:[`Tests see it as `,e.as]})]}),(0,U.jsx)(M,{kind:e.set?`passed`:`attention`,label:e.set?`Set on the host`:`Not set on the host`,collapse:`never`})]},e.name))}):(0,U.jsx)(c,{width:`60%`,height:14}),l&&(0,U.jsx)(`p`,{className:`wd-note`,role:`status`,children:`A name that is not set on the host is not passed. Set it in the environment of the localdost server, then restart the server.`})]})}var ut=`A PR is in scope when its author is listed or on the team, or it links an issue with one of the labels.`;function dt({draft:e,onChange:t,errors:n={},onBlur:r,hint:i=ut,hideTitle:a}){let o=(0,H.useId)();return(0,U.jsxs)(`div`,{className:`wd-scope`,role:`group`,"aria-labelledby":o,children:[(0,U.jsx)(`p`,{id:o,className:a?`sr-only`:`field__label`,children:`PR scope`}),(0,U.jsx)(`p`,{className:a?`wd-section__hint wd-section__hint--first`:`wd-section__hint`,children:i}),(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Authors`,error:n.prAuthors,hint:`GitHub logins, comma separated.`,children:(0,U.jsx)(p,{"data-field":`prAuthors`,value:e.prAuthors,onChange:e=>t(`prAuthors`,e.target.value),onBlur:()=>r?.(`prAuthors`),placeholder:`alice, bob`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Team`,error:n.prTeam,hint:`org/team. Its members are read from GitHub.`,children:(0,U.jsx)(p,{"data-field":`prTeam`,value:e.prTeam,onChange:e=>t(`prTeam`,e.target.value),onBlur:()=>r?.(`prTeam`),placeholder:`acme/web-team`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Linked issue labels`,hint:`Labels of the issues or tickets a PR links, comma separated.`,children:(0,U.jsx)(p,{"data-field":`prLinkedLabels`,value:e.prLinkedLabels,onChange:e=>t(`prLinkedLabels`,e.target.value),placeholder:`pod:agentic`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})})]}),(0,U.jsx)(u,{checked:e.prSkipDrafts,onChange:e=>t(`prSkipDrafts`,e),label:`Skip drafts`,description:`A draft is reviewed once it is ready.`}),(0,U.jsx)(u,{checked:e.prSkipBots,onChange:e=>t(`prSkipBots`,e),label:`Skip bots`,description:`Renovate, Dependabot, and other bot accounts.`})]})}var ft={env:`the server environment`,file:`a key file`};function pt(e){let t=A(),n=F(Le(e.dotId),t=>h.trueState(e.dotId,t)),[r,i]=(0,H.useState)(!1),[a,o]=(0,H.useState)(null),[s,c]=(0,H.useState)(!1),l=n.data,d=e.trueKey??l?.key,m=async()=>{i(!0),o(null);try{o(await h.trueCheck(e.dotId,{tenantUrl:e.url.trim(),projectId:e.project.trim()})),I(Le(e.dotId))}catch(e){o({ok:!1,message:e instanceof Error?e.message:`The check did not finish.`})}finally{i(!1)}},g=async()=>{c(!0);try{await h.trueResendAll(e.dotId),await n.reload()}catch(e){t.show({title:`Could not send again`,body:e instanceof Error?e.message:`Try again.`,tone:`error`})}finally{c(!1)}};return(0,U.jsxs)(`div`,{className:`true-fields`,"data-true-fields":!0,children:[(0,U.jsx)(u,{checked:e.on,onChange:e.onToggle,label:`Send to True Platform`,description:`Test cases, test runs and results from this dot also go to True Platform.`,disabled:!e.isAdmin,disabledReason:`Ask your localdost admin.`}),(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`True Platform address`,error:e.urlError,hint:`An https address on katalon.io.`,children:(0,U.jsx)(p,{...e.urlProps,readOnly:!e.isAdmin,placeholder:`https://your-team.katalon.io`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`,inputMode:`url`})}),(0,U.jsx)(f,{label:`Project ID`,error:e.projectError,children:(0,U.jsx)(p,{...e.projectProps,readOnly:!e.isAdmin,className:`wd-narrow`,inputMode:`numeric`,placeholder:`3517762`,autoComplete:`off`,spellCheck:!1})})]}),(0,U.jsxs)(`div`,{className:`true-key`,"data-true-key":!0,children:[(0,U.jsx)(`span`,{className:`true-key__label`,children:`Key`}),d?.set?(0,U.jsxs)(`span`,{className:`true-key__value`,children:[`Set on the server`,d.source?`, from ${ft[d.source]}`:``]}):(0,U.jsx)(`span`,{className:`true-key__value true-key__value--missing`,children:`Not set. Ask your admin to set LOCALDOST_KATALON_API_KEY on the localdost server.`}),d?.warning&&(0,U.jsx)(`span`,{className:`true-key__value`,children:d.warning})]}),e.isAdmin?(0,U.jsxs)(`div`,{className:`true-check`,children:[(0,U.jsx)(k,{variant:`secondary`,size:`sm`,onClick:()=>void m(),disabled:r||!e.url.trim()||!e.project.trim(),children:r?`Checking...`:`Check connection`}),a&&(0,U.jsxs)(`span`,{className:`true-check__answer`,role:`status`,"data-true-check":a.ok?`ok`:`failed`,children:[(0,U.jsx)(x,{kind:a.ok?`passed`:`failed`,label:a.ok?`Connected`:`Not connected`,decorative:!0}),a.ok?`Connected to "${a.project}"`:a.message]})]}):(0,U.jsx)(`p`,{className:`wd-note`,children:`Ask your localdost admin.`}),l?.chatServer&&(0,U.jsxs)(`p`,{className:`wd-note`,children:[`Chat reads True Platform through `,l.chatServer]}),l?.sandbox&&(0,U.jsx)(`p`,{className:`wd-note`,children:`Sandbox mode is on, so nothing leaves this server.`}),l&&(0,U.jsx)(_,{children:(0,U.jsxs)(`dl`,{className:`true-facts`,children:[(0,U.jsxs)(`div`,{className:`true-facts__row`,children:[(0,U.jsx)(`dt`,{children:`Folder in True Platform`}),(0,U.jsx)(`dd`,{children:l.folderPath})]}),(0,U.jsxs)(`div`,{className:`true-facts__row`,children:[(0,U.jsx)(`dt`,{children:`Waiting to send`}),(0,U.jsx)(`dd`,{children:l.waiting})]}),(0,U.jsxs)(`div`,{className:`true-facts__row`,children:[(0,U.jsx)(`dt`,{children:`Not sent`}),(0,U.jsx)(`dd`,{children:l.notSent}),l.notSent>0&&(0,U.jsx)(k,{variant:`secondary`,size:`sm`,onClick:()=>void g(),disabled:s,children:`Send all again`})]}),(0,U.jsxs)(`div`,{className:`true-facts__row`,children:[(0,U.jsx)(`dt`,{children:`Last sent`}),(0,U.jsx)(`dd`,{children:l.lastSentAt?z(l.lastSentAt):`Nothing yet`})]})]})})]})}var mt={connected:`Connected`,error:`Error`,disabled:`Off`};function ht({status:e}){return(0,U.jsxs)(`span`,{className:`conn-status conn-status--${e}`,children:[(0,U.jsx)(`span`,{className:`conn-status__dot`,"aria-hidden":`true`}),mt[e]]})}function gt(e){return e.transport===`http`?e.url??``:[e.command,...e.args??[]].filter(Boolean).join(` `)}function _t({connection:e,attached:n,dotName:r,onAttachChange:i,onToggleTool:a,onToggleEnabled:o,onRefresh:s,onEdit:c,onDelete:d,refreshing:f,savingTools:p,defaultOpen:m=!1}){let[h,g]=(0,H.useState)(m),_=(0,H.useId)(),v=e.tools.filter(e=>e.enabled).length,y=e.tools.filter(e=>!e.readOnly).length;return(0,U.jsxs)(`li`,{className:`conn conn--${e.status}`,"data-connection":e.id,children:[(0,U.jsxs)(`div`,{className:`conn__head`,children:[(0,U.jsxs)(`div`,{className:`conn__main`,children:[(0,U.jsxs)(`div`,{className:`conn__title-row`,children:[me(e.preset)&&(0,U.jsx)(t,{brand:me(e.preset),size:16}),(0,U.jsx)(`span`,{className:`conn__name`,children:e.name}),(0,U.jsx)(C,{children:e.transport===`stdio`?`Local command`:`HTTP`}),(0,U.jsx)(ht,{status:e.status})]}),(0,U.jsx)(`code`,{className:`conn__target`,children:gt(e)||`No target set`}),e.headersSecretRef&&(0,U.jsxs)(`p`,{className:`conn__meta`,children:[`Secret from `,(0,U.jsx)(`code`,{children:e.headersSecretRef}),e.headersSecretSet===!1&&(0,U.jsx)(`span`,{className:`conn__warn`,children:` (not set on the server)`})]})]}),(0,U.jsxs)(`div`,{className:`conn__actions`,children:[(0,U.jsx)(k,{size:`sm`,variant:`secondary`,icon:(0,U.jsx)(l,{size:14}),loading:f,onClick:s,disabled:!e.enabled,"aria-describedby":e.enabled?void 0:`${_}-off`,children:`Refresh tools`}),(0,U.jsx)(k,{size:`sm`,variant:`ghost`,icon:(0,U.jsx)(j,{size:14}),onClick:c,children:`Edit`}),(0,U.jsx)(k,{size:`sm`,variant:`ghost`,icon:(0,U.jsx)(E,{size:14}),onClick:d,children:`Delete`})]})]}),e.status===`error`&&(0,U.jsx)(`p`,{className:`conn__error`,role:`alert`,children:e.error||`The server did not answer. Check the command or URL, then refresh.`}),!e.enabled&&(0,U.jsx)(`p`,{id:`${_}-off`,className:`conn__meta`,children:`Turned off. Dots cannot call its tools.`}),(0,U.jsxs)(`div`,{className:`conn__switches`,children:[(0,U.jsx)(u,{checked:e.enabled,onChange:o,label:`Turned on`,description:`Off disconnects it for every dot.`}),i&&(0,U.jsx)(u,{checked:!!n,onChange:i,label:r?`Attached to ${r}`:`Attached to this dot`,description:`The dot can call its enabled tools in chat and flows.`})]}),(0,U.jsxs)(`button`,{type:`button`,className:`conn__disclosure`,"aria-expanded":h,"aria-controls":_,onClick:()=>g(e=>!e),children:[h?(0,U.jsx)(D,{size:16}):(0,U.jsx)(b,{size:16}),(0,U.jsxs)(`span`,{children:[e.tools.length===0?`No tools listed`:`${v} of ${e.tools.length} ${e.tools.length===1?`tool`:`tools`} on`,y>0&&(0,U.jsxs)(`span`,{className:`conn__meta`,children:[` (`,y,` can write and ask first)`]})]})]}),(0,U.jsx)(`div`,{id:_,hidden:!h,className:`conn__tools`,children:e.tools.length===0?(0,U.jsx)(`p`,{className:`conn__meta`,children:e.enabled?`Refresh to list the tools this server offers.`:`Turn it on and refresh to list tools.`}):(0,U.jsx)(`ul`,{className:`conn__tool-list`,"aria-label":`Tools of ${e.name}`,children:e.tools.map(e=>(0,U.jsx)(`li`,{className:`conn__tool`,children:(0,U.jsx)(u,{checked:e.enabled,onChange:t=>a(e,t),label:e.name,description:(0,U.jsxs)(U.Fragment,{children:[e.readOnly?(0,U.jsx)(C,{tone:`ok`,className:`conn__ro`,children:`Read-only`}):(0,U.jsx)(C,{tone:`attention`,className:`conn__ro`,children:`Writes, asks first`}),` `,e.description||`No description.`,p?.has(e.name)&&(0,U.jsx)(`span`,{className:`conn__meta`,children:` Saving`})]})})},e.name))})})]})}var vt=/^[A-Za-z_][A-Za-z0-9_]*$/;function yt(e){return{name:e?.name??``,transport:e?.transport??`http`,command:e?.command??``,args:(e?.args??[]).join(`
2
+ `),url:e?.url??``,headersSecretRef:e?.headersSecretRef??``}}function bt(e){let t={};if(e.name.trim()||(t.name=`Name the connection, for example Katalon or Sentry.`),e.transport===`stdio`&&!e.command.trim()&&(t.command=`Add the command that starts the server, for example npx.`),e.transport===`http`){let n=e.url.trim();if(!n)t.url=`Add the server URL.`;else try{let e=new URL(n);e.protocol!==`https:`&&e.protocol!==`http:`&&(t.url=`Use an http or https URL.`)}catch{t.url=`Use a full URL, for example https://mcp.example.com/mcp.`}}let n=e.headersSecretRef.trim();return n&&!vt.test(n)&&(t.headersSecretRef=`Enter the name of an environment variable, such as SENTRY_MCP_HEADERS. Never paste the secret itself.`),t}function xt(e,t){let n=e.headersSecretRef.trim(),r={name:e.name.trim(),transport:e.transport,enabled:t?.enabled??!0};return e.transport===`stdio`?(r.command=e.command.trim(),r.args=e.args.split(`
3
+ `).map(e=>e.trim()).filter(Boolean)):r.url=e.url.trim(),n&&(r.headersSecretRef=n),r}function K({open:t,onClose:n,connection:r,onSaved:i}){let[o,c]=(0,H.useState)(()=>yt(r)),[l,u]=(0,H.useState)({}),[d,m]=(0,H.useState)(new Set),[g,_]=(0,H.useState)(null),[v,y]=(0,H.useState)(!1),[b,x]=(0,H.useState)(!1),[S,C]=(0,H.useState)(t);t!==S&&(C(t),t&&(c(yt(r)),u({}),m(new Set),_(null),x(!1)));let w=(e,t)=>{let n={...o,[e]:t};c(n),(d.has(e)||b)&&u(bt(n))},T=e=>{m(t=>new Set(t).add(e)),u(bt(o))},E=e=>d.has(e)||b?l[e]:void 0,D=async e=>{e.preventDefault();let t=bt(o);if(u(t),x(!0),Object.keys(t).length){let e=Object.keys(t)[0];document.querySelector(`#${O} [data-field="${e}"]`)?.focus();return}y(!0),_(null);try{let e=xt(o,r);i(r?await h.updateConnection(r.id,e):await h.createConnection(e)),n()}catch(e){_(e)}finally{y(!1)}},O=`connection-form`,A=g instanceof e||g instanceof Error?g.message:g?`Could not save.`:``;return(0,U.jsx)(s,{open:t,onClose:n,title:r?`Edit ${r.name}`:`Add a connection`,description:`An app (an MCP server) whose tools your dots can call. Read-only tools run directly; tools that change things go through your rules.`,size:`md`,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(k,{variant:`ghost`,onClick:n,children:`Cancel`}),(0,U.jsx)(k,{variant:`primary`,type:`submit`,form:O,loading:v,children:r?`Save`:`Add and list tools`})]}),children:(0,U.jsxs)(`form`,{id:O,className:`form-stack`,onSubmit:D,noValidate:!0,children:[A&&(0,U.jsxs)(`div`,{className:`form-alert`,role:`alert`,children:[(0,U.jsx)(`p`,{className:`form-alert__title`,children:`Could not save the connection`}),(0,U.jsx)(`p`,{children:A}),g instanceof e&&(0,U.jsx)(`p`,{className:`form-alert__code`,children:g.code})]}),(0,U.jsx)(f,{label:`Name`,required:!0,error:E(`name`),children:(0,U.jsx)(p,{"data-field":`name`,value:o.name,onChange:e=>w(`name`,e.target.value),onBlur:()=>T(`name`),placeholder:`Katalon True Platform`,autoComplete:`off`})}),(0,U.jsxs)(`fieldset`,{className:`choice-row`,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Transport`}),[[`http`,`HTTP`,`A remote server at a URL (Streamable HTTP).`],[`stdio`,`Local command`,`A program the localdost server starts on its own machine.`]].map(([e,t,n])=>(0,U.jsxs)(`label`,{className:`choice${o.transport===e?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`conn-transport`,value:e,checked:o.transport===e,onChange:()=>w(`transport`,e)}),(0,U.jsxs)(`span`,{className:`choice__text`,children:[(0,U.jsx)(`span`,{className:`choice__label`,children:t}),(0,U.jsx)(`span`,{className:`choice__help`,children:n})]})]},e))]}),o.transport===`http`?(0,U.jsx)(f,{label:`URL`,required:!0,error:E(`url`),children:(0,U.jsx)(p,{"data-field":`url`,type:`url`,inputMode:`url`,value:o.url,onChange:e=>w(`url`,e.target.value),onBlur:()=>T(`url`),placeholder:`https://mcp.example.com/mcp`,autoComplete:`off`})}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(f,{label:`Command`,required:!0,error:E(`command`),hint:`Allowed only when the server has LOCALDOST_TOKEN or LOCALDOST_ALLOW_STDIO=1 set.`,children:(0,U.jsx)(p,{"data-field":`command`,value:o.command,onChange:e=>w(`command`,e.target.value),onBlur:()=>T(`command`),placeholder:`npx`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Arguments`,hint:`One per line.`,children:(0,U.jsx)(a,{"data-field":`args`,rows:3,value:o.args,onChange:e=>w(`args`,e.target.value),placeholder:`-y
4
+ @katalon/mcp-server`,spellCheck:!1})})]}),(0,U.jsx)(f,{label:`Secret env var`,error:E(`headersSecretRef`),hint:o.transport===`http`?`Name of a server env var holding headers JSON, for example {"Authorization":"Bearer ..."}.`:`Name of a server env var holding env JSON passed to the command.`,children:(0,U.jsx)(p,{"data-field":`headersSecretRef`,value:o.headersSecretRef,onChange:e=>w(`headersSecretRef`,e.target.value),onBlur:()=>T(`headersSecretRef`),placeholder:`KATALON_MCP_HEADERS`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`characters`})})]})})}var St=`connection-presets`;function q(e){let t=new Set(e.env.filter(e=>e.set).map(e=>e.name));return e.envAnyOf.filter(e=>!e.some(e=>t.has(e)))}function J(){let n=A(),r=F(St,e=>d(`/connections/presets`,{signal:e})),[i,a]=(0,H.useState)(!1),[o,c]=(0,H.useState)(``),[l,u]=(0,H.useState)({}),[m,h]=(0,H.useState)(!1),[g,_]=(0,H.useState)(``),v=r.data??[],y=v.find(e=>e.id===o)??v[0],b=()=>{let e=v[0];c(e?.id??``),u(Object.fromEntries((e?.params??[]).map(e=>[e.key,e.defaultValue??``]))),_(``),a(!0)},x=e=>{c(e.id),u(Object.fromEntries(e.params.map(e=>[e.key,e.defaultValue??``]))),_(``)},S=async t=>{if(t.preventDefault(),!y)return;let r=y.params.find(e=>!l[e.key]?.trim());if(r){_(`${r.label} is required.`);return}h(!0),_(``);try{let e=await d(`/connections/presets/${encodeURIComponent(y.id)}`,{method:`POST`,body:{params:l}});L(Y,t=>[...(t??[]).filter(t=>t.id!==e.id),e]),n.show({tone:e.status===`error`?`error`:`success`,title:e.status===`error`?`Saved ${e.name}, but it did not answer`:`Saved ${e.name}`,body:e.status===`error`?e.error:`${e.tools.length} ${e.tools.length===1?`tool`:`tools`} listed. Attach it to a dot to use it.`}),a(!1)}catch(t){_(t instanceof e||t instanceof Error?t.message:`Could not save.`)}finally{h(!1)}};if(!v.length)return null;let C=`connection-preset-form`,w=y?q(y):[];return(0,U.jsxs)(`div`,{style:{padding:`var(--space-3, 12px) var(--space-4, 16px)`},children:[(0,U.jsx)(k,{variant:`secondary`,onClick:b,children:`Add from preset`}),(0,U.jsx)(s,{open:i,onClose:()=>a(!1),title:`Add from preset`,description:`A known app (an MCP server) with its command and read-only tools filled in. Secrets stay in server env vars.`,size:`md`,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(k,{variant:`ghost`,onClick:()=>a(!1),children:`Cancel`}),(0,U.jsx)(k,{variant:`primary`,type:`submit`,form:C,loading:m,children:`Add and list tools`})]}),children:(0,U.jsxs)(`form`,{id:C,className:`form-stack`,onSubmit:S,noValidate:!0,children:[g&&(0,U.jsxs)(`div`,{className:`form-alert`,role:`alert`,children:[(0,U.jsx)(`p`,{className:`form-alert__title`,children:`Could not add the connection`}),(0,U.jsx)(`p`,{children:g})]}),(0,U.jsxs)(`fieldset`,{className:`choice-row choice-row--stack`,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Server`}),v.map(e=>(0,U.jsxs)(`label`,{className:`choice${y?.id===e.id?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`conn-preset`,value:e.id,checked:y?.id===e.id,onChange:()=>x(e)}),(0,U.jsxs)(`span`,{className:`choice__text`,children:[(0,U.jsxs)(`span`,{className:`choice__label choice__label--brand`,children:[me(e.id)&&(0,U.jsx)(t,{brand:me(e.id),size:16}),e.name]}),(0,U.jsx)(`span`,{className:`choice__help`,children:e.description})]})]},e.id))]}),y?.params.map(e=>(0,U.jsx)(f,{label:e.label,required:!0,hint:e.hint,children:(0,U.jsx)(p,{"data-field":e.key,value:l[e.key]??``,onChange:t=>u(n=>({...n,[e.key]:t.target.value})),placeholder:e.placeholder,autoComplete:`off`,spellCheck:!1})},e.key)),y&&(0,U.jsxs)(`div`,{children:[(0,U.jsx)(`p`,{className:`field__label`,children:`Server env vars`}),(0,U.jsx)(`ul`,{"aria-label":`Server env vars`,style:{margin:0,paddingLeft:`1.2em`},children:y.env.map(e=>(0,U.jsxs)(`li`,{children:[(0,U.jsx)(`code`,{children:e.name}),` `,e.set?`set`:`not set`]},e.name))}),w.length>0&&(0,U.jsxs)(`p`,{role:`status`,children:[`Set `,w.map(e=>e.join(` or `)).join(`, and `),` on the localdost server before you add this.`]}),(0,U.jsx)(`p`,{children:y.readOnlyTools.length?`${y.readOnlyTools.length} read-only tools run without approval. Every other tool waits for approval.`:`Only tools the server marks read-only run without approval.`})]})]})})]})}var Y=`connections`;function X({dot:e}){let t=A(),n=F(Y,e=>h.listConnections(e),{refreshOn:[`connection`],throttleMs:500}),[a,s]=(0,H.useState)({open:!1}),[c,l]=(0,H.useState)(null),[u,d]=(0,H.useState)(!1),[f,p]=(0,H.useState)(new Set),[g,_]=(0,H.useState)({}),v=e=>L(Y,t=>(t??[]).map(t=>t.id===e.id?e:t)),y=async e=>{p(t=>new Set(t).add(e.id));try{let n=await h.refreshConnection(e.id);v(n),n.status===`error`?t.show({tone:`error`,title:`${e.name} did not answer`,body:n.error}):t.show({tone:`success`,title:`${n.tools.length} ${n.tools.length===1?`tool`:`tools`} listed for ${e.name}`})}catch(n){t.show({tone:`error`,title:`Could not refresh ${e.name}`,body:n instanceof Error?n.message:void 0,action:{label:`Try again`,onClick:()=>void y(e)}})}finally{p(t=>{let n=new Set(t);return n.delete(e.id),n})}},b=async(e,n,r)=>{let i=L(Y,t=>(t??[]).map(t=>t.id===e.id?{...t,tools:t.tools.map(e=>e.name===n.name?{...e,enabled:r}:e)}:t));_(t=>({...t,[e.id]:new Set(t[e.id]).add(n.name)}));try{v(await h.updateConnection(e.id,{tools:[{...n,enabled:r}]}))}catch(e){L(Y,i),t.show({tone:`error`,title:`Could not turn ${r?`on`:`off`} ${n.name}`,body:e instanceof Error?e.message:void 0})}finally{_(t=>{let r=new Set(t[e.id]);return r.delete(n.name),{...t,[e.id]:r}})}},x=async(e,n)=>{let r=L(Y,t=>(t??[]).map(t=>t.id===e.id?{...t,enabled:n}:t));try{v(await h.updateConnection(e.id,{enabled:n}))}catch(i){L(Y,r),t.show({tone:`error`,title:`Could not turn ${e.name} ${n?`on`:`off`}`,body:i instanceof Error?i.message:void 0})}},S=async(n,r)=>{if(!e)return;let i=e.connections??[],a=r?[...new Set([...i,n.id])]:i.filter(e=>e!==n.id),o=t=>n=>n.id===e.id?{...n,connections:t}:n,s=L(R.dots,e=>(e??[]).map(o(a)));try{if(((await h.updateDot(e.id,{connections:a})).connections??[]).includes(n.id)!==r)throw Error(`The server did not keep the change. It may be older than this app.`);I(R.dots)}catch(e){L(R.dots,s),t.show({tone:`error`,title:`Could not ${r?`attach`:`detach`} ${n.name}`,body:e instanceof Error?e.message:void 0})}},C=async()=>{if(c){d(!0);try{await h.deleteConnection(c.id),L(Y,e=>(e??[]).filter(e=>e.id!==c.id)),I(R.dots),t.show({tone:`success`,title:`Deleted ${c.name}`}),l(null)}catch(e){t.show({tone:`error`,title:`Could not delete ${c.name}`,body:e instanceof Error?e.message:void 0})}finally{d(!1)}}},w=n.data;return(0,U.jsxs)(ee,{title:`Connections`,description:`Apps such as Katalon True Platform, TestRail or Sentry. Attach one to a dot to give it those tools.`,actions:w&&w.length>0?(0,U.jsx)(k,{variant:`secondary`,icon:(0,U.jsx)(o,{size:14}),onClick:()=>s({open:!0}),children:`Add connection`}):void 0,flush:!0,children:[w?(0,U.jsxs)(U.Fragment,{children:[n.error?(0,U.jsx)(i,{compact:!0,title:`Could not refresh connections. Showing the last list.`,error:n.error,onRetry:()=>void n.reload()}):null,w.length===0?(0,U.jsx)(r,{kind:`first-run`,compact:!0,title:`No connections yet`,body:`Add an app to let dots read test results, file bug reports or check monitoring.`,action:(0,U.jsx)(k,{variant:`primary`,icon:(0,U.jsx)(o,{size:14}),onClick:()=>s({open:!0}),children:`Add connection`})}):(0,U.jsx)(`ul`,{className:`conn-list`,"aria-label":`Connections`,children:w.map(t=>(0,U.jsx)(_t,{connection:t,attached:e?(e.connections??[]).includes(t.id):void 0,dotName:e?.name,onAttachChange:e?e=>void S(t,e):void 0,onToggleTool:(e,n)=>void b(t,e,n),onToggleEnabled:e=>void x(t,e),onRefresh:()=>void y(t),onEdit:()=>s({open:!0,conn:t}),onDelete:()=>l(t),refreshing:f.has(t.id),savingTools:g[t.id]},t.id))})]}):n.loading?(0,U.jsx)(m,{rows:2,label:`Loading connections`}):(0,U.jsx)(i,{compact:!0,title:`Could not load apps`,error:n.error,onRetry:()=>void n.reload()}),(0,U.jsx)(J,{}),(0,U.jsx)(K,{open:a.open,connection:a.conn,onClose:()=>s({open:!1}),onSaved:e=>{L(Y,t=>{let n=t??[];return n.some(t=>t.id===e.id)?n.map(t=>t.id===e.id?e:t):[...n,e]}),t.show({tone:e.status===`error`?`error`:`success`,title:e.status===`error`?`Saved ${e.name}, but it did not answer`:`Saved ${e.name}`,body:e.status===`error`?e.error:`${e.tools.length} ${e.tools.length===1?`tool`:`tools`} listed.`})}}),(0,U.jsx)(Xe,{open:!!c,title:c?`Delete ${c.name}?`:`Delete connection?`,body:`Every dot loses its apps. Items to review that use them stay in the Inbox but cannot go out.`,confirmLabel:`Delete connection`,busy:u,onConfirm:()=>void C(),onCancel:()=>l(null)})]})}function Z({notice:e}){let t=e.offered.map(be),n=e.offered.length===1?`New stage: ${t[0]}`:`New stages: ${t.join(` and `)}`;return(0,U.jsxs)(`section`,{className:`stage-notice`,"aria-label":`New stages`,children:[(0,U.jsx)(`span`,{className:`stage-notice__icon`,"aria-hidden":`true`,children:(0,U.jsx)(N,{size:16})}),(0,U.jsxs)(`div`,{className:`stage-notice__body`,children:[(0,U.jsx)(`h3`,{className:`stage-notice__title`,children:n}),(0,U.jsxs)(`p`,{className:`stage-notice__text`,children:[`Your dot works as before until you turn `,e.offered.length===1?`it`:`them`,` on.`]}),(0,U.jsxs)(`div`,{className:`stage-notice__actions`,children:[e.offered.map(t=>(0,U.jsx)(k,{size:`sm`,variant:`secondary`,onClick:()=>e.onTurnOn(t),children:`Turn on ${be(t)}`},t)),(0,U.jsx)(k,{size:`sm`,variant:`ghost`,loading:e.busy,onClick:e.onDismiss,children:`Dismiss`})]}),e.error&&(0,U.jsx)(`p`,{className:`stage-notice__error`,role:`alert`,children:e.error})]})]})}function Ct({title:e,hint:t,children:n}){return(0,U.jsxs)(`section`,{className:`stage-opt`,"aria-label":e,children:[(0,U.jsx)(`h4`,{className:`stage-opt__title`,children:e}),t&&(0,U.jsx)(`p`,{className:`stage-opt__hint`,children:t}),(0,U.jsx)(`div`,{className:`stage-opt__body`,children:n})]})}function wt(e,t){let n=e.data?e.data.choices.map(e=>({value:e.method,label:e.label})):Object.keys(xe).map(e=>({value:e,label:xe[e]}));return t&&!n.some(e=>e.value===t)&&n.push({value:t,label:xe[t]??t}),[{value:``,label:`Dot default`},...n]}function Tt(e,t){let n=e.data;if(!n)return e.error?`Could not load the model list. The choice shown here is kept.`:`Loading the model list.`;let r=t?n.choices.find(e=>e.method===t):void 0;if(r&&!r.available)return`${r.label} is not available on this server, so this stage uses the dot default until it is.`;let i=n.choices.find(e=>e.active),a=i?`The dot default is ${i.label}.`:`No default model is active yet.`;return(0,U.jsxs)(U.Fragment,{children:[a,` Change it on `,(0,U.jsx)(`a`,{href:`#/setup`,children:`Setup`}),`.`]})}function Q(e,t){let n=e.rules.trim()?`Own rules`:``;if(!e.model)return n?{text:n}:null;let r=t.data?.choices.find(t=>t.method===e.model),i=[n,`Model: ${r?.label??xe[e.model]??e.model}`].filter(Boolean).join(`, `);return r&&!r.available?{text:i,warning:`Not available. Uses the dot default.`}:{text:i}}function Et({stage:e,d:t,isOpen:r,onToggleOpen:i,onSet:o,models:s,rulesError:c,onTouch:l,options:u}){let d=(0,H.useId)(),p=be(e),m=`${d}-name`,h=`${d}-about`,g=`${d}-panel`,_=Q(t,s);return(0,U.jsxs)(`li`,{className:`stage-row${t.on?``:` is-off`}`,"data-stage":e,children:[(0,U.jsxs)(`div`,{className:`stage-row__head`,children:[(0,U.jsx)(`span`,{className:`stage-row__avatar`,"aria-hidden":`true`,children:(0,U.jsx)(T,{stage:e,state:t.on?`on`:`off`,size:64,collapse:`always`})}),(0,U.jsxs)(`div`,{className:`stage-row__text`,children:[(0,U.jsx)(`h3`,{id:m,className:`stage-row__name`,children:p}),(0,U.jsx)(`p`,{id:h,className:`stage-row__about`,children:Ce[e]}),_&&(0,U.jsxs)(`p`,{className:`stage-row__own`,children:[_.text,_.warning&&(0,U.jsxs)(`span`,{className:`stage-row__warn`,children:[(0,U.jsx)(x,{kind:`flaky`,label:`Warning`,size:14,decorative:!0}),_.warning]})]}),(0,U.jsxs)(k,{variant:`ghost`,size:`sm`,className:`stage-row__open`,"data-stage-open":e,"aria-expanded":r,"aria-controls":g,iconEnd:(0,U.jsx)(D,{size:14}),onClick:i,children:[`Settings`,(0,U.jsxs)(`span`,{className:`sr-only`,children:[` for `,p]})]})]}),(0,U.jsxs)(`div`,{className:`stage-row__switch`,children:[(0,U.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":t.on,"aria-labelledby":m,"aria-describedby":h,className:`toggle__switch`,"data-stage-switch":e,onClick:()=>o({on:!t.on}),children:(0,U.jsx)(`span`,{className:`toggle__thumb`,"aria-hidden":`true`})}),(0,U.jsx)(`span`,{className:`stage-row__state`,"aria-hidden":`true`,children:t.on?`On`:`Off`})]})]}),r&&(0,U.jsxs)(`div`,{id:g,className:`stage-row__panel`,role:`group`,"aria-label":`${p} settings`,children:[!t.on&&(0,U.jsxs)(`p`,{className:`stage-row__note`,children:[`Off. These settings apply when you turn `,p,` on.`]}),(0,U.jsx)(f,{label:`Rules`,error:c,hint:`Added to the jobs of this stage only.`,children:(0,U.jsx)(a,{"data-field":ye(e),value:t.rules,rows:3,placeholder:Te[e],onChange:e=>o({rules:e.target.value}),onBlur:()=>l(ye(e))})}),(0,U.jsx)(f,{label:`Model`,hint:Tt(s,t.model),children:(0,U.jsx)(n,{"data-field":`stages.${e}.model`,className:`stage-model`,value:t.model,options:wt(s,t.model),onChange:e=>o({model:e.target.value})})}),u&&(0,U.jsx)(`div`,{className:`stage-row__options`,children:u})]})]})}function Dt({draft:e,onChange:t,open:n,onOpenChange:r,options:i,models:a,rulesError:o,onTouch:s,notice:c}){let l=(n,r)=>t({...e,[n]:{...e[n],...r}});return(0,U.jsxs)(`div`,{className:`stages`,children:[c&&(0,U.jsx)(Z,{notice:c}),(0,U.jsx)(`p`,{className:`stages__summary`,children:Se(e)}),(0,U.jsx)(`ul`,{className:`stage-list`,"aria-label":`Stages`,children:ne.map(t=>(0,U.jsx)(Et,{stage:t,d:e[t],isOpen:n.has(t),onToggleOpen:()=>r(t,!n.has(t)),onSet:e=>l(t,e),models:a,rulesError:o(t),onTouch:s,options:i[t]},t))})]})}var Ot=[{value:`channel`,label:`The Slack channel above`},{value:`dm`,label:`A direct message`},{value:`off`,label:`No Slack updates`}],kt=Array.from({length:24},(e,t)=>({value:String(t),label:`${String(t).padStart(2,`0`)}:00`})),At=[{value:`retain-on-failure`,label:`Failed tests`},{value:`on`,label:`Every test`}],jt=[{value:`base`,label:`Preview, else Base URL`,help:`With no preview, tests run on the Base URL. The report says so, and a failure files no defect.`},{value:`preview-only`,label:`Preview only`,help:`A PR with no preview gets the review and no tests.`},{value:`none`,label:`Off`,help:`A PR gets the review and no tests. Merges still run them.`}],Mt=[{value:`local`,label:`Local`,help:`Runs the setup steps and the test command in a checkout on this machine.`},{value:`docker`,label:`Docker`,help:`Runs in a pinned container with a read-only mount and no secrets, except the test login below.`},{value:`demo`,label:`Demo`,help:`Runs the bundled sample app tests. No repo needed.`}],Nt={name:`Name`,mission:`Mission`,notifyWhen:`Notify when`,mustNot:`Must not`,instructions:`Instructions`,repo:`Repository`,defaultBranch:`Default branch`,prAuthors:`PR authors`,prTeam:`PR team`,jiraBaseUrl:`Jira site`,jiraProjectKeys:`Jira project keys`,linearTeamKeys:`Linear team keys`,githubRepos:`Issue repos`,githubRequireLabels:`Required labels`,baseUrl:`Base URL`,probeIntervalSec:`Site check interval`,statusPages:`Status pages`,runnerSetup:`Setup steps`,runnerCommand:`Test command`,runnerImage:`Docker image`,runnerPassEnv:`Test login variables`,deployEnvironment:`Deploy environment`,waitForDeploySec:`Wait for deploy`,nightlyTime:`Nightly test run time`,nightlyDays:`Nightly test run days`,repoDeployEnvironment:`Deploy environment of the repository`,repoWaitForDeploySec:`Wait for deploy of the repository`,slackChannel:`Slack channel`,slackUser:`Slack member ID`,digestHour:`Digest hour`,dailyModelCap:`Daily AI calls`,trueUrl:`True Platform address`,trueProject:`True Platform project ID`};function Pt(e){let t=/^deploy:(.+):(environment|seconds)$/.exec(e);if(t)return`${t[2]===`environment`?`Deploy environment`:`Wait for deploy`} of ${t[1]}`;let n=/^stages\.(\w+)\.rules$/.exec(e);if(n)return`${be(n[1])} rules`;let r=/^probes\.(\d+)\.(\w+)$/.exec(e);if(r){let e={url:`URL`,expectStatus:`expected status`,selector:`selector`,steps:`steps`}[r[2]]??r[2];return`Site check ${Number(r[1])+1} ${e}`}return Nt[e]??e}function $({title:e,hint:t,children:n}){return(0,U.jsxs)(`fieldset`,{className:`wd-section`,children:[(0,U.jsx)(`legend`,{className:`wd-section__title`,children:e}),t&&(0,U.jsx)(`p`,{className:`wd-section__hint`,children:t}),(0,U.jsx)(`div`,{className:`wd-section__body`,children:n})]})}function Ft({open:t,onClose:r,dot:l,onSaved:d,onRemoved:m,openStage:g}){let _=A(),{isAdmin:v}=ce(),b=!v,x=!v,S=ie(),C=re(),T=ae(t),D=F(t?`roles`:null,e=>h.roles(e)),O=F(t?Y:null,e=>h.listConnections(e)),ee=F(t?pe:null,e=>de.modelChoices(e)),j=!!l,M=(0,H.useMemo)(()=>Ae(l,{demo:S.data?.demo,create:!l}),[l,S.data?.demo]),[N,P]=(0,H.useState)(M),[ne,z]=(0,H.useState)(new Set),[me,ye]=(0,H.useState)(new Set),[be,xe]=(0,H.useState)(!1),[Se,Ce]=(0,H.useState)(!1),[V,Te]=(0,H.useState)(null),[Ne,Le]=(0,H.useState)(!1),[ze,He]=(0,H.useState)(!1),[Ze,Qe]=(0,H.useState)(null),[W,et]=(0,H.useState)(()=>new Set(g?[g]:[])),[tt,nt]=(0,H.useState)(!1),[rt,G]=(0,H.useState)(!1),[at,ot]=(0,H.useState)(null),[ut,ft]=(0,H.useState)(()=>Re(M)),mt=(0,H.useRef)(null),ht=oe(),gt=ve(ht.data?.timeZone,ht.data?.tzOffsetMin),_t=()=>{ft(!0),requestAnimationFrame(()=>{let e=document.querySelector(`[data-nightly-fields] [role="switch"]`);e?.scrollIntoView?.({block:`center`}),e?.focus()})},[vt,yt]=(0,H.useState)(t);t!==vt&&(yt(t),t&&(P(M),z(new Set),ye(new Set),xe(!1),Te(null),Qe(null),et(new Set(g?[g]:[])),nt(!1),G(!1),ot(null),ft(Re(M))));let bt=(0,H.useMemo)(()=>(C.data??[]).filter(e=>e.id!==l?.id&&!e.archived).map(e=>e.name),[C.data,l?.id]),xt=(0,H.useMemo)(()=>_e(N,{otherNames:bt}),[N,bt]),K=ke(xt),St=ne.size>0,q=e=>be||me.has(e)?xt[e]:void 0,J=e=>ye(t=>t.has(e)?t:new Set(t).add(e)),X=(e,t)=>{P(n=>({...n,[e]:t})),z(t=>t.has(e)?t:new Set(t).add(e))},Z=e=>({"data-field":e,value:N[e],onChange:t=>X(e,t.target.value),onBlur:()=>J(e)}),wt=(e,t)=>X(`otherAppRepos`,N.otherAppRepos.map(n=>n.repo===e?{...n,...t}:n)),Tt=(e,t)=>X(`probes`,N.probes.map((n,r)=>r===e?{...n,...t}:n)),Q=(e,t)=>({"data-field":`probes.${e}.${t}`,value:N.probes[e][t],onChange:n=>Tt(e,{[t]:n.target.value}),onBlur:()=>J(`probes.${e}.${t}`)}),Et=e=>{P(t=>({...t,stages:e})),z(e=>e.has(`stages`)?e:new Set(e).add(`stages`))},Ft=(e,t)=>{P(n=>({...n,review:{...n.review,[e]:t},reviewTouched:n.reviewTouched.includes(e)?n.reviewTouched:[...n.reviewTouched,e]})),z(e=>e.has(`review`)?e:new Set(e).add(`review`))},It=(e,t)=>et(n=>{if(n.has(e)===t)return n;let r=new Set(n);return t?r.add(e):r.delete(e),r});(0,H.useEffect)(()=>{if(!t||!g)return;let e=requestAnimationFrame(()=>document.querySelector(`.stage-row[data-stage="${CSS.escape(g)}"]`)?.scrollIntoView?.({block:`start`}));return()=>cancelAnimationFrame(e)},[t,g]);let Lt=e=>{let t=De(e);t&&It(t,!0),requestAnimationFrame(()=>document.querySelector(`[data-field="${CSS.escape(e)}"]`)?.focus())},Rt=Ye(N.stages),zt=j&&l.stagesNotice===`offer`&&!tt&&Rt.length>0,Bt=e=>{P(t=>({...t,stages:{...t.stages,[e]:{...t.stages[e],on:!0}},noticeAnswered:!0})),z(e=>e.has(`stages`)?e:new Set(e).add(`stages`))},Vt=async()=>{if(l){G(!0),ot(null);try{let e=await h.updateDot(l.id,{stagesNotice:`dismissed`});L(R.dots,t=>(t??[]).map(t=>t.id===e.id?e:t)),d?.(e),nt(!0)}catch(e){ot(`Could not dismiss this. ${e instanceof Error?e.message:`Try again.`}`)}finally{G(!1)}}},Ht=e=>{let t=Fe(N,e,ne);P(t),z(e=>new Set(e).add(`role`));let n=[`mission`,`notifyWhen`,`mustNot`,`instructions`].filter(e=>ne.has(e)),r=he(t.stages).join()===he(N.stages).join()?``:` The stage switches follow the role.`;Qe(e.key===`custom`?`Custom role. Write the goal yourself.${r}`:n.length?`Applied the ${e.label} preset. Your own text in ${n.map(e=>Nt[e].toLowerCase()).join(`, `)} was kept.${r}`:`Filled from the ${e.label} preset. Edit anything.${r}`)},Ut=e=>x&&l?{...e,repo:M.repo,defaultBranch:M.defaultBranch,testBranches:M.testBranches}:e,Wt=()=>{let e=[`runnerCommand`,`runnerSetup`,`runnerImage`,`repo`].find(e=>xt[e]);if(e)return J(e),{error:`${Nt[e]}: ${xt[e]}`};let t=Ve(Ut(N)),n=t.runner??{mode:N.runnerMode};return{...l?{dotId:l.id}:{},runner:b&&l?Me(n,l.runner):n,repo:t.repo??null,...t.baseUrl?{baseUrl:t.baseUrl}:{}}},Gt=()=>{St&&!Se?Le(!0):r()},Kt=async e=>{if(e.preventDefault(),xe(!0),Te(null),K.length){let e=K.map(De).filter(e=>!!e);e.length&&et(t=>new Set([...t,...e])),K.some(e=>je(e)||e===`nightlyTime`||e===`nightlyDays`)&&ft(!0),requestAnimationFrame(()=>mt.current?.focus());return}Ce(!0);try{let e=N.noticeAnswered||j&&l.stagesNotice===`offer`&&Rt.length===0,t={...Ut(N),noticeAnswered:e},n=l?We(t):null,i=n&&b?we(ge(n)):n;l&&i&&b&&(i.runner=Me(i.runner,l.runner));let a=l&&i?await h.updateDot(l.id,i):await h.createDot(Ve(t));L(R.dots,e=>{let t=e??[];return t.some(e=>e.id===a.id)?t.map(e=>e.id===a.id?a:e):[...t,a]}),I(R.dots),I(se(a.id)),I(le),_.show({tone:`success`,title:l?`Saved ${a.name}`:`${a.name} is watching`}),d?.(a),r()}catch(e){Te(e);let t=e instanceof Error?Oe(e.message):void 0;t&&It(t,!0),requestAnimationFrame(()=>mt.current?.focus())}finally{Ce(!1)}},qt=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(Ct,{title:`PR review`,children:(0,U.jsx)(it,{value:N.review,hasRepo:!!N.repo.trim(),onChange:Ft})}),(0,U.jsxs)(Ct,{title:`Tests the dot writes`,children:[(0,U.jsx)(f,{label:`Engine for new tests`,hint:(0,U.jsxs)(U.Fragment,{children:[`Your existing Playwright specs always run through the test command in Test runner. This choice covers new tests only, for the things to test that no existing test covers. Playwright e2e writes a test from the running app, runs it, and keeps it when it passes or finds a bug. AI-Vision needs its own setup. Change the default for all dots on `,(0,U.jsx)(`a`,{href:`#/setup`,children:`Setup`}),`.`,N.runnerMode===`docker`&&` Docker keeps your existing specs in the container, but a test written for a new item runs on this server, outside the container.`]}),children:(0,U.jsx)(n,{...Z(`runnerEngine`),className:`wd-engine`,options:[{value:``,label:ue(T.data)},...fe]})}),(0,U.jsx)(u,{checked:N.visionTests,onChange:e=>{N.aivision||X(`aivision`,{backend:`server`,enabled:e}),X(`visionTests`,e)},label:`AI-Vision tests`,description:`Runs vision tests that check what a user sees, next to the specs. Needs AI-Vision on Setup, a repo, and a base URL.`})]})]}),Jt=(0,U.jsxs)(Ct,{title:`Site checks`,hint:`What the dot checks between merges.`,children:[(0,U.jsxs)(`div`,{className:`probe-list`,children:[N.probes.length===0&&(0,U.jsx)(`p`,{className:`wd-note`,children:`No site checks. Add one to catch when the site is down between merges.`}),N.probes.map((e,t)=>(0,U.jsxs)(`fieldset`,{className:`probe`,children:[(0,U.jsxs)(`legend`,{className:`probe__title`,children:[`Site check `,t+1]}),(0,U.jsxs)(`div`,{className:`probe__head`,children:[(0,U.jsx)(`div`,{className:`choice-row choice-row--inline`,role:`radiogroup`,"aria-label":`Site check ${t+1} kind`,children:[[`http`,`HTTP`],[`browser`,`Browser`]].map(([n,r])=>(0,U.jsxs)(`label`,{className:`choice choice--compact${e.kind===n?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`wd-probe-kind-${e.key}`,value:n,checked:e.kind===n,onChange:()=>Tt(t,{kind:n})}),(0,U.jsx)(`span`,{className:`choice__label`,children:r})]},n))}),(0,U.jsxs)(k,{variant:`ghost`,size:`sm`,icon:(0,U.jsx)(E,{size:14}),onClick:()=>X(`probes`,N.probes.filter((e,n)=>n!==t)),children:[`Remove site check `,t+1]})]}),(0,U.jsx)(f,{label:`URL`,required:!0,error:q(`probes.${t}.url`),children:(0,U.jsx)(p,{...Q(t,`url`),type:`url`,inputMode:`url`,placeholder:`https://acme.com/health`,autoComplete:`off`})}),e.kind===`http`?(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Expected status`,error:q(`probes.${t}.expectStatus`),hint:`Empty means any status below 400.`,children:(0,U.jsx)(p,{...Q(t,`expectStatus`),inputMode:`numeric`,placeholder:`200`,autoComplete:`off`})}),(0,U.jsx)(f,{label:`Expected text`,hint:`The body must contain it.`,children:(0,U.jsx)(p,{...Q(t,`expectText`),placeholder:`ok`,autoComplete:`off`})})]}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Wait for selector`,required:!0,error:q(`probes.${t}.selector`),children:(0,U.jsx)(p,{...Q(t,`selector`),placeholder:`[data-test=checkout]`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Expected text`,hint:`Must appear after the steps.`,children:(0,U.jsx)(p,{...Q(t,`expectText`),placeholder:`Order summary`,autoComplete:`off`})})]}),(0,U.jsx)(f,{label:`Steps`,error:q(`probes.${t}.steps`),hint:`One per line: click <selector>, fill <selector> <text>, expect <text>.`,children:(0,U.jsx)(a,{...Q(t,`steps`),rows:3,placeholder:`click [data-test=add-to-cart]
5
+ expect 1 item`,spellCheck:!1})})]})]},e.key)),(0,U.jsx)(k,{variant:`secondary`,icon:(0,U.jsx)(o,{size:14}),onClick:()=>X(`probes`,[...N.probes,Pe()]),children:`Add site check`})]}),N.probes.length>0&&(0,U.jsx)(f,{label:`Check the site every (seconds)`,error:q(`probeIntervalSec`),className:`wd-narrow`,children:(0,U.jsx)(p,{...Z(`probeIntervalSec`),inputMode:`numeric`,autoComplete:`off`})}),(0,U.jsx)(f,{label:`Status pages`,error:q(`statusPages`),hint:`Statuspage URLs of services you depend on, one per line.`,children:(0,U.jsx)(a,{...Z(`statusPages`),rows:2,placeholder:`https://www.githubstatus.com`,spellCheck:!1})})]}),Yt=`watch-form`,Xt=be&&(K.length>0||V!=null);return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(s,{open:t,onClose:Gt,title:j?`Edit ${l?.name}`:`New dot`,description:`A dot watches one product area. Tell it what must stay true, what to watch, and when to tell you.`,size:`lg`,className:`wd`,footer:(0,U.jsxs)(U.Fragment,{children:[l&&v&&(0,U.jsx)(k,{variant:`danger`,className:`rm-footer-btn`,icon:(0,U.jsx)(E,{size:14}),disabled:Se,onClick:()=>He(!0),children:`Remove dot`}),(0,U.jsx)(k,{variant:`ghost`,onClick:Gt,children:`Cancel`}),(0,U.jsx)(k,{variant:`primary`,type:`submit`,form:Yt,loading:Se,children:j?`Save changes`:`Create dot`})]}),children:(0,U.jsxs)(`form`,{id:Yt,className:`wd-form`,onSubmit:Kt,noValidate:!0,children:[Xt&&(0,U.jsx)(`div`,{className:`form-alert`,role:`alert`,tabIndex:-1,ref:mt,children:V?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`p`,{className:`form-alert__title`,children:`Could not save the dot`}),(0,U.jsxs)(`p`,{children:[V instanceof Error?V.message:`The server did not accept it.`,` Your changes are still here.`]}),V instanceof e&&(0,U.jsx)(`p`,{className:`form-alert__code`,children:V.code})]}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`p`,{className:`form-alert__title`,children:[`Fix `,K.length,` `,K.length===1?`field`:`fields`,` to `,j?`save`:`create the dot`]}),(0,U.jsx)(`ul`,{className:`form-alert__list`,children:K.map(e=>(0,U.jsxs)(`li`,{children:[(0,U.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:()=>Lt(e),children:Pt(e)}),`: `,xt[e]]},e))})]})}),(0,U.jsxs)($,{title:`Role`,hint:`A preset fills the goal, the rules and the jobs. You can change everything after.`,children:[D.data?(0,U.jsx)(`div`,{className:`role-grid`,role:`radiogroup`,"aria-label":`Role preset`,children:D.data.map(e=>(0,U.jsxs)(`label`,{className:`role-opt${N.role===e.key?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`wd-role`,value:e.key,checked:N.role===e.key,onChange:()=>Ht(e),onClick:()=>{!j&&N.role===e.key&&Ht(e)}}),(0,U.jsx)(`span`,{className:`role-opt__label`,children:e.label}),(0,U.jsx)(`span`,{className:`role-opt__desc`,children:e.description})]},e.key))}):D.loading?(0,U.jsx)(`div`,{className:`role-grid`,"aria-busy":`true`,"aria-label":`Loading role presets`,children:[0,1,2,3].map(e=>(0,U.jsxs)(`div`,{className:`role-opt role-opt--skeleton`,children:[(0,U.jsx)(c,{width:`40%`,height:14}),(0,U.jsx)(c,{width:`90%`,height:10})]},e))}):(0,U.jsx)(i,{compact:!0,title:`Could not load role presets. You can still fill the form by hand.`,error:D.error,onRetry:()=>void D.reload()}),Ze&&(0,U.jsx)(`p`,{className:`wd-note`,role:`status`,children:Ze})]}),(0,U.jsxs)($,{title:`Basics`,children:[(0,U.jsx)(f,{label:`Name`,required:!0,error:q(`name`),hint:`Up to ${Ue.name} characters. Shown in the sidebar and in notifications.`,children:(0,U.jsx)(p,{...Z(`name`),placeholder:`Checkout guard`,autoComplete:`off`,maxLength:Ue.name+20})}),(0,U.jsxs)(`fieldset`,{className:`mascot-pick`,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Mascot`}),(0,U.jsx)(`div`,{className:`mascot-pick__opts`,children:y.map(e=>(0,U.jsxs)(`label`,{className:`mascot-opt${N.mascot===e?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`wd-mascot`,value:e,checked:N.mascot===e,onChange:()=>X(`mascot`,e)}),(0,U.jsx)(te,{name:e,state:`ok`,size:36,decorative:!0}),(0,U.jsx)(`span`,{className:`mascot-opt__label`,children:w[e]})]},e))})]}),(0,U.jsx)(f,{label:`Mission`,required:!0,error:q(`mission`),hint:`What should stay true, in your words.`,children:(0,U.jsx)(a,{...Z(`mission`),rows:3,placeholder:`Checkout works on every merge to main, on desktop and mobile.`})}),(0,U.jsx)(f,{label:`Notify when`,error:q(`notifyWhen`),hint:`When the dot should interrupt you.`,children:(0,U.jsx)(a,{...Z(`notifyWhen`),rows:2,placeholder:`A merge breaks a checkout spec, or the payment page is down.`})}),(0,U.jsx)(f,{label:`Must not`,error:q(`mustNot`),hint:`What the dot never does, whatever the rules say.`,children:(0,U.jsx)(a,{...Z(`mustNot`),rows:2,placeholder:`Never revert, merge, or close anything.`})}),(0,U.jsx)(f,{label:`Instructions`,error:q(`instructions`),hint:Be,children:(0,U.jsx)(a,{...Z(`instructions`),rows:3})})]}),(0,U.jsxs)($,{title:`Sources`,hint:`Where changes come from. Both are optional.`,children:[x&&(0,U.jsx)(`p`,{className:`wd-note`,role:`note`,"data-repo-admin-only":!0,children:`Ask your localdost admin to change repositories.`}),(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Repository`,error:q(`repo`),hint:`owner/name on GitHub.`,children:(0,U.jsx)(p,{...Z(`repo`),readOnly:x,placeholder:`acme/shop`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Default branch`,error:q(`defaultBranch`),children:(0,U.jsx)(p,{...Z(`defaultBranch`),readOnly:x,placeholder:`main`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})})]}),(0,U.jsx)(f,{label:`Path filters`,hint:`Comma separated. Only changes under these paths start a check. Leave empty for all.`,children:(0,U.jsx)(p,{...Z(`pathFilters`),placeholder:`src/checkout, src/payments`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(dt,{draft:N,onChange:(e,t)=>X(e,t),errors:{prAuthors:q(`prAuthors`),prTeam:q(`prTeam`)},onBlur:J}),N.otherAppRepos.length===0?(0,U.jsx)(u,{checked:N.repoRunTests,onChange:e=>X(`repoRunTests`,e),label:`Run tests`,description:`Off for a repo with no Playwright suite, such as a back end: its pull requests and merges are reviewed and not tested.`}):(0,U.jsxs)(`fieldset`,{className:`wd-switches`,"data-run-tests-repos":!0,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Run tests`}),(0,U.jsx)(`p`,{className:`wd-note`,children:`Off for a repo with no Playwright suite, such as a back end: its pull requests and merges are reviewed and not tested.`}),(0,U.jsx)(u,{checked:N.repoRunTests,onChange:e=>X(`repoRunTests`,e),label:N.repo.trim()||`Repository`}),N.otherAppRepos.map(e=>(0,U.jsx)(u,{checked:e.runTests,onChange:t=>X(`otherAppRepos`,N.otherAppRepos.map(n=>n.repo===e.repo?{...n,runTests:t}:n)),label:e.repo},e.repo))]}),(0,U.jsxs)(`fieldset`,{className:`choice-row`,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Tracker`}),[[`none`,`None`],[`jira`,`Jira`],[`linear`,`Linear`],[`github`,`GitHub Issues`]].map(([e,t])=>(0,U.jsxs)(`label`,{className:`choice choice--compact${N.trackerKind===e?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`wd-tracker`,value:e,checked:N.trackerKind===e,onChange:()=>X(`trackerKind`,e)}),(0,U.jsx)(`span`,{className:`choice__label`,children:t})]},e))]}),N.trackerKind===`jira`&&(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Jira site`,required:!0,error:q(`jiraBaseUrl`),children:(0,U.jsx)(p,{...Z(`jiraBaseUrl`),type:`url`,inputMode:`url`,placeholder:`https://acme.atlassian.net`,autoComplete:`off`})}),(0,U.jsx)(f,{label:`Project keys`,required:!0,error:q(`jiraProjectKeys`),hint:`Comma separated.`,children:(0,U.jsx)(p,{...Z(`jiraProjectKeys`),placeholder:`SHOP, PAY`,autoComplete:`off`,autoCapitalize:`characters`})})]}),N.trackerKind===`linear`&&(0,U.jsx)(f,{label:`Team keys`,required:!0,error:q(`linearTeamKeys`),hint:`Comma separated.`,children:(0,U.jsx)(p,{...Z(`linearTeamKeys`),placeholder:`ENG`,autoComplete:`off`,autoCapitalize:`characters`})}),N.trackerKind===`github`&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(f,{label:`Issue repos`,error:q(`githubRepos`),hint:`Comma separated. Leave empty to review the issues of the repository above.`,children:(0,U.jsx)(p,{...Z(`githubRepos`),placeholder:`acme/shop`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Required labels`,error:q(`githubRequireLabels`),hint:`Review only issues with one of these labels. The first also goes on the defects the dot files. Leave empty for all.`,children:(0,U.jsx)(p,{...Z(`githubRequireLabels`),placeholder:`pod:agentic`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Requirement types`,hint:`Issue types reviewed as requirements. Default Feature, Story, Task.`,children:(0,U.jsx)(p,{...Z(`githubRequirementTypes`),placeholder:`Feature, Story, Task`,autoComplete:`off`})}),(0,U.jsx)(f,{label:`Defect types`,hint:`Default Bug. Issues of any other type are skipped.`,children:(0,U.jsx)(p,{...Z(`githubDefectTypes`),placeholder:`Bug`,autoComplete:`off`})}),(0,U.jsx)(f,{label:`Requirement labels`,hint:`For issues with no type. Default requirement, story, feature, enhancement.`,children:(0,U.jsx)(p,{...Z(`githubRequirementLabels`),placeholder:`requirement, story`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Defect labels`,hint:`For issues with no type. Default bug, defect.`,children:(0,U.jsx)(p,{...Z(`githubDefectLabels`),placeholder:`bug, defect`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Skip labels`,hint:`Issues with one of these labels are never reviewed.`,children:(0,U.jsx)(p,{...Z(`githubIgnoreLabels`),placeholder:`wontfix, question`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Milestones`,hint:`Only review issues in these milestones. Leave empty for all.`,children:(0,U.jsx)(p,{...Z(`githubMilestones`),placeholder:`2026.11`,autoComplete:`off`})})]})]})]}),(0,U.jsx)($,{title:`Stages`,hint:`Each stage does one step from ticket to production. Turn off the ones you do not need.`,children:(0,U.jsx)(Dt,{draft:N.stages,onChange:Et,open:W,onOpenChange:It,options:{reviewer:qt,watcher:Jt},models:{data:ee.data,error:ee.error},rulesError:e=>q(`stages.${e}.rules`),onTouch:J,notice:zt?{offered:Rt,onTurnOn:Bt,onDismiss:()=>void Vt(),busy:rt,error:at}:null})}),(0,U.jsxs)($,{title:`Test runner`,children:[Ee(N)&&(0,U.jsx)(`p`,{className:`wd-note`,role:`status`,"data-tests-off":!0,children:Ee(N)}),(0,U.jsx)(f,{label:`Base URL`,error:q(`baseUrl`),hint:`Where tests run when no preview URL is known.`,children:(0,U.jsx)(p,{...Z(`baseUrl`),type:`url`,inputMode:`url`,placeholder:`https://staging.acme.com`,autoComplete:`off`})}),b&&(0,U.jsx)(`p`,{className:`wd-note`,role:`note`,"data-runner-admin-only":!0,children:`Ask your localdost admin to change test commands.`}),b?(0,U.jsx)(f,{label:`Runner mode`,children:(0,U.jsx)(p,{value:Mt.find(e=>e.value===N.runnerMode)?.label??N.runnerMode,readOnly:!0,"data-runner-mode":!0})}):(0,U.jsxs)(`fieldset`,{className:`choice-row choice-row--stack`,children:[(0,U.jsx)(`legend`,{className:`sr-only`,children:`Runner mode`}),Mt.map(e=>(0,U.jsxs)(`label`,{className:`choice${N.runnerMode===e.value?` is-selected`:``}`,children:[(0,U.jsx)(`input`,{type:`radio`,name:`wd-runner`,value:e.value,checked:N.runnerMode===e.value,onChange:()=>X(`runnerMode`,e.value)}),(0,U.jsxs)(`span`,{className:`choice__text`,children:[(0,U.jsx)(`span`,{className:`choice__label`,children:e.label}),(0,U.jsx)(`span`,{className:`choice__help`,children:e.help})]})]},e.value))]}),N.runnerMode!==`demo`&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(f,{label:`Setup steps`,error:q(`runnerSetup`),hint:`Install and build, one step per line. They run through the shell in the working folder before the tests. An unchanged lockfile skips the install.`,children:(0,U.jsx)(a,{...Z(`runnerSetup`),readOnly:b,className:`wd-mono`,rows:3,placeholder:`npm ci
6
+ npx playwright install chromium
7
+ npm run build`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Test command`,error:q(`runnerCommand`),hint:`Runs without a shell, so && and pipes go in Setup steps. Default: npx playwright test.`,children:(0,U.jsx)(p,{...Z(`runnerCommand`),readOnly:b,className:`wd-mono`,placeholder:`npx playwright test --grep @smoke`,autoComplete:`off`,spellCheck:!1})})]}),N.runnerMode!==`demo`&&(0,U.jsx)(`div`,{className:`wd-grid`,children:N.runnerMode===`local`?(0,U.jsx)(f,{label:`Working folder`,hint:`Path to the test project on the server.`,children:(0,U.jsx)(p,{...Z(`runnerWorkdir`),readOnly:b,placeholder:`/srv/shop/e2e`,autoComplete:`off`,spellCheck:!1})}):(0,U.jsx)(f,{label:`Docker image`,required:!0,error:q(`runnerImage`),children:(0,U.jsx)(p,{...Z(`runnerImage`),readOnly:b,placeholder:`mcr.microsoft.com/playwright:v1.56.0`,autoComplete:`off`,spellCheck:!1})})}),N.runnerMode!==`demo`&&(0,U.jsx)(f,{label:`Test login variables`,error:q(`runnerPassEnv`),hint:`Host variables that carry the sign-in of the app under test, comma separated. Each starts with LOCALDOST_TEST_, and the tests see it with TEST_ in its place.`,children:(0,U.jsx)(a,{...Z(`runnerPassEnv`),readOnly:b,className:`wd-mono`,rows:2,placeholder:`LOCALDOST_TEST_USER, LOCALDOST_TEST_PASSWORD`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`characters`})}),N.runnerMode!==`demo`&&(0,U.jsx)(lt,{names:qe(N)}),N.runnerMode===`local`&&(0,U.jsx)(f,{label:`Copy files`,error:q(`runnerCopyFiles`),hint:`Files of the working folder, comma separated, that are copied into the clean worktree of each run before setup, such as .env.`,children:(0,U.jsx)(p,{...Z(`runnerCopyFiles`),readOnly:b,className:`wd-mono`,placeholder:`.env, .env.local`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Smoke grep`,hint:`Specs that always run, for example @smoke.`,children:(0,U.jsx)(p,{...Z(`smokeGrep`),placeholder:`@smoke`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Test branches`,error:q(`testBranches`),hint:x?Ie:`Merges and pushes to these branches, comma separated, run tests too; empty tests the default branch only.`,children:(0,U.jsx)(p,{...Z(`testBranches`),readOnly:x,placeholder:`release/1.0, release/2.0`,autoComplete:`off`,spellCheck:!1})}),N.runnerMode!==`demo`&&b&&(0,U.jsx)(`p`,{className:`wd-note`,role:`note`,"data-deploy-admin-only":!0,children:`Ask your localdost admin to change the deploy wait.`}),N.runnerMode!==`demo`&&(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Deploy environment`,error:q(`deployEnvironment`),hint:`The GitHub environment a merge deploys to, for example qa.`,children:(0,U.jsx)(p,{...Z(`deployEnvironment`),readOnly:b,placeholder:`qa`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Wait for deploy`,error:q(`waitForDeploySec`),hint:`Seconds a merge waits for that deploy before its tests run. Empty: test at once.`,children:(0,U.jsx)(p,{...Z(`waitForDeploySec`),readOnly:b,className:`wd-narrow`,inputMode:`numeric`,placeholder:`Off`,autoComplete:`off`,spellCheck:!1})})]}),(N.runnerMode!==`demo`&&Ke(N)||Je(N).length>0)&&(0,U.jsxs)(`details`,{className:`wd-advanced`,"data-advanced":!0,open:ut,onToggle:e=>ft(e.currentTarget.open),children:[(0,U.jsx)(`summary`,{children:`Advanced`}),N.runnerMode!==`demo`&&Ke(N)&&(0,U.jsxs)(`fieldset`,{className:`wd-switches`,"data-deploy-repos":!0,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Deploy wait for each repo`}),(0,U.jsx)(`p`,{className:`wd-note`,children:`An empty field uses the setting above. Put 0 seconds on a repo whose merge should be tested at once. If a deploy fails, the merge is not tested.`}),b&&(0,U.jsx)(`p`,{className:`wd-note`,role:`note`,"data-deploy-repos-admin-only":!0,children:`Ask your localdost admin to change the deploy wait.`}),(0,U.jsxs)(`div`,{className:`wd-deploy-repos`,children:[(0,U.jsxs)(`div`,{className:`wd-deploy-repo`,"data-deploy-repo":N.repo.trim().toLowerCase(),children:[(0,U.jsx)(`span`,{className:`wd-deploy-repo__name`,children:N.repo.trim()}),(0,U.jsx)(f,{label:`Environment`,error:q(`repoDeployEnvironment`),children:(0,U.jsx)(p,{...Z(`repoDeployEnvironment`),readOnly:b,placeholder:N.deployEnvironment.trim()||`qa`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Wait (seconds)`,error:q(`repoWaitForDeploySec`),children:(0,U.jsx)(p,{...Z(`repoWaitForDeploySec`),readOnly:b,inputMode:`numeric`,placeholder:N.waitForDeploySec.trim()||`Off`,autoComplete:`off`,spellCheck:!1})})]}),N.otherAppRepos.map(e=>(0,U.jsxs)(`div`,{className:`wd-deploy-repo`,"data-deploy-repo":e.repo,children:[(0,U.jsx)(`span`,{className:`wd-deploy-repo__name`,children:e.repo}),(0,U.jsx)(f,{label:`Environment`,error:q(B(e.repo,`environment`)),children:(0,U.jsx)(p,{"data-field":B(e.repo,`environment`),value:e.deployEnvironment,onChange:t=>wt(e.repo,{deployEnvironment:t.target.value}),onBlur:()=>J(B(e.repo,`environment`)),readOnly:b,placeholder:N.deployEnvironment.trim()||`qa`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Wait (seconds)`,error:q(B(e.repo,`seconds`)),children:(0,U.jsx)(p,{"data-field":B(e.repo,`seconds`),value:e.waitForDeploySec,onChange:t=>wt(e.repo,{waitForDeploySec:t.target.value}),onBlur:()=>J(B(e.repo,`seconds`)),readOnly:b,inputMode:`numeric`,placeholder:N.waitForDeploySec.trim()||`Off`,autoComplete:`off`,spellCheck:!1})})]},e.repo))]})]}),Je(N).length>0&&(0,U.jsx)(ct,{draft:N,update:X,show:q,touch:J,clock:gt})]}),N.runnerMode!==`demo`&&(0,U.jsx)(f,{label:`Tests on PRs`,hint:jt.find(e=>e.value===N.prTestTarget)?.help,children:(0,U.jsx)(n,{...Z(`prTestTarget`),className:`wd-video`,options:jt.map(({value:e,label:t})=>({value:e,label:t}))})}),Je(N).length>0&&(0,U.jsxs)(`fieldset`,{className:`wd-switches`,"data-tests-repo-switches":!0,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Tests repo`}),(0,U.jsxs)(`p`,{className:`wd-note`,children:[`Runs the tests of `,Je(N).join(`, `),` against the app, after the tests of the app repo.`]}),(0,U.jsx)(u,{checked:N.testRepoOnPr,onChange:e=>X(`testRepoOnPr`,e),label:`Run the Tests repo on app PRs`}),(0,U.jsx)(u,{checked:N.testRepoOnMerge,onChange:e=>X(`testRepoOnMerge`,e),label:`Run the Tests repo on merges`})]}),Je(N).length>0&&(0,U.jsx)(st,{draft:N,clock:gt,onOpen:_t}),N.runnerMode!==`docker`&&(0,U.jsx)(f,{label:`Keep video of`,hint:`Failed tests keeps the video of every test that did not pass. Every test keeps all videos and uses more disk. Docker runs keep no video.`,children:(0,U.jsx)(n,{...Z(`runnerVideo`),className:`wd-video`,options:At})}),(0,U.jsx)(Ge,{getInput:Wt})]}),(0,U.jsx)($,{title:`AI use`,hint:`Each answer, review pass, and score is one AI call.`,children:(0,U.jsx)(f,{label:`Daily AI calls`,error:q(`dailyModelCap`),hint:`At this number new reviews of the dot wait until server midnight, and chat answers say so. Empty: no cap.`,children:(0,U.jsx)(p,{...Z(`dailyModelCap`),className:`wd-narrow`,inputMode:`numeric`,placeholder:`No cap`,autoComplete:`off`,spellCheck:!1})})}),j&&l&&(0,U.jsx)($,{title:`True Platform`,hint:`Copy this dot's test cases, test runs and results into one True Platform project.`,children:(0,U.jsx)(pt,{dotId:l.id,isAdmin:v,on:N.trueOn,url:N.trueUrl,project:N.trueProject,onToggle:e=>X(`trueOn`,e),urlProps:Z(`trueUrl`),projectProps:Z(`trueProject`),urlError:q(`trueUrl`),projectError:q(`trueProject`),trueKey:l.trueKey})}),(0,U.jsx)($,{title:`Notifications`,children:(0,U.jsxs)(`div`,{className:`wd-grid`,children:[(0,U.jsx)(f,{label:`Slack channel`,error:q(`slackChannel`),hint:`Mentions in this channel go to this dot. Needs the Slack bot.`,children:(0,U.jsx)(p,{...Z(`slackChannel`),placeholder:`#releases`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Slack updates`,hint:`Where urgent items, replies, and digests go in Slack.`,children:(0,U.jsx)(n,{...Z(`slackUpdates`),options:Ot})}),N.slackUpdates===`dm`&&(0,U.jsx)(f,{label:`Slack member ID`,error:q(`slackUser`),hint:`The person the dot messages directly.`,children:(0,U.jsx)(p,{...Z(`slackUser`),placeholder:`U0123ABCD`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`characters`})}),(0,U.jsx)(f,{label:`Daily digest at`,error:q(`digestHour`),hint:`Server local time.`,children:(0,U.jsx)(n,{...Z(`digestHour`),options:kt})})]})}),(0,U.jsx)($,{title:`Apps`,hint:`Apps this dot may use. Actions that change things still follow the rules.`,children:O.data?O.data.length===0?(0,U.jsx)(`p`,{className:`wd-note`,children:v?(0,U.jsxs)(U.Fragment,{children:[`No connections yet. Add one in `,(0,U.jsx)(`a`,{href:`#/settings`,children:`Settings`}),`.`]}):`No connections yet. Ask your localdost admin to add one.`}):(0,U.jsx)(`div`,{className:`check-list`,children:O.data.map(e=>{let t=N.connections.includes(e.id);return(0,U.jsxs)(`label`,{className:`check`,children:[(0,U.jsx)(`input`,{type:`checkbox`,checked:t,onChange:()=>X(`connections`,t?N.connections.filter(t=>t!==e.id):[...N.connections,e.id])}),(0,U.jsxs)(`span`,{className:`check__text`,children:[(0,U.jsx)(`span`,{className:`check__label`,children:e.name}),(0,U.jsxs)(`span`,{className:`check__help`,children:[e.tools.filter(e=>e.enabled).length,` tools on`,e.status===`error`?`, currently failing`:e.status===`disabled`?`, turned off`:``]})]})]},e.id)})}):O.loading?(0,U.jsx)(c,{width:`60%`,height:14}):(0,U.jsx)(i,{compact:!0,title:`Could not load connections`,error:O.error,onRetry:()=>void O.reload()})})]})}),l&&v&&(0,U.jsx)($e,{open:ze,dot:l,onClose:()=>He(!1),onRemoved:e=>{r(),m?.(e)}}),(0,U.jsx)(Xe,{open:Ne,title:`Discard changes?`,body:j?`Your edits to ${l?.name} are not saved.`:`The new dot is not created yet.`,confirmLabel:`Discard`,onConfirm:()=>{Le(!1),r()},onCancel:()=>Le(!1)})]})}var It=`Keep the QA team in step: one team health word, one daily digest, one release call.`;function Lt(){return{name:`Lead QA`,memberIds:[],digestHour:`9`,digestEvery:`day`,slackChannel:``,dailyModelCap:``,mission:It,notifyWhen:`When the team is failing, when something waits for a person, and in the daily digest.`,mustNot:`Never post, file or comment on its own. A member does that, through its Inbox.`}}function Rt(e){return{name:e.name,memberIds:[...e.memberIds??[]],digestHour:String(e.digestHour),digestEvery:e.digestEvery===`week`?`week`:`day`,slackChannel:e.slackChannel??``,dailyModelCap:e.dailyModelCap?String(e.dailyModelCap):``,mission:e.mission,notifyWhen:e.notifyWhen,mustNot:e.mustNot}}var zt=/^[#@]?[a-z0-9._-]{1,80}$/i,Bt=/^[CG][A-Z0-9]{6,}$/;function Vt(e,t){let n={},r=e.name.trim();r?r.length>60?n.name=`Keep the name under 60 characters.`:t.some(e=>e.trim().toLowerCase()===r.toLowerCase())&&(n.name=`Another dot already has this name.`):n.name=`Give the lead a name.`,e.memberIds.length<1?n.memberIds=`Add at least one dot to the team.`:e.memberIds.length>8&&(n.memberIds=`A lead names up to 8 dots.`);let i=e.slackChannel.trim();i&&!zt.test(i)&&!Bt.test(i)&&(n.slackChannel=`Use a channel name such as #qa-team.`);let a=He(e.dailyModelCap);return a&&(n.dailyModelCap=a),n}var Ht=e=>e.startsWith(`#`)||e.startsWith(`@`)||Bt.test(e)?e:`#${e}`;function Ut(e){let t=e.slackChannel.trim(),n=ze(e.dailyModelCap);return{name:e.name.trim(),kind:`lead`,memberIds:e.memberIds,digestHour:Number(e.digestHour),digestEvery:e.digestEvery,mission:e.mission.trim(),notifyWhen:e.notifyWhen.trim(),mustNot:e.mustNot.trim(),...t?{slackChannel:Ht(t)}:{},...n?{dailyModelCap:n}:{}}}function Wt(e){let t=e.slackChannel.trim();return{name:e.name.trim(),memberIds:e.memberIds,digestHour:Number(e.digestHour),digestEvery:e.digestEvery,mission:e.mission.trim(),notifyWhen:e.notifyWhen.trim(),mustNot:e.mustNot.trim(),slackChannel:t?Ht(t):null,dailyModelCap:ze(e.dailyModelCap)}}function Gt(e){let t=S.filter(t=>e.stages?.[t]?.on??t!==`guard`).map(e=>P[e]);return t.length?t.join(`, `):`No jobs on`}function Kt(e){let t=e.memberIds?.length??0,n=`${String(e.digestHour).padStart(2,`0`)}:00`,r=e.slackChannel?`chat and ${e.slackChannel}`:`chat`,i=e.digestEvery===`week`?`Weekly digest on Mondays at ${n}`:`Daily digest at ${n}`;return`Team of ${t} ${t===1?`dot`:`dots`}. ${i} in ${r}.`}function qt(e,t,n){let r=t+n;if(t<0||t>=e.length||r<0||r>=e.length)return[...e];let i=[...e];return[i[t],i[r]]=[i[r],i[t]],i}var Jt=Array.from({length:24},(e,t)=>({value:String(t),label:`${String(t).padStart(2,`0`)}:00`})),Yt=[{value:`day`,label:`Every day`},{value:`week`,label:`Every Monday, for the week`}];function Xt({open:e,onClose:t,lead:r,onSaved:o}){let c=A(),l=re(),[u,d]=(0,H.useState)(()=>r?Rt(r):Lt()),[m,g]=(0,H.useState)(``),[_,v]=(0,H.useState)(!1),[y,b]=(0,H.useState)(!1),[x,S]=(0,H.useState)(null),[C,w]=(0,H.useState)(e);e!==C&&(w(e),e&&(d(r?Rt(r):Lt()),g(``),v(!1),S(null)));let T=(0,H.useMemo)(()=>l.data??[],[l.data]),E=(0,H.useMemo)(()=>new Map(T.map(e=>[e.id,e])),[T]),D=T.filter(e=>e.kind!==`lead`&&!e.archived&&(!e.leadId||e.leadId===r?.id)&&!u.memberIds.includes(e.id)),O=T.filter(e=>e.kind!==`lead`&&!e.archived&&e.leadId&&e.leadId!==r?.id),ee=Vt(u,T.filter(e=>e.id!==r?.id&&!e.archived).map(e=>e.name)),j=e=>_?ee[e]??null:null,M=(e,t)=>d(n=>({...n,[e]:t}));async function te(e){if(e.preventDefault(),v(!0),!Object.keys(ee).length){b(!0),S(null);try{let e=r?await h.updateDot(r.id,Wt(u)):await h.createDot(Ut(u));L(R.dot(e.id),e),I(R.dots),I(`dotteam:${e.id}`),c.show({tone:`success`,title:r?`Team saved`:`${e.name} is made`}),o?.(e),t()}catch(e){S(e)}finally{b(!1)}}}let N=()=>{!m||u.memberIds.length>=8||(M(`memberIds`,[...u.memberIds,m]),g(``))};return(0,U.jsx)(s,{open:e,onClose:y?()=>{}:t,title:r?`Settings for ${r.name}`:`New Lead QA`,description:`A Lead QA dot watches your team of dots. It shows one team health word, sends one daily digest, answers questions about every member, and gives the release call.`,size:`md`,className:`lead-dialog`,children:(0,U.jsxs)(`form`,{className:`dot-form`,onSubmit:e=>void te(e),noValidate:!0,children:[x!=null&&(0,U.jsx)(i,{compact:!0,error:x,title:r?`Could not save the team`:`Could not make the lead`}),(0,U.jsx)(f,{label:`Name`,error:j(`name`),required:!0,children:(0,U.jsx)(p,{"data-autofocus":!0,value:u.name,onChange:e=>M(`name`,e.target.value),autoComplete:`off`})}),(0,U.jsxs)(`fieldset`,{className:`lead-members`,"aria-describedby":`lead-members-hint`,children:[(0,U.jsx)(`legend`,{className:`field__label`,children:`Members`}),(0,U.jsxs)(`p`,{id:`lead-members-hint`,className:`field__hint`,children:[`1 to `,8,` dots. The team panel lists them in this order.`]}),u.memberIds.length>0&&(0,U.jsx)(`ul`,{className:`lead-members__list`,"aria-label":`Members of the team`,children:u.memberIds.map((e,t)=>{let n=E.get(e);return(0,U.jsxs)(`li`,{className:`lead-members__row`,children:[(0,U.jsxs)(`span`,{className:`lead-members__text`,children:[(0,U.jsx)(`span`,{className:`lead-members__name`,children:n?.name??`A dot that no longer exists`}),n&&(0,U.jsx)(`span`,{className:`lead-members__job`,children:Gt(n)})]}),(0,U.jsxs)(`span`,{className:`lead-members__actions`,children:[(0,U.jsx)(k,{size:`sm`,disabled:t===0,onClick:()=>M(`memberIds`,qt(u.memberIds,t,-1)),"aria-label":`Move ${n?.name??`this dot`} up`,children:`Up`}),(0,U.jsx)(k,{size:`sm`,disabled:t===u.memberIds.length-1,onClick:()=>M(`memberIds`,qt(u.memberIds,t,1)),"aria-label":`Move ${n?.name??`this dot`} down`,children:`Down`}),(0,U.jsx)(k,{size:`sm`,onClick:()=>M(`memberIds`,u.memberIds.filter(t=>t!==e)),"aria-label":`Remove ${n?.name??`this dot`} from the team`,children:`Remove`})]})]},e)})}),u.memberIds.length<8&&(0,U.jsxs)(`div`,{className:`lead-members__add`,children:[(0,U.jsx)(f,{label:`Add a dot`,hideLabel:!0,children:(0,U.jsx)(n,{value:m,onChange:e=>g(e.target.value),options:[{value:``,label:D.length?`Pick a dot to add`:`No other dot to add`},...D.map(e=>({value:e.id,label:e.name}))],disabled:!D.length})}),(0,U.jsx)(k,{onClick:N,disabled:!m,children:`Add to team`})]}),O.length>0&&(0,U.jsxs)(`p`,{className:`field__hint`,children:[O.map(e=>e.name).join(`, `),` `,O.length===1?`is`:`are`,` already in another lead.`]}),j(`memberIds`)&&(0,U.jsx)(`p`,{className:`field__error`,role:`alert`,children:j(`memberIds`)})]}),(0,U.jsxs)(`div`,{className:`lead-grid`,children:[(0,U.jsx)(f,{label:`Digest`,children:(0,U.jsx)(n,{value:u.digestEvery,onChange:e=>M(`digestEvery`,e.target.value===`week`?`week`:`day`),options:Yt})}),(0,U.jsx)(f,{label:`Digest time`,children:(0,U.jsx)(n,{value:u.digestHour,onChange:e=>M(`digestHour`,e.target.value),options:Jt})})]}),(0,U.jsx)(f,{label:`Slack channel`,error:j(`slackChannel`),hint:`The team digest goes here too. Mentions in this channel reach the lead. Needs the Slack bot.`,children:(0,U.jsx)(p,{value:u.slackChannel,onChange:e=>M(`slackChannel`,e.target.value),placeholder:`#qa-team`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`})}),(0,U.jsx)(f,{label:`Daily AI calls`,error:j(`dailyModelCap`),hint:`Counts the answers of the lead's chat. The digest and the release call use no AI. Empty: no cap.`,children:(0,U.jsx)(p,{value:u.dailyModelCap,onChange:e=>M(`dailyModelCap`,e.target.value),inputMode:`numeric`,placeholder:`No cap`,autoComplete:`off`,spellCheck:!1})}),(0,U.jsx)(f,{label:`Mission`,children:(0,U.jsx)(a,{rows:2,value:u.mission,onChange:e=>M(`mission`,e.target.value)})}),(0,U.jsx)(f,{label:`Tell me when`,children:(0,U.jsx)(a,{rows:2,value:u.notifyWhen,onChange:e=>M(`notifyWhen`,e.target.value)})}),(0,U.jsx)(f,{label:`Never`,children:(0,U.jsx)(a,{rows:2,value:u.mustNot,onChange:e=>M(`mustNot`,e.target.value)})}),(0,U.jsxs)(`div`,{className:`dot-form__footer`,children:[(0,U.jsx)(k,{onClick:t,disabled:y,children:`Cancel`}),(0,U.jsx)(k,{type:`submit`,variant:`primary`,loading:y,children:r?`Save team`:`Make the lead`})]})]})})}export{X as a,Y as i,Kt as n,dt as o,Ft as r,$e as s,Xt as t};
8
+ //# sourceMappingURL=LeadDialog-N3Zul9Rw.js.map
@@ -0,0 +1 @@
1
+ .rd__body{gap:var(--space-4);flex-direction:column;min-width:0;display:flex}.rd__choices{gap:var(--space-2)}.rd__note{color:var(--text-2);font-size:var(--text-md);margin:0}.rd__note strong{color:var(--outage-fg);font-weight:var(--weight-semibold)}.rd__danger{gap:var(--space-3);padding:var(--space-3) var(--space-4);border:var(--hairline);border-color:var(--outage);border-radius:var(--radius-md);background:var(--outage-bg);flex-direction:column;display:flex}.rd__list{padding-left:var(--space-5);color:var(--text);font-size:var(--text-md);margin:0}.rd__list li{margin:var(--space-0-5) 0}.rm-row{justify-content:space-between;align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}.rm-row__text{flex:1 1 var(--content-max);min-width:0;color:var(--text-2);font-size:var(--text-md);margin:0}.arch-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.arch-row{justify-content:space-between;align-items:center;gap:var(--space-3);min-height:var(--row-comfortable);padding:var(--space-2) 0;border-top:var(--hairline);flex-wrap:wrap;display:flex}.arch-row:first-child{border-top:0}.arch-row>.status-icon{margin-top:var(--space-0-5);align-self:flex-start}.arch-row__main{flex:1 1 calc(var(--sidebar-w) - var(--space-8));flex-direction:column;min-width:0;display:flex}.arch-row__name{font-weight:var(--weight-medium);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.arch-row__meta{color:var(--text-3);font-size:var(--text-sm)}.arch-row__actions{gap:var(--space-2);flex-wrap:wrap;display:flex}.wd .dialog__footer .rm-footer-btn{margin-right:auto}.rd__confirm{scroll-margin-bottom:calc(var(--space-12) + var(--space-4))}.review-opts{gap:var(--space-4);flex-direction:column;display:flex}.review-opts__grid{gap:var(--space-4);grid-template-columns:minmax(0,1fr);display:grid}@media (min-width:640px){.review-opts__grid{gap:var(--space-4) var(--space-5);grid-template-columns:repeat(2,minmax(0,1fr))}}.review-opts__note{color:var(--text-2);font-size:var(--text-sm)}.stages{gap:var(--space-4);flex-direction:column;min-width:0;display:flex}.stage-list{border:var(--hairline);border-radius:var(--radius-md);background:var(--surface);margin:0;padding:0;list-style:none;overflow:hidden}.stage-row+.stage-row{border-top:var(--hairline)}.stages__summary{font-size:var(--text-sm);color:var(--text-2);margin:0}.stage-row__head{column-gap:var(--space-3);row-gap:var(--space-0-5);padding:var(--space-3) var(--space-4);grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"avatar name switch""avatar about about""avatar own own""avatar open open";align-items:start;display:grid}.stage-row__avatar{flex:none;grid-area:avatar;display:inline-flex}.stage-row__text{display:contents}.stage-row__name{font-size:var(--text-md);font-weight:var(--weight-semibold);line-height:var(--leading-tight);grid-area:name;align-self:center;margin:0}.stage-row.is-off .stage-row__name{color:var(--text-2)}.stage-row__about{font-size:var(--text-sm);color:var(--text-2);text-wrap:pretty;grid-area:about;margin:0}.stage-row__own{font-size:var(--text-xs);color:var(--text-3);grid-area:own;margin:0}.stage-row__warn{align-items:flex-start;gap:var(--space-1);margin-top:var(--space-0-5);color:var(--attention-fg);display:flex}.stage-row__warn .status-icon{margin-top:1px}.stage-row__open{margin:var(--space-1) 0 0 calc(-1 * var(--space-2));color:var(--text-2);grid-area:open;justify-self:start}.stage-row__open[aria-expanded=true] .btn__icon svg{transform:rotate(180deg)}.stage-row__switch{align-self:center;align-items:center;gap:var(--space-2);white-space:nowrap;grid-area:switch;display:flex}.stage-row__state{min-width:24px;font-size:var(--text-sm);font-weight:var(--weight-medium);color:var(--text-2)}@media (pointer:coarse){.stage-row__switch .toggle__switch:before{inset:-12px -8px}}.stage-avatar--off{opacity:.5}.stage-row__panel{gap:var(--space-4);padding:var(--space-4);border-top:var(--hairline);background:var(--surface-2);flex-direction:column;min-width:0;display:flex}.stage-row__note{font-size:var(--text-sm);color:var(--text-2);margin:0}.stage-row__options{gap:var(--space-5);flex-direction:column;min-width:0;display:flex}.stage-opt{gap:var(--space-3);min-width:0;padding-top:var(--space-4);border-top:var(--hairline);flex-direction:column;display:flex}.stage-opt__title{font-size:var(--text-md);font-weight:var(--weight-semibold);margin:0}.stage-opt__hint{margin:calc(-1 * var(--space-2)) 0 0;font-size:var(--text-sm);color:var(--text-3)}.stage-opt__body{gap:var(--space-4);flex-direction:column;min-width:0;display:flex}.stage-row__panel .probe,.stage-row__panel .choice,.stage-row__panel .check{background:var(--surface)}@media (max-width:380px){.stage-row__head{column-gap:var(--space-2);padding:var(--space-3);grid-template-areas:"avatar name name""avatar about about""avatar own own""open open switch"}.stage-row__open{padding-inline:var(--space-1);margin-left:calc(-1 * var(--space-1))}.stage-row__switch{justify-self:end}.stage-row__panel .toggle__label{font-size:var(--text-sm)}}@media (max-width:480px){.stage-row__panel{padding:var(--space-3)}.stage-row__panel .probe{padding:var(--space-2) var(--space-3) var(--space-3)}}select.stage-model{white-space:nowrap;text-overflow:ellipsis}.stage-notice{gap:var(--space-3);padding:var(--space-3) var(--space-4);border:var(--hairline);border-radius:var(--radius-md);background:var(--surface-2);display:flex}.stage-notice__icon{padding-top:var(--space-0-5);color:var(--text-2);flex:none;display:inline-flex}.stage-notice__body{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}.stage-notice__title{font-size:var(--text-md);font-weight:var(--weight-semibold);margin:0}.stage-notice__text{font-size:var(--text-sm);color:var(--text-2);margin:0}.stage-notice__actions{align-items:center;gap:var(--space-2);margin-top:var(--space-2);flex-wrap:wrap;display:flex}.stage-notice__error{margin:var(--space-2) 0 0;font-size:var(--text-sm);color:var(--outage-fg)}
@@ -0,0 +1,2 @@
1
+ import{Cn as e,Tn as t,Vn as n,Wn as r,b as i,mn as a,pn as o,q as s}from"./ui-DcmhYyYp.js";import{t as c}from"./router-W6nZsQ33.js";import{n as l,r as u,t as d}from"./store-IqrqHuFR.js";import{t as f}from"./data-CmXvx3Mj.js";import{It as p,Lt as m,mn as h}from"./index-B6qKm1NW.js";var g=r(n(),1);function _(){let n=s(),[r,i]=(0,g.useState)(null);async function a(r){i(r.id);try{let e=await t.updateDot(r.id,{pollGithub:!0});d(f.dots)!==void 0&&u(f.dots,t=>(t??[]).map(t=>t.id===r.id?e:t)),d(f.dot(r.id))!==void 0&&u(f.dot(r.id),e),n.show({tone:`success`,title:`Polling is on for ${r.name}`,body:`It asks GitHub for new PRs every ${e.pollSec??60} s.`})}catch(t){n.show({tone:`error`,title:`Could not turn on polling for ${r.name}`,body:t instanceof e?t.message:void 0,action:{label:`Try again`,onClick:()=>void a(r)}})}finally{i(null),l(`dot`)}}return{turnOn:a,pendingId:r}}var v=a();function y({dot:e}){let{turnOn:t,pendingId:n}=_();return(0,v.jsx)(o,{size:`sm`,loading:n===e.id,onClick:()=>void t(e),"aria-label":`Turn on polling for ${e.name}`,children:`Turn on polling`})}function b({dot:e,variant:t=`line`}){let{isAdmin:n,canEdit:r}=h(),a=p(e);if(!a)return null;let o=t===`banner`&&a.tone===`attention`,s=[`listening`,`listening--${a.tone}`,o?`run-banner run-banner--attention listening--banner`:``].filter(Boolean).join(` `);return(0,v.jsxs)(`div`,{className:s,role:a.tone===`attention`?`status`:void 0,children:[(0,v.jsx)(i,{kind:a.tone===`ok`?`passed`:`attention`,label:a.title,decorative:!0,size:16}),(0,v.jsxs)(`span`,{className:`listening__text`,children:[(0,v.jsx)(`span`,{className:`listening__title`,children:a.title}),a.detail&&(0,v.jsxs)(`span`,{className:`listening__detail`,children:[a.tone===`ok`?`. `:` `,a.detail]})]}),a.action===`polling`&&r&&(0,v.jsx)(y,{dot:e}),a.action===`setup`&&n&&(0,v.jsx)(`a`,{className:`btn btn--secondary btn--sm`,href:c({name:`setup`}),children:(0,v.jsx)(`span`,{className:`btn__label`,children:`Open Setup`})})]})}function x({dot:e,variant:t=`line`}){let n=m(e);if(!n)return null;let r=[`listening`,`listening--attention`,t===`banner`?`run-banner run-banner--attention listening--banner`:``].filter(Boolean).join(` `);return(0,v.jsxs)(`div`,{className:r,role:`status`,"data-scope-not-applied":!0,children:[(0,v.jsx)(i,{kind:`attention`,label:n.title,decorative:!0,size:16}),(0,v.jsxs)(`span`,{className:`listening__text`,children:[(0,v.jsx)(`span`,{className:`listening__title`,children:n.title}),t===`banner`&&n.detail&&(0,v.jsxs)(`span`,{className:`listening__detail`,children:[` `,n.detail]})]})]})}export{x as n,b as t};
2
+ //# sourceMappingURL=ListeningLine-BRFNaczY.js.map
@@ -0,0 +1 @@
1
+ .listening{align-items:center;gap:var(--space-1) var(--space-2);min-width:0;color:var(--text-3);font-size:var(--text-sm);flex-wrap:wrap;display:flex}.listening .status-icon{flex:none}.listening__text{overflow-wrap:anywhere;text-wrap:pretty;flex:12rem;min-width:0}.listening--attention{color:var(--attention-fg)}.listening--attention .listening__detail{color:var(--text-2)}.listening .btn{white-space:nowrap;flex:none}.listening--banner{gap:var(--space-2) var(--space-3)}.dot-row__meta>.listening,.dot-head__meta>.listening{flex:100%}
@@ -0,0 +1,2 @@
1
+ import{Sn as e,_n as t,bn as n,gn as r,hn as i,mn as a,vn as o,w as s,x as c,xn as l}from"./ui-DcmhYyYp.js";var u=a(),d=[{id:`light`,label:`Light`,bg:`#ffffff`,fg:`#18181b`,line:`#e4e4e7`},{id:`dark`,label:`Dark`,bg:`#18181b`,fg:`#f4f4f5`,line:`#2e2e33`}];function f(t){let r=n.find(e=>l[e]===t);return r?e[r]:`Dot`}function p(){return(0,u.jsxs)(`main`,{className:`mascot-gallery`,id:`main`,tabIndex:-1,children:[(0,u.jsx)(`h1`,{children:`Mascots`}),(0,u.jsxs)(`p`,{className:`mascot-gallery__intro`,children:[t.length,` dot characters and `,i.length-t.length,` stage characters, four states each.`]}),(0,u.jsx)(`div`,{className:`mascot-gallery__themes`,children:d.map(e=>(0,u.jsxs)(`section`,{className:`mascot-gallery__panel`,"data-theme-panel":e.id,"aria-label":`${e.label} surface`,style:{background:e.bg,color:e.fg,borderColor:e.line},children:[(0,u.jsx)(`h2`,{children:e.label}),(0,u.jsxs)(`table`,{className:`mascot-gallery__table`,children:[(0,u.jsx)(`thead`,{children:(0,u.jsxs)(`tr`,{children:[(0,u.jsx)(`th`,{scope:`col`,children:`Character`}),o.map(e=>(0,u.jsx)(`th`,{scope:`col`,children:e},e))]})}),(0,u.jsx)(`tbody`,{children:i.map(e=>(0,u.jsxs)(`tr`,{"data-mascot":e,children:[(0,u.jsxs)(`th`,{scope:`row`,children:[r[e],(0,u.jsx)(`span`,{className:`mascot-gallery__role`,children:f(e)})]}),o.map(t=>(0,u.jsx)(`td`,{children:(0,u.jsxs)(`span`,{className:`mascot-gallery__cell`,children:[(0,u.jsx)(c,{name:e,state:t,size:64}),(0,u.jsx)(c,{name:e,state:t,size:20})]})},t))]},e))})]})]},e.id))}),(0,u.jsx)(`h2`,{children:`Stage helper`}),(0,u.jsx)(`ul`,{className:`mascot-gallery__stages`,children:n.map(e=>(0,u.jsxs)(`li`,{children:[(0,u.jsx)(c,{...s(e,`ok`),size:32}),(0,u.jsxs)(`code`,{children:[`stageMascot('`,e,`', 'ok')`]})]},e))})]})}export{p as default};
2
+ //# sourceMappingURL=Mascots-pIyGpxtD.js.map