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{At as e,E as t,F as n,G as r,H as i,In as a,It as o,J as s,Ln as c,N as l,Ot as u,P as d,R as f,Rt as p,St as m,Tn as h,Vn as g,Wn as _,Y as v,at as y,ct as b,ft as x,jt as S,kn as C,kt as w,mn as T,mt as ee,on as E,pn as D,q as O,v as k,wt as A,x as j,xt as M}from"./ui-DcmhYyYp.js";import{r as N,t as P}from"./router-W6nZsQ33.js";import{r as F,t as I}from"./storage-yvL36AWt.js";import{i as L}from"./store-IqrqHuFR.js";import{a as R}from"./data-CmXvx3Mj.js";import{a as z}from"./format-BBZ8vFyT.js";import{n as B,t as V}from"./authedMedia-BTYt_tyu.js";import{t as H}from"./GfmView-C-NYaduC.js";import{t as te}from"./RunActions-ZY7yf1AF.js";var U=_(g(),1),W={not_tested:`Not tested`,passing:`Passing`,failing:`Failing`,partly_tested:`Partly tested`,out_of_date:`Out of date`},ne=Object.keys(W),re={passing:`passed`,failing:`failed`,partly_tested:`partial`,out_of_date:`stale`,not_tested:`none`},G={passed:`Passed`,failed:`Failed`,not_run:`Not run`},K=e=>e?z[e]:`No verdict`;function ie(e,t){let n=e.indexOf(`#`);return n<0?e:t?e.slice(n):e.slice(e.lastIndexOf(`/`,n)+1)}function ae(e){return e===`github`?`github-issue`:e}var oe=e=>e.tests.total?`${e.tests.passed} / ${e.tests.total}`:`-`,se=e=>e.defects.total?`${e.defects.open} open`:`-`;function q(e,t){let n=e.indexOf(`#`);return n<0?e:t&&e.slice(0,n).toLowerCase()===t.toLowerCase()?e.slice(n):ie(e,!1)}var J=T();function ce({code:e}){return(0,J.jsx)(k,{kind:re[e],label:W[e],className:`trace-status__label`})}var le=(e,t)=>`trace-issue:${e}:${t}`;function Y({title:e,count:t,children:n}){return(0,J.jsxs)(`section`,{className:`trace-sec`,children:[(0,J.jsxs)(`h3`,{className:`trace-sec__title`,children:[e,t!==void 0&&(0,J.jsx)(`span`,{className:`trace-sec__count num`,children:t})]}),n]})}function ue({d:e}){return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{className:`trace-sum`,children:[(0,J.jsx)(ce,{code:e.statusCode}),e.url&&(0,J.jsx)(t,{source:ae(e.tracker),refKey:q(e.key,e.repo),title:e.title,href:e.url,status:e.state===`closed`?`Closed`:e.state===`open`?`Open`:e.status}),(0,J.jsxs)(`dl`,{className:`trace-meta`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Type`}),(0,J.jsx)(`dd`,{children:e.type||`-`})]}),(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Milestone`}),(0,J.jsx)(`dd`,{children:e.milestone||`-`})]}),(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Repo`}),(0,J.jsx)(`dd`,{children:e.repo||`-`})]})]}),e.reasons.length>0&&(0,J.jsx)(`ul`,{className:`trace-why`,children:e.reasons.map(e=>(0,J.jsx)(`li`,{children:e},e))})]}),e.description&&(0,J.jsx)(Y,{title:`Summary`,children:(0,J.jsx)(H,{text:e.description,demoteHeadings:!0,className:`trace-md`})}),(0,J.jsx)(Y,{title:`Acceptance criteria`,children:e.acceptanceCriteria?(0,J.jsx)(H,{text:e.acceptanceCriteria,demoteHeadings:!0,className:`trace-md`}):(0,J.jsx)(`p`,{className:`muted`,children:`None written on the issue.`})}),(0,J.jsx)(Y,{title:`PRs`,count:e.prs.length,children:e.prs.length===0?(0,J.jsx)(`p`,{className:`muted`,children:`No PR is linked.`}):(0,J.jsx)(`ul`,{className:`trace-list`,children:e.prs.map(e=>(0,J.jsxs)(`li`,{children:[(0,J.jsx)(t,{source:`github-pr`,refKey:`#${e.number}`,title:e.title,href:e.url||void 0,status:K(e.lastVerdict)}),(0,J.jsxs)(`span`,{className:`trace-list__main`,children:[K(e.lastVerdict),e.headline?`: ${e.headline}`:``,e.outdated&&` (newer commits since this check)`]}),e.runId&&(0,J.jsx)(`a`,{href:`#/runs/${encodeURIComponent(e.runId)}`,className:`trace-list__aside`,children:`Run`})]},e.ref))})}),(0,J.jsx)(Y,{title:`Tests`,count:e.tests.length,children:e.tests.length===0?(0,J.jsx)(`p`,{className:`muted`,children:`No test is linked.`}):(0,J.jsx)(`ul`,{className:`trace-list`,children:e.tests.map((t,n)=>(0,J.jsxs)(`li`,{children:[(0,J.jsx)(`span`,{className:`trace-result trace-result--${t.result}`,children:G[t.result]}),(0,J.jsx)(`span`,{className:`trace-list__main`,children:t.title}),t.pr&&(0,J.jsx)(`span`,{className:`trace-list__aside num`,children:q(t.pr,e.repo)})]},`${t.kind}:${t.title}:${n}`))})}),(0,J.jsx)(Y,{title:`Defects`,count:e.defects.length,children:e.defects.length===0?(0,J.jsx)(`p`,{className:`muted`,children:`No defect is linked.`}):(0,J.jsx)(`ul`,{className:`trace-list`,children:e.defects.map(n=>(0,J.jsxs)(`li`,{children:[(0,J.jsx)(`span`,{className:`trace-result trace-result--${n.state===`open`?`failed`:`passed`}`,children:n.state===`open`?`Open`:n.state===`closed`?`Closed`:`Unknown`}),(0,J.jsx)(t,{source:`defect`,refKey:q(n.ref,e.repo),title:n.title,href:n.url,status:n.state===`open`?`Open`:n.state===`closed`?`Closed`:void 0})]},n.ref))})}),(0,J.jsx)(Y,{title:`QA review`,children:e.review?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(H,{text:e.review.comment,demoteHeadings:!0,className:`trace-md`}),(0,J.jsx)(`p`,{className:`trace-sec__foot`,children:(0,J.jsx)(`a`,{href:`#/runs/${encodeURIComponent(e.review.runId)}`,children:`Open the review run`})})]}):(0,J.jsx)(`p`,{className:`muted`,children:`Not reviewed yet.`})})]})}function de({dotId:e,issue:t,onClose:n}){let r=L(t?le(e,t):null,n=>h.traceIssue(e,t,n),{refreshOn:[`run`],throttleMs:1500}),a=t?r.data:void 0,o=a?`${q(a.key,a.repo)} ${a.title}`.trim():t??`Requirement`;return(0,J.jsxs)(v,{open:!!t,onClose:n,side:`right`,title:o,description:`Requirement details`,hideDescription:!0,className:`trace-drawer`,children:[r.error&&!a?(0,J.jsx)(i,{compact:!0,title:`Could not load this requirement`,error:r.error,onRetry:()=>void r.reload()}):null,!a&&!r.error?(0,J.jsx)(f,{label:`Loading requirement`}):null,a&&(0,J.jsx)(ue,{d:a})]})}function fe({values:e,milestones:t,repos:r,onChange:i}){let a=(e,t)=>t&&!e.includes(t)?[...e,t]:e;return(0,J.jsxs)(`div`,{className:`trace-filters`,role:`group`,"aria-label":`Filters`,children:[(0,J.jsx)(l,{label:`Milestone`,className:`trace-filter`,children:(0,J.jsxs)(n,{value:e.milestone,onChange:e=>i({milestone:e.target.value}),children:[(0,J.jsx)(`option`,{value:``,children:`All milestones`}),a(t,e.milestone).map(e=>(0,J.jsx)(`option`,{value:e,children:e},e))]})}),(0,J.jsx)(l,{label:`Status`,className:`trace-filter`,children:(0,J.jsxs)(n,{value:e.status,onChange:e=>i({status:e.target.value}),children:[(0,J.jsx)(`option`,{value:``,children:`All statuses`}),ne.map(e=>(0,J.jsx)(`option`,{value:e,children:W[e]},e))]})}),(0,J.jsx)(l,{label:`Repo`,className:`trace-filter`,children:(0,J.jsxs)(n,{value:e.repo,onChange:e=>i({repo:e.target.value}),children:[(0,J.jsx)(`option`,{value:``,children:`All repos`}),a(r,e.repo).map(e=>(0,J.jsx)(`option`,{value:e,children:e},e))]})})]})}var pe={covered:`Covered`,partly:`Partly covered`,failing:`Failing`,needs_tests:`Needs tests`,not_run:`Not run yet`},X=e=>e===`needs_tests`||e===`not_run`,me={covered:`covered`,partly:`partly`,failing:`failing`,needs_tests:`needsTests`,not_run:`notRun`},he=Object.keys(pe),ge={root:`Map`,app:`App`,section:`Section`,page:`Page`,state:`State`},_e=[`requirements`,`tests`,`bugs`,`screenshots`,`skill`],ve=e=>_e.includes(e??``)?e:`requirements`;function ye(e){return e.kind===`root`||e.kind===`app`?e.children.flatMap(e=>e.kind===`app`?ye(e):[e]):[e]}function be(e,t=0,n=[]){n.push({node:e,depth:t});for(let r of e.children)be(r,t+1,n);return n}function xe(e,t,n){let r=n.trim().toLowerCase();if(!t.size&&!r)return e;let i=e.children.map(e=>xe(e,t,n)).filter(e=>!!e);return(!t.size||t.has(e.status))&&(!r||e.name.toLowerCase().includes(r)||(e.route??``).toLowerCase().includes(r))||i.length?{...e,children:i}:null}function Se(e,t){return new Set(be(e).filter(e=>e.depth<t&&e.node.children.length).map(e=>e.node.id))}function Ce(e,t){if(e.id===t)return[e];for(let n of e.children){let r=Ce(n,t);if(r.length)return[e,...r]}return[]}function we(e,t=[]){for(let n of e.children)n.children.length&&t.push(n.id),we(n,t);return t}var Te=[{key:`requirements`,label:`Requirements`,tab:`requirements`,scale:`accent`,value:e=>e.counts.requirements},{key:`tests`,label:`Tests`,tab:`tests`,scale:`ok`,value:e=>e.counts.tests.total},{key:`passed`,label:`Passing`,tab:`tests`,scale:`ok`,value:e=>e.counts.tests.passed},{key:`failed`,label:`Failing`,tab:`tests`,scale:`outage`,value:e=>e.counts.tests.failed},{key:`not_run`,label:`Not run`,tab:`tests`,scale:`attention`,value:e=>e.counts.tests.total-e.counts.tests.passed-e.counts.tests.failed},{key:`open`,label:`Open bugs`,tab:`bugs`,scale:`outage`,value:e=>e.counts.defects.open},{key:`needs_tests`,label:`Needs tests`,tab:`tests`,scale:`attention`,value:e=>e.counts.gaps?.needsTests??0},{key:`not_run_yet`,label:`Not run yet`,tab:`tests`,scale:`attention`,value:e=>e.counts.gaps?.notRun??0}],Ee=(e,t)=>e<=0||t<=0?0:Math.max(1,Math.ceil(e/t*4));function De(e){return e===`needs_tests`?{kind:`gap`,status:`needs_tests`}:e===`not_run_yet`?{kind:`gap`,status:`not_run`}:e===`passed`||e===`failed`||e===`not_run`?{kind:`result`,result:e}:e===`open`?{kind:`open`}:e?.startsWith(`ms:`)?{kind:`milestone`,milestone:e.slice(3)}:null}var Oe={covered:b,partly:S,failing:x,needs_tests:u,not_run:w};function ke({status:e,size:t=14}){let n=Oe[e];return(0,J.jsx)(`span`,{className:`tmap-st__icon tmap-st__icon--${e}`,"aria-hidden":`true`,children:(0,J.jsx)(n,{size:t})})}function Z({status:e,showLabel:t=!0}){let n=pe[e];return(0,J.jsxs)(`span`,{className:`status status--sm tmap-st tmap-st--${e}`,role:t?void 0:`img`,"aria-label":t?void 0:n,children:[(0,J.jsx)(ke,{status:e}),t&&(0,J.jsx)(`span`,{className:`status__label`,children:n})]})}var Ae=new Set;function je({url:t,className:n}){let{src:r,error:i}=B(t),[a,o]=(0,U.useState)(null),s=!!i||!!r&&a?.src===r&&!a.ok,c=!!r&&a?.src===r&&a.ok;return(0,U.useEffect)(()=>{s&&t&&!Ae.has(t)&&(Ae.add(t),console.warn(`Screenshot ${t} did not load; showing the page placeholder.`))},[s,t]),(0,J.jsxs)(`span`,{className:`thumb${c?` is-ready`:``}${n?` ${n}`:``}`,"data-state":c?`ready`:s||!r?`none`:`loading`,children:[!c&&(0,J.jsx)(`span`,{className:`thumb__ph`,"aria-hidden":`true`,children:(0,J.jsx)(e,{size:16})}),r&&!s&&(0,J.jsx)(`img`,{src:r,alt:``,className:`thumb__img`,loading:`lazy`,decoding:`async`,onLoad:e=>{let t=e.currentTarget,n=t.currentSrc||t.src;(typeof t.decode==`function`?t.decode():Promise.resolve()).then(()=>o({src:r??n,ok:!0}),()=>o({src:r??n,ok:t.naturalWidth>0}))},onError:()=>o({src:r,ok:!1})})]})}function Me({url:e,className:t}){let{src:n,error:r}=B(e),[i,a]=(0,U.useState)(null);return r||n&&i===n?(0,J.jsx)(`p`,{className:`muted`,children:`This screenshot is no longer on the server.`}):n?(0,J.jsx)(`img`,{src:n,alt:``,className:t,onError:()=>a(n)}):null}function Ne({n:e}){let t=e.counts;return(0,J.jsxs)(`span`,{className:`tmap-counts num`,children:[(0,J.jsxs)(`span`,{title:`Requirements`,children:[t.requirements,` req`]}),(0,J.jsxs)(`span`,{title:`Tests passed of total`,children:[t.tests.passed,`/`,t.tests.total,` tests`]}),(0,J.jsxs)(`span`,{title:`Open bugs`,className:t.defects.open?`tmap-counts__bugs`:void 0,children:[t.defects.open,` `,t.defects.open===1?`bug`:`bugs`]})]})}var Pe=`(max-width: 639px)`;function Fe(){let[e,t]=(0,U.useState)(()=>{try{return window.matchMedia(Pe).matches}catch{return!1}});return(0,U.useEffect)(()=>{let e;try{e=window.matchMedia(Pe)}catch{return}let n=()=>t(e.matches);return e.addEventListener?.(`change`,n),()=>e.removeEventListener?.(`change`,n)},[]),e}function Ie({path:e,onGo:t,label:n}){return(0,J.jsx)(`nav`,{className:`tcrumbs`,"aria-label":n,children:(0,J.jsx)(`ol`,{children:e.map((n,r)=>(0,J.jsx)(`li`,{children:r===e.length-1?(0,J.jsx)(`span`,{className:`tcrumbs__here`,"aria-current":`location`,title:n.name,children:n.name}):(0,J.jsx)(`button`,{type:`button`,className:`tcrumbs__go`,title:n.name,onClick:()=>t(r===0?null:n.id),children:n.name})},n.id))})})}function Le({narrow:e,active:t,children:n,lead:r}){let[i,a]=(0,U.useState)(!1);return e?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{className:`tmap-row`,children:[(0,J.jsxs)(D,{size:`sm`,className:`tmap-row__filters`,icon:(0,J.jsx)(ee,{size:14}),"aria-haspopup":`dialog`,onClick:()=>a(!0),children:[`Filters`,t>0&&(0,J.jsxs)(`span`,{className:`tmap-row__count num`,children:[` `,t]})]}),r]}),(0,J.jsx)(v,{open:i,onClose:()=>a(!1),title:`Filters`,className:`tmap-sheet`,footer:(0,J.jsx)(D,{onClick:()=>a(!1),children:`Done`}),children:(0,J.jsx)(`div`,{className:`tmap-bar tmap-bar--sheet`,children:n})})]}):(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`div`,{className:`tmap-bar`,children:n}),r&&(0,J.jsx)(`div`,{className:`tmap-lead`,children:r})]})}function Re(e,t){let n=0,r=0,i=1/0;for(let t of e)n+=t,r=Math.max(r,t),i=Math.min(i,t);if(n<=0||t<=0)return 1/0;let a=t*t,o=n*n;return Math.max(a*r/o,o/(a*i))}function ze(e,t){let n=e.filter(e=>e.weight>0&&Number.isFinite(e.weight)).sort((e,t)=>t.weight-e.weight),r=n.reduce((e,t)=>e+t.weight,0);if(!n.length||t.w<=0||t.h<=0)return[];let i=t.w*t.h/r,a=n.map(e=>e.weight*i),o=[],s={...t},c=0;for(;c<n.length;){let e=Math.min(s.w,s.h),t=[a[c]],r=c+1;for(;r<n.length&&Re([...t,a[r]],e)<=Re(t,e);)t.push(a[r++]);let i=t.reduce((e,t)=>e+t,0);if(s.w>=s.h){let e=r===n.length?s.w:i/s.h,a=s.y;for(let r=0;r<t.length;r++){let i=r===t.length-1?s.y+s.h-a:t[r]/e;o.push({x:s.x,y:a,w:e,h:i,item:n[c+r].item}),a+=i}s={x:s.x+e,y:s.y,w:s.w-e,h:s.h}}else{let e=r===n.length?s.h:i/s.w,a=s.x;for(let r=0;r<t.length;r++){let i=r===t.length-1?s.x+s.w-a:t[r]/e;o.push({x:a,y:s.y,w:i,h:e,item:n[c+r].item}),a+=i}s={x:s.x,y:s.y+e,w:s.w,h:s.h-e}}c=r}return o}var Be=.03,Ve=.12,He=24,Ue={w:960,h:520};function We(e){let t=e.kind===`root`?e.children.filter(e=>e.kind===`app`):[];return t.length>1?t.map(e=>({app:e,nodes:ye(e)})).filter(e=>e.nodes.length):[{nodes:ye(e)}]}var Ge=(e,t)=>t===`tests`?e.counts.tests.total:e.counts.requirements;function Ke(e){return e.status===`needs_tests`?[`tests`,`needs_tests`]:e.status===`not_run`?[`tests`,`not_run_yet`]:e.status===`failing`?[`tests`,`failed`]:[`requirements`,`requirements`]}var qe=e=>e.children[0]?.kind===`state`?`states`:e.children[0]?.kind===`section`?`areas`:`pages`;function Je(e,t){let n=e.counts;return t===`tests`?`${n.tests.passed}/${n.tests.total} tests`:`${n.requirements} req`}function Ye(e){let t=e.counts.gaps;return[t.needsTests?`${t.needsTests} need tests`:``,t.notRun?`${t.notRun} not run`:``].filter(Boolean).join(`, `)}function Xe({data:e,onOpen:t,dotFilter:n}){let r=Fe(),[i,a]=(0,U.useState)(`treemap`),[o,s]=(0,U.useState)(`tests`),[c,l]=(0,U.useState)(null),[u,d]=(0,U.useState)(60),f=(0,U.useMemo)(()=>c?Ce(e.tree,c):[],[e.tree,c]),p=f[f.length-1],m=(0,U.useMemo)(()=>p?[{nodes:p.children}]:We(e.tree),[p,e.tree]),h=(0,U.useMemo)(()=>m.flatMap(e=>e.nodes),[m]),g=e=>{l(e),d(60)},_=(f.length?f:[e.tree]).map(e=>({id:e.id,name:e.name}));return(0,J.jsxs)(`div`,{className:`theat`,children:[(0,J.jsxs)(Le,{narrow:r,active:0,lead:(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(Ie,{path:_,onGo:g,label:`Heatmap level`}),p&&(0,J.jsx)(D,{size:`sm`,className:`theat-details`,onClick:()=>t(p.id,`requirements`,`requirements`),children:`Details`})]}),children:[n,(0,J.jsx)(`div`,{className:`segmented`,role:`group`,"aria-label":`Show as`,children:[[`treemap`,`Treemap`],[`table`,`Table`]].map(([e,t])=>(0,J.jsx)(`button`,{type:`button`,className:`segmented__item${i===e?` is-selected`:``}`,"aria-pressed":i===e,onClick:()=>a(e),children:t},e))}),i===`treemap`&&(0,J.jsx)(`div`,{className:`segmented`,role:`group`,"aria-label":`Tile size`,children:[[`tests`,`Size by tests`],[`requirements`,`Size by requirements`]].map(([e,t])=>(0,J.jsx)(`button`,{type:`button`,className:`segmented__item${o===e?` is-selected`:``}`,"aria-pressed":o===e,onClick:()=>s(e),children:t},e))})]}),h.length?i===`treemap`?(0,J.jsx)(Ze,{groups:m,sizeBy:o,cap:u,onMore:()=>d(e=>e+60),onDrill:g,onOpen:t}):(0,J.jsx)(Qe,{rows:h,milestones:e.milestones,onOpen:t}):(0,J.jsx)(`p`,{className:`tmap-note`,children:p?`Nothing under this one yet.`:`No area yet. Areas appear once a test run visits a page.`})]})}function Ze({groups:e,sizeBy:t,cap:n,onMore:r,onDrill:i,onOpen:a}){let o=(0,U.useRef)(null),[s,c]=(0,U.useState)(Ue);(0,U.useLayoutEffect)(()=>{let e=o.current;if(!e)return;let t=()=>{let t=e.clientWidth,n=e.clientHeight;t>0&&n>0&&c(e=>e.w===t&&e.h===n?e:{w:t,h:n})};if(t(),typeof ResizeObserver!=`function`)return;let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let l=(0,U.useMemo)(()=>{let r=e.flatMap(e=>e.nodes),i=r.reduce((e,n)=>e+Ge(n,t),0),a=e=>i>0?Math.max(Ge(e,t),i*(X(e.status)?Ve:Be)):1,o=new Set([...r].sort((e,t)=>a(t)-a(e)).slice(0,n)),c=r.length-o.size,l=e=>e.filter(e=>o.has(e)).map(e=>({weight:a(e),item:{node:e}})),u=r.filter(e=>!o.has(e)).reduce((e,t)=>e+a(t),0),d={x:0,y:0,w:s.w,h:s.h},f=[],p=[];if(e.length>1){let t=ze(e.map(e=>({weight:e.nodes.reduce((e,t)=>e+a(t),0),item:e})),d);for(let e of t){let n=e.h>48?He:0;n&&e.item.app&&p.push({r:{x:e.x,y:e.y,w:e.w,h:n},app:e.item.app});let r={x:e.x,y:e.y+n,w:e.w,h:e.h-n},i=l(e.item.nodes);e===t[t.length-1]&&c&&i.push({weight:u,item:{more:c}});for(let e of ze(i,r))f.push({r:e,item:e.item})}}else{let t=l(e[0].nodes);c&&t.push({weight:u,item:{more:c}});for(let e of ze(t,d))f.push({r:e,item:e.item})}return{tiles:f,heads:p}},[e,t,n,s]),u=e=>({left:`${e.x/s.w*100}%`,top:`${e.y/s.h*100}%`,width:`${e.w/s.w*100}%`,height:`${e.h/s.h*100}%`});return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{ref:o,className:`theat-map`,role:`group`,"aria-label":`Treemap, tile size by ${t}`,children:[l.heads.map(({r:e,app:t})=>(0,J.jsx)(`button`,{type:`button`,className:`theat-head`,style:u(e),title:t.name,onClick:()=>i(t.id),children:(0,J.jsx)(`span`,{className:`theat-head__name`,children:t.name})},`h-${t.id}`)),l.tiles.map(({r:e,item:n})=>{if(`more`in n)return(0,J.jsx)(`button`,{type:`button`,className:`theat-tile theat-tile--more`,style:u(e),onClick:r,children:(0,J.jsx)(`span`,{className:`theat-tile__in`,children:(0,J.jsxs)(`span`,{className:`theat-tile__name num`,children:[`+`,n.more,` more`]})})},`more`);let o=n.node,s=o.children.length,c=Ye(o),l=[`${o.name}: ${pe[o.status]}`,`${o.counts.tests.passed} of ${o.counts.tests.total} tests passing`,`${o.counts.requirements} requirements`,c,s?`${s} ${qe(o)} inside`:``].filter(Boolean).join(`, `);return(0,J.jsx)(`button`,{type:`button`,className:`theat-tile theat-tile--${o.status}${X(o.status)?` theat-tile--gap`:``}`,style:u(e),"aria-label":l,title:l,"data-tile":o.id,onClick:()=>s?i(o.id):a(o.id,...Ke(o)),children:(0,J.jsxs)(`span`,{className:`theat-tile__in`,"aria-hidden":`true`,children:[(0,J.jsxs)(`span`,{className:`theat-tile__head`,children:[(0,J.jsx)(ke,{status:o.status,size:16}),(0,J.jsx)(`span`,{className:`theat-tile__name`,children:o.name})]}),(0,J.jsx)(`span`,{className:`theat-tile__count num`,children:Je(o,t)}),c&&(0,J.jsx)(`span`,{className:`theat-tile__gaps num`,children:c}),(0,J.jsx)(`span`,{className:`theat-tile__word`,children:pe[o.status]})]})},o.id)})]}),(0,J.jsxs)(`ul`,{className:`theat-legend`,"aria-label":`Tile colors`,children:[he.map(e=>(0,J.jsxs)(`li`,{className:`theat-legend__item theat-legend__item--${e}`,children:[(0,J.jsx)(`span`,{className:`theat-legend__swatch theat-tile--${e}${X(e)?` theat-tile--gap`:``}`,"aria-hidden":`true`}),(0,J.jsx)(Z,{status:e})]},e)),(0,J.jsxs)(`li`,{className:`theat-legend__size`,children:[`Tile size: `,t===`tests`?`tests`:`requirements`]})]})]})}function Qe({rows:e,milestones:t,onOpen:n}){let[r,i]=(0,U.useState)(`results`),[a,o]=(0,U.useState)(new Set),s=(0,U.useMemo)(()=>r===`results`?Te.map(e=>({...e})):t.map(e=>({key:`ms:${e}`,label:e,tab:`bugs`,scale:`outage`,value:t=>t.milestones?.[e]??0})),[r,t]),c=e.flatMap(e=>[e,...a.has(e.id)?e.children:[]]),l=s.map(e=>Math.max(0,...c.map(e.value))),u=e=>o(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),d=e=>s.map((t,r)=>{let i=t.value(e);return(0,J.jsx)(`td`,{className:`theat-td`,children:(0,J.jsx)(`button`,{type:`button`,className:`theat-cell theat-cell--${t.scale} theat-cell--l${Ee(i,l[r])}`,"aria-label":`${e.name}, ${t.label}: ${i}`,onClick:()=>n(e.id,t.tab,t.key),children:(0,J.jsx)(`span`,{className:`num`,children:i})})},t.key)});return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`div`,{className:`theat-bar`,children:(0,J.jsx)(`div`,{className:`segmented`,role:`group`,"aria-label":`Columns`,children:[[`results`,`Test results`],[`milestones`,`Bugs by milestone`]].map(([e,t])=>(0,J.jsx)(`button`,{type:`button`,className:`segmented__item${r===e?` is-selected`:``}`,"aria-pressed":r===e,onClick:()=>i(e),children:t},e))})}),r===`milestones`&&!s.length?(0,J.jsx)(`p`,{className:`tmap-note`,children:`No requirement or bug has a milestone yet.`}):(0,J.jsx)(`div`,{className:`trace-wrap theat-wrap`,children:(0,J.jsxs)(`table`,{className:`trace-table theat-table`,children:[(0,J.jsx)(`caption`,{className:`sr-only`,children:r===`results`?`Requirements, tests and open bugs per area`:`Open bugs per area and milestone`}),(0,J.jsx)(`thead`,{children:(0,J.jsxs)(`tr`,{children:[(0,J.jsx)(`th`,{scope:`col`,children:`Section`}),s.map(e=>(0,J.jsx)(`th`,{scope:`col`,className:`trace-num`,children:e.label},e.key))]})}),(0,J.jsx)(`tbody`,{children:e.map(e=>(0,J.jsxs)(U.Fragment,{children:[(0,J.jsxs)(`tr`,{children:[(0,J.jsx)(`th`,{scope:`row`,className:`theat-name`,children:(0,J.jsxs)(`span`,{className:`theat-name__in`,children:[e.children.length>0?(0,J.jsx)(`button`,{type:`button`,className:`tmap-toggle${a.has(e.id)?` is-open`:``}`,"aria-expanded":a.has(e.id),"aria-label":`${a.has(e.id)?`Hide`:`Show`} ${e.kind===`section`?`pages`:`states`} of ${e.name}`,onClick:()=>u(e.id),children:(0,J.jsx)(y,{size:12})}):(0,J.jsx)(`span`,{className:`tmap-toggle tmap-toggle--leaf`,"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:`theat-label${e.kind===`section`?``:` num`}`,children:e.name}),(0,J.jsx)(Z,{status:e.status})]})}),d(e)]}),a.has(e.id)&&e.children.map(e=>(0,J.jsxs)(`tr`,{className:`theat-page`,children:[(0,J.jsx)(`th`,{scope:`row`,className:`theat-name`,children:(0,J.jsxs)(`span`,{className:`theat-name__in`,children:[(0,J.jsx)(`span`,{className:`tmap-toggle tmap-toggle--leaf`,"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:`theat-label num`,children:e.name}),(0,J.jsx)(Z,{status:e.status})]})}),d(e)]},e.id))]},e.id))})]})})]})}var $e=e=>e===`root`||e===`app`?70:98,et=.15,Q=1.25,tt=.6,nt=e=>`more:${e}`;function rt(e,t,n=new Map,r=300){let i=new Map,a=1,o=0,s=[e];for(let e=0;e<s.length;e++){let c=s[e];if(!t.has(c.id)||!c.children.length)continue;let l=Math.min(c.children.length,n.get(c.id)??24),u=Math.max(0,Math.min(l,r-a));i.set(c.id,u),a+=u,o+=c.children.length-u;for(let e=0;e<u;e++)s.push(c.children[e])}return{shown:i,count:a,hidden:o}}var it=2e3;function at(e,t,n={},r={}){let i=Math.max(388,r.width??it),a=rt(e,t,r.limits,r.cap),o=(e,t)=>{let n=$e(e.kind),r=a.shown.get(e.id);if(r===void 0)return{w:336,h:n,kids:[],node:e};let i=e.children.length-r,s=Math.max(336,t-28-24),c=e.children.slice(0,r).map(e=>({b:o(e,s),n:e,x:0,y:0}));i>0&&c.push({b:null,n:null,more:i,x:0,y:0});let l=0,u=0,d=0,f=0;for(let e of c){let t=e.b?e.b.w:336,n=e.b?e.b.h:56;l>0&&l+t>s&&(u+=d+16,l=0,d=0),e.x=l,e.y=u,l+=t+16,d=Math.max(d,n),f=Math.max(f,l-16)}let p={w:f+24,h:u+d+24};return{w:Math.max(336,28+p.w),h:n+16+p.h,kids:c,node:e,group:p}},s=[],c=new Map,l=[],u=[],d=(e,t,n,r,i)=>{let a=e.node,o={node:a,depth:r,x:t,y:n,w:336,h:$e(a.kind),...i?{parent:i}:{}};if(s.push(o),c.set(a.id,o),!e.group)return;let f=t+28,p=n+o.h+16;u.push({parent:a.id,x:f,y:p,w:e.group.w,h:e.group.h});for(let t of e.kids){let e=f+12+t.x,n=p+12+t.y;if(t.b&&t.n)l.push({from:a.id,to:t.n.id}),d(t.b,e,n,r+1,a.id);else if(t.more){let i=nt(a.id),o={node:{id:i,kind:a.children[0]?.kind??`page`,name:`+${t.more} more`,status:`covered`,counts:{requirements:0,tests:{passed:0,failed:0,total:0},defects:{open:0,total:0},gaps:{needsTests:0,notRun:0}},children:[]},depth:r+1,x:e,y:n,w:336,h:56,parent:a.id,more:{parent:a.id,hidden:t.more}};s.push(o),c.set(i,o)}}};d(o(e,i),0,0,0);for(let e of s){let t=n[e.node.id];t&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&(e.x=t.x,e.y=t.y)}return{nodes:s,byId:c,edges:l,groups:u,hidden:a.hidden}}function ot(e){if(!e.length)return{x:0,y:0,w:0,h:0};let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x),n=Math.min(n,a.y),r=Math.max(r,a.x+a.w),i=Math.max(i,a.y+a.h);return{x:t,y:n,w:r-t,h:i-n}}var $=e=>ot([...e.nodes,...e.groups]);function st(e,t){let n=e.byId.get(t);if(!n)return $(e);let r=new Set([t]),i=[n];for(let t of e.nodes)t.parent&&r.has(t.parent)&&!r.has(t.node.id)&&(r.add(t.node.id),i.push(t));for(let t of e.groups)r.has(t.parent)&&i.push(t);return ot(i)}var ct=e=>Math.min(2,Math.max(et,e));function lt(e,t,n,r=24,i=48){if(t<=0||n<=0||e.w<=0||e.h<=0)return{x:r-e.x,y:i-e.y,k:1};let a=(t-2*r)/e.w,o=(n-i-r)/e.h,s=ct(Math.min(1,a,Math.max(o,tt)));return{x:e.w*s<=t-2*r?(t-e.w*s)/2-e.x*s:r-e.x*s,y:i-e.y*s,k:s}}var ut=(e,t,n)=>lt(e,t,n).k;function dt(e,t,n,r,i,a){if(i<=0||a<=0)return at(e,t,n,r);let o=i-48,s=null;for(let c of[1,.85,.72,tt])if(s=at(e,t,n,{...r,width:o/c}),ut($(s),i,a)>=c-1e-6)return s;return s}function ft(e,t,n,r){let i=ct(e.k*t),a=i/e.k;return{x:n-(n-e.x)*a,y:r-(r-e.y)*a,k:i}}function pt(e,t){let n=e.x+14,r=e.y+e.h;return`M${n},${r} V${Math.max(r,t.y+12+24)} H${t.x}`}var mt=e=>`traceMapPos:${e}`;function ht(e){let t=I(mt(e),{});if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){let t=r;t&&typeof t.x==`number`&&typeof t.y==`number`&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&(n[e]={x:t.x,y:t.y})}return n}function gt(e,t){F(mt(e),t)}var _t=4,vt=168,yt=112,bt=5;function xt({dots:e,onDot:t}){if(!e)return null;let n=e.find(e=>e.running),r=e.slice(0,bt),i=e.length-r.length;return(0,J.jsxs)(`div`,{className:`tcan-dots`,children:[e.length===0&&(0,J.jsx)(`span`,{className:`tcan-dots__none`,children:`No dot has visited this`}),r.map(e=>(0,J.jsx)(`button`,{type:`button`,className:`tcan-avatar`,"aria-label":`Open dot ${e.name}`,title:e.name,onClick:()=>t(e.id),children:(0,J.jsx)(j,{name:e.avatar,state:e.running?`running`:`ok`,size:20,decorative:!0})},e.id)),i>0&&(0,J.jsxs)(`span`,{className:`tcan-dots__more num`,title:e.slice(bt).map(e=>e.name).join(`, `),children:[`+`,i]}),n?.running&&(0,J.jsxs)(`a`,{className:`tcan-live`,href:`#/runs/${encodeURIComponent(n.running.runId)}`,title:`${n.name}: ${n.running.label}`,children:[(0,J.jsx)(`span`,{className:`tcan-live__dot`,"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:`tcan-live__label`,children:n.running.label})]})]})}var St=(0,U.memo)(function({p:e,isOpen:t,locked:n,selected:r,toggle:i,onPick:a,onOpen:o,onDot:s}){let c=e.node,l=X(c.status);return(0,J.jsxs)(`li`,{className:`tcan-node tcan-node--${c.kind}${r?` is-selected`:``}${l?` tcan-node--gap`:``}`,style:{transform:`translate(${e.x}px, ${e.y}px)`,width:e.w,height:e.h},"data-box":c.id,"data-status":c.status,children:[(0,J.jsxs)(`div`,{className:`tcan-row`,children:[c.children.length>0?(0,J.jsx)(`button`,{type:`button`,className:`tmap-toggle${t?` is-open`:``}`,"aria-expanded":t,"aria-label":`${t?`Collapse`:`Expand`} ${c.name}`,disabled:n,onClick:()=>i(c.id),children:(0,J.jsx)(y,{size:12})}):(0,J.jsx)(`span`,{className:`tmap-toggle tmap-toggle--leaf`,"aria-hidden":`true`}),(0,J.jsxs)(`button`,{type:`button`,className:`tmap-open tcan-open`,onClick:()=>a(c.id),"data-node":c.id,children:[(0,J.jsx)(`span`,{className:`tcan-thumbbox`,"aria-hidden":`true`,children:(0,J.jsx)(je,{url:l?null:c.screenshot,className:`tcan-thumb`})}),(0,J.jsxs)(`span`,{className:`tcan-text`,children:[(0,J.jsxs)(`span`,{className:`tcan-line`,children:[(0,J.jsx)(`span`,{className:`tmap-kind`,children:ge[c.kind]}),(0,J.jsx)(`span`,{className:`tmap-name`,title:c.name,children:c.name})]}),(0,J.jsx)(`span`,{className:`tcan-line`,children:(0,J.jsx)(Z,{status:c.status})}),(0,J.jsx)(`span`,{className:`tcan-line`,children:(0,J.jsx)(Ne,{n:c})})]})]}),c.children.length>0&&(0,J.jsx)(`button`,{type:`button`,className:`tcan-details`,"aria-label":`Details of ${c.name}`,title:`Details`,onClick:()=>o(c.id),children:(0,J.jsx)(M,{size:16})})]}),(0,J.jsx)(xt,{dots:c.dots,onDot:s})]})}),Ct=(0,U.memo)(function({p:e,onMore:t}){return(0,J.jsx)(`li`,{className:`tcan-node tcan-node--more`,style:{transform:`translate(${e.x}px, ${e.y}px)`,width:e.w,height:e.h},"data-more":e.more.parent,children:(0,J.jsxs)(`button`,{type:`button`,className:`tcan-more`,onClick:()=>t(e.more.parent),children:[(0,J.jsxs)(`span`,{className:`num`,children:[`+`,e.more.hidden]}),` more`]})})}),wt=(0,U.memo)(function({layout:e}){let t=$(e),n=t.x-8,r=t.y-8,i=Math.max(1,t.w+16),a=Math.max(1,t.h+16);return(0,J.jsxs)(`svg`,{className:`tcan-edges`,style:{left:n,top:r},width:i,height:a,viewBox:`${n} ${r} ${i} ${a}`,"aria-hidden":`true`,focusable:`false`,children:[e.groups.map(e=>(0,J.jsx)(`rect`,{className:`tcan-group`,x:e.x,y:e.y,width:e.w,height:e.h,rx:10},`g-${e.parent}`)),e.groups.map(t=>{let n=e.byId.get(t.parent);return n?(0,J.jsx)(`path`,{d:pt(n,t)},`e-${t.parent}`):null})]})});function Tt({layout:e,view:t,size:n,onCenter:r}){let i=(0,U.useMemo)(()=>$(e),[e]),a=i.w>0&&i.h>0?Math.min(160/i.w,104/i.h):1,o=(vt-i.w*a)/2,s=(yt-i.h*a)/2,c=(0,U.useMemo)(()=>e.nodes.map(e=>(0,J.jsx)(`rect`,{className:`tcan-mini__node tcan-mini__node--${e.node.status}`,x:o+(e.x-i.x)*a,y:s+(e.y-i.y)*a,width:Math.max(1,e.w*a),height:Math.max(1,e.h*a)},e.node.id)),[e,i,a,o,s]),l=e=>{let t=e.currentTarget.getBoundingClientRect();r(i.x+(e.clientX-t.left-o)/a,i.y+(e.clientY-t.top-s)/a)};return(0,J.jsx)(`div`,{className:`tcan-mini`,"aria-hidden":`true`,children:(0,J.jsxs)(`svg`,{width:vt,height:yt,onPointerDown:e=>{e.stopPropagation();try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}l(e)},onPointerMove:e=>{e.buttons&1&&l(e)},children:[c,n.w>0&&(0,J.jsx)(`rect`,{className:`tcan-mini__view`,x:o+(-t.x/t.k-i.x)*a,y:s+(-t.y/t.k-i.y)*a,width:n.w/t.k*a,height:n.h/t.k*a})]})})}function Et({tree:e,open:t,locked:n,toggle:r,onPick:i,onOpen:a,onMore:s,onDot:c,selected:l,scope:u,fitKey:d=``,focus:f,focusKey:p=0,limits:m,cap:h}){let g=(0,U.useRef)(null),_=(0,U.useRef)(null),[v,y]=(0,U.useState)(48),[b,x]=(0,U.useState)(()=>ht(u)),S=(0,U.useRef)(b),[C,w]=(0,U.useState)({x:24,y:24,k:1}),[T,ee]=(0,U.useState)({w:0,h:0}),E=(0,U.useMemo)(()=>dt(e,t,b,{...m?{limits:m}:{},...h?{cap:h}:{}},T.w,T.h),[e,t,b,m,h,T.w,T.h]),[O,k]=(0,U.useState)(!1),j=(0,U.useRef)(null),M=(0,U.useRef)(new Map),N=(0,U.useRef)(!1),P=(0,U.useRef)(C),F=(0,U.useRef)(E);(0,U.useLayoutEffect)(()=>{P.current=C,F.current=E,S.current=b});let I=(0,U.useCallback)(()=>{let e=g.current;return e?{w:e.clientWidth,h:e.clientHeight}:{w:0,h:0}},[]),L=e=>f&&e.byId.has(f)?st(e,f):$(e),R=(0,U.useRef)(L);(0,U.useLayoutEffect)(()=>{R.current=L});let z=(0,U.useCallback)(()=>{k(!1);let e=I();w(lt(R.current(F.current),e.w,e.h,24,v))},[I,v]),B=(0,U.useCallback)(e=>{k(!0),w(e)},[]);(0,U.useLayoutEffect)(()=>{let e=g.current;if(!e)return;let t=()=>{let e=I();ee(t=>t.w===e.w&&t.h===e.h?t:e);let t=_.current?.offsetHeight??0;y(t?t+24:48)};if(t(),typeof ResizeObserver!=`function`)return;let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[I]);let V=`${d}|${T.w}x${T.h}`,[H,te]=(0,U.useState)({auto:``,focus:p});if(H.auto!==V||H.focus!==p){let e=H.focus!==p;te({auto:V,focus:p}),T.w>0&&T.h>0&&(e||!O)&&(e&&k(!1),w(lt(L(E),T.w,T.h,24,v)))}(0,U.useEffect)(()=>{let e=g.current;if(!e)return;let t=t=>{t.preventDefault();let n=e.getBoundingClientRect(),r=t.deltaY*(t.deltaMode===1?16:t.deltaMode===2?400:1),i=Math.exp(-r*(t.ctrlKey?.01:.0015));k(!0),w(e=>ft(e,i,t.clientX-n.left,t.clientY-n.top))};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[]);let W=e=>{let t=I();B(n=>ft(n,e,t.w/2,t.h/2))},ne=e=>{let t=g.current.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}},re=()=>{let[e,t]=[...M.current.values()];e&&t&&(j.current={kind:`pinch`,d0:Math.hypot(e.x-t.x,e.y-t.y)||1,mx:(e.x+t.x)/2,my:(e.y+t.y)/2,v:P.current})},G=e=>{if(e.pointerType===`mouse`&&e.button!==0)return;let t=e.pointerId??1;if(M.current.set(t,ne(e)),M.current.size===2)return re();if(M.current.size>2)return;let n=e.target.closest?.(`[data-box]`),r=n?F.current.byId.get(n.getAttribute(`data-box`)??``):void 0;j.current=r?{kind:`node`,pointer:t,id:r.node.id,sx:e.clientX,sy:e.clientY,nx:r.x,ny:r.y,moved:!1}:{kind:`pan`,pointer:t,sx:e.clientX,sy:e.clientY,v:P.current,moved:!1}},K=e=>{let t=e.pointerId??1;if(!M.current.has(t))return;M.current.set(t,ne(e));let n=j.current;if(!n)return;if(n.kind===`pinch`){let[e,t]=[...M.current.values()];if(!e||!t)return;let r=Math.hypot(e.x-t.x,e.y-t.y),i=(e.x+t.x)/2,a=(e.y+t.y)/2,o=ft(n.v,ct(n.v.k*(r/n.d0))/n.v.k,n.mx,n.my);B({x:o.x+i-n.mx,y:o.y+a-n.my,k:o.k});return}if(n.pointer!==t)return;let r=e.clientX-n.sx,i=e.clientY-n.sy;if(!n.moved){if(Math.hypot(r,i)<_t)return;n.moved=!0;try{g.current?.setPointerCapture?.(t)}catch{}}if(n.kind===`pan`)B({x:n.v.x+r,y:n.v.y+i,k:n.v.k});else{let e=P.current.k,t={...S.current,[n.id]:{x:Math.round(n.nx+r/e),y:Math.round(n.ny+i/e)}};S.current=t,x(t)}},ie=e=>{let t=e.pointerId??1;M.current.delete(t);let n=j.current;n&&n.kind!==`pinch`&&n.pointer===t&&(n.moved&&(N.current=!0,setTimeout(()=>N.current=!1,0)),n.kind===`node`&&n.moved&&gt(u,S.current),j.current=null),n?.kind===`pinch`&&M.current.size<2&&(j.current=null)},ae=e=>{if(e.target!==e.currentTarget)return;let t=(e,t)=>B(n=>({...n,x:n.x+e,y:n.y+t})),n={ArrowLeft:()=>t(48,0),ArrowRight:()=>t(-48,0),ArrowUp:()=>t(0,48),ArrowDown:()=>t(0,-48),"+":()=>W(Q),"=":()=>W(Q),"-":()=>W(1/Q),0:z}[e.key];n&&(e.preventDefault(),n())},oe=(e,t)=>{let n=I();B(r=>({...r,x:n.w/2-e*r.k,y:n.h/2-t*r.k}))},se=()=>{S.current={},x({}),gt(u,{})},q=(0,U.useMemo)(()=>E.nodes.map(e=>e.more?(0,J.jsx)(Ct,{p:e,onMore:s},e.node.id):(0,J.jsx)(St,{p:e,isOpen:t.has(e.node.id)&&e.node.children.length>0,locked:n,selected:l===e.node.id,toggle:r,onPick:i,onOpen:a,onDot:c},e.node.id)),[E,t,n,l,r,i,a,s,c]);return(0,J.jsxs)(`div`,{className:`tcan`,children:[(0,J.jsxs)(`div`,{ref:_,className:`tcan-controls`,role:`group`,"aria-label":`Canvas`,children:[(0,J.jsx)(D,{size:`sm`,className:`tcan-btn`,icon:(0,J.jsx)(A,{size:14}),onClick:()=>W(1/Q),disabled:C.k<=et+.001,children:(0,J.jsx)(`span`,{className:`tcan-btn__word`,children:`Zoom out`})}),(0,J.jsxs)(`output`,{className:`tcan-zoom num`,"aria-label":`Zoom`,children:[Math.round(C.k*100),`%`]}),(0,J.jsx)(D,{size:`sm`,className:`tcan-btn`,icon:(0,J.jsx)(o,{size:14}),onClick:()=>W(Q),disabled:C.k>=1.999,children:(0,J.jsx)(`span`,{className:`tcan-btn__word`,children:`Zoom in`})}),(0,J.jsx)(D,{size:`sm`,className:`tcan-btn`,onClick:z,children:`Fit`}),(0,J.jsxs)(D,{size:`sm`,className:`tcan-btn`,onClick:se,disabled:Object.keys(b).length===0,children:[`Reset`,(0,J.jsx)(`span`,{className:`tcan-btn__word`,children:` layout`})]})]}),(0,J.jsx)(`div`,{ref:g,className:`tcan-viewport`,tabIndex:0,role:`region`,"aria-label":`Map canvas`,"aria-describedby":`tcan-help`,onPointerDown:G,onPointerMove:K,onPointerUp:ie,onPointerCancel:ie,onClickCapture:e=>{N.current&&(N.current=!1,e.stopPropagation(),e.preventDefault())},onKeyDown:ae,children:(0,J.jsxs)(`div`,{className:`tcan-layer`,style:{transform:`translate(${C.x}px, ${C.y}px) scale(${C.k})`},children:[(0,J.jsx)(wt,{layout:E}),(0,J.jsx)(`ul`,{className:`tmap-tree tcan-nodes`,"aria-label":`Product map`,children:q})]})}),(0,J.jsx)(`p`,{id:`tcan-help`,className:`tcan-help`,children:`Press a card to show what is under it. Drag to pan, wheel or pinch to zoom, drag a card to move it. Arrow keys pan, plus and minus zoom.`}),(0,J.jsx)(Tt,{layout:E,view:C,size:T,onCenter:oe})]})}var Dt=(e,t)=>`trace-node:${e??`all`}:${t}`,Ot={requirements:`Requirements`,tests:`Tests`,bugs:`Bugs`,screenshots:`Screenshots`,skill:`Skill`};function kt(e){return e?e.kind===`result`?`Showing ${G[e.result].toLowerCase()} tests only.`:e.kind===`open`?`Showing open bugs only.`:e.kind===`gap`?e.status===`needs_tests`?`Showing pages that need tests only.`:`Showing pages not run yet only.`:`Showing open bugs in ${e.milestone} only.`:null}function At(e,t){return e?.find(e=>t?.some(t=>t.id===e))??e?.[0]}async function jt(e){try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}function Mt({d:e,tab:t,filter:n,dotId:r,onShot:i}){let a=O();if(t===`requirements`)return e.requirements.length?(0,J.jsx)(`ul`,{className:`trace-list`,children:e.requirements.map(t=>(0,J.jsxs)(`li`,{children:[(0,J.jsx)(ce,{code:t.statusCode}),(0,J.jsx)(`span`,{className:`trace-list__main`,children:(0,J.jsxs)(`a`,{href:P({name:`trace`,dotId:r??At(t.dotIds,e.node.dots),issue:t.ref}),children:[(0,J.jsx)(`span`,{className:`num`,children:t.key}),` `,t.title||`Not read yet`]})}),(0,J.jsx)(`span`,{className:`trace-list__aside num`,children:t.tests.total?`${t.tests.passed} / ${t.tests.total}`:`-`})]},t.ref))}):(0,J.jsx)(`p`,{className:`muted`,children:`No requirement’s tests or PRs reached this part yet.`});if(t===`tests`){let t=n?.kind===`result`?e.tests.filter(e=>e.result===n.result):e.tests;return t.length?(0,J.jsx)(`ul`,{className:`trace-list`,children:t.map(e=>(0,J.jsxs)(`li`,{className:`tmap-test`,children:[(0,J.jsx)(`span`,{className:`trace-result trace-result--${e.result}`,children:G[e.result]}),(0,J.jsxs)(`span`,{className:`trace-list__main`,children:[e.title&&(0,J.jsx)(`span`,{className:`tmap-test__title`,children:e.title}),(0,J.jsx)(`span`,{className:`num tmap-test__file`,children:e.path}),e.error&&(0,J.jsx)(`span`,{className:`tmap-err`,children:e.error})]}),e.runId&&(0,J.jsx)(`a`,{href:`#/runs/${encodeURIComponent(e.runId)}`,className:`trace-list__aside`,children:`Run`})]},`${e.path}:${e.title??``}`))}):(0,J.jsx)(`p`,{className:`muted`,children:e.tests.length?`No test matches this column.`:`No test has visited this part yet.`})}if(t===`bugs`){let t=e.defects.filter(e=>!n||n.kind===`result`||n.kind===`gap`||e.state===`open`&&(n.kind===`open`||e.milestone===n.milestone));return t.length?(0,J.jsx)(`ul`,{className:`trace-list`,children:t.map(e=>(0,J.jsxs)(`li`,{className:`tmap-test`,children:[(0,J.jsx)(`span`,{className:`trace-result trace-result--${e.state===`open`?`failed`:`passed`}`,children:e.state===`open`?`Open`:e.state===`closed`?`Closed`:`Unknown`}),(0,J.jsxs)(`span`,{className:`trace-list__main`,children:[e.url?(0,J.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,className:`num`,children:e.key}):(0,J.jsx)(`span`,{className:`num`,children:e.key}),e.title?` ${e.title}`:``,e.repro.length>0&&(0,J.jsx)(`ol`,{className:`tmap-repro`,children:e.repro.map((e,t)=>(0,J.jsx)(`li`,{children:e},t))})]}),e.milestone&&(0,J.jsx)(`span`,{className:`trace-list__aside`,children:e.milestone})]},e.ref))}):(0,J.jsx)(`p`,{className:`muted`,children:e.defects.length?`No bug matches this column.`:`No bug is linked to this part.`})}if(t===`screenshots`)return e.screenshots.length?(0,J.jsx)(`ul`,{className:`tmap-shots`,children:e.screenshots.map(e=>(0,J.jsxs)(`li`,{children:[(0,J.jsx)(`button`,{type:`button`,className:`tmap-shot`,onClick:()=>i(e),"aria-label":`Open ${e.name} full size`,children:(0,J.jsx)(je,{url:e.url,className:`tmap-shot__img`})}),(0,J.jsxs)(`span`,{className:`tmap-shot__cap`,children:[e.test&&(0,J.jsx)(`span`,{className:`tmap-shot__test`,children:e.test}),e.result&&(0,J.jsx)(`span`,{className:`trace-result trace-result--${e.result} tmap-shot__result`,children:G[e.result]}),(0,J.jsx)(`span`,{className:`num`,children:e.route??e.name})]})]},e.url))}):(0,J.jsx)(`p`,{className:`muted`,children:`No screenshot yet. A test run that visits this part adds one.`});let o=async()=>{let t=await jt(e.skill);a.show(t?{title:`Skill copied`}:{title:`Could not copy the skill`,tone:`error`})},s=()=>V(c(r),`trace-map-skill.md`).catch(e=>a.show({title:`Could not download the map skill`,body:e instanceof Error?e.message:void 0,tone:`error`}));return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{className:`tmap-skill-actions`,children:[(0,J.jsx)(D,{size:`sm`,onClick:()=>void o(),children:`Copy`}),(0,J.jsx)(D,{size:`sm`,variant:`ghost`,onClick:()=>void s(),children:`Download the whole map as one skill`})]}),(0,J.jsx)(`pre`,{className:`tmap-skill`,children:e.skill})]})}function Nt(e){return`Write a Playwright test that opens ${e.route?`the page ${e.route}`:e.name} and checks what is on it. Read the map skill of node ${e.id} first: how to reach the page, its requirements, and its open bugs.`}function Pt({gaps:e,dotId:t,actDot:n}){let r=O(),[i,a]=(0,U.useState)(null);if(!e.length)return null;let o=e=>{try{sessionStorage.setItem(te,JSON.stringify({...n?{dotId:n}:{},text:Nt(e)}))}catch{}N({name:`chat`,...n?{dotId:n}:{}})},s=async e=>{a(e.id);try{let n=await h.runTraceNode(t,e.id);r.show(n.queued?{title:`Tests queued`,body:`${n.specs.length} ${n.specs.length===1?`spec file`:`spec files`}: ${n.specs.join(`, `)}`}:{title:`Tests already queued`,body:n.reason})}catch(e){r.show({title:`Could not run the tests`,body:e instanceof Error?e.message:void 0,tone:`error`})}finally{a(null)}};return(0,J.jsx)(`section`,{className:`tmap-gaps`,"aria-label":`Coverage gaps`,children:(0,J.jsx)(`ul`,{className:`trace-list`,children:e.map(e=>(0,J.jsxs)(`li`,{className:`tmap-test`,children:[(0,J.jsx)(Z,{status:e.status}),(0,J.jsxs)(`span`,{className:`trace-list__main`,children:[(0,J.jsx)(`span`,{className:`num`,children:e.route??e.name}),(0,J.jsx)(`span`,{className:`muted tmap-test__file`,children:e.status===`needs_tests`?`No test covers it.`:e.changed?`Its source changed after the latest run.`:`Covered by ${e.specs.join(`, `)}, not run yet.`})]}),e.status===`needs_tests`?(0,J.jsx)(D,{size:`sm`,className:`tmap-gaps__act`,onClick:()=>o(e),children:`Write tests`}):(0,J.jsx)(D,{size:`sm`,className:`tmap-gaps__act`,onClick:()=>void s(e),disabled:i===e.id||!e.specs.length,children:`Run tests`})]},e.id))})})}function Ft({dotId:e,node:t,tab:n,col:r,onClose:a,onTab:o,onDot:c}){let l=L(t?Dt(e,t):null,n=>h.traceMapNode(e,t,n),{refreshOn:[`run`],throttleMs:1500}),[u,d]=(0,U.useState)(null),p=t?l.data:void 0,m=ve(n),g=De(r),_=g&&((g.kind===`result`||g.kind===`gap`)&&m===`tests`||(g.kind===`open`||g.kind===`milestone`)&&m===`bugs`),y=g?.kind===`gap`?g.status:null,b=p?(p.gaps??[]).filter(e=>!y||e.status===y):[],x=p?{requirements:p.requirements.length,tests:p.tests.length,bugs:p.defects.length,screenshots:p.screenshots.length,skill:void 0}:null;return(0,J.jsxs)(v,{open:!!t,onClose:a,side:`right`,title:p?.node.name??`Map node`,description:`Map node details`,hideDescription:!0,className:`trace-drawer`,children:[l.error&&!p?(0,J.jsx)(i,{compact:!0,title:`Could not load this part of the map`,error:l.error,onRetry:()=>void l.reload()}):null,!p&&!l.error?(0,J.jsx)(f,{label:`Loading map node`}):null,p&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{className:`trace-sum`,children:[(0,J.jsx)(Z,{status:p.node.status}),p.node.dots&&(0,J.jsx)(xt,{dots:p.node.dots,onDot:c}),(0,J.jsxs)(`dl`,{className:`trace-meta`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Kind`}),(0,J.jsx)(`dd`,{children:ge[p.node.kind]})]}),p.node.route&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Route`}),(0,J.jsx)(`dd`,{className:`num`,children:p.node.route})]}),p.node.pageTitle&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Page title`}),(0,J.jsx)(`dd`,{children:p.node.pageTitle})]}),p.node.urls[0]&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Seen at`}),(0,J.jsx)(`dd`,{className:`num tmap-url`,children:p.node.urls[0]})]}),p.node.headings.length>0&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Headings`}),(0,J.jsx)(`dd`,{children:p.node.headings.slice(0,4).join(`; `)})]}),p.node.landmarks.length>0&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Landmarks`}),(0,J.jsx)(`dd`,{children:p.node.landmarks.join(`, `)})]}),p.code.files.length>0&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`Source`}),(0,J.jsx)(`dd`,{className:`num`,children:p.code.files.map(e=>`${e.file}${e.line?`:${e.line}`:``}`).join(`, `)})]}),p.code.api.length>0&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`API`}),(0,J.jsx)(`dd`,{className:`num`,children:p.code.api.map(e=>`${e.method?`${e.method} `:``}${e.route}`).join(`, `)})]}),p.node.path.length>0&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`dt`,{children:`In`}),(0,J.jsx)(`dd`,{children:p.node.path.map(e=>e.name).join(` > `)})]})]})]}),(0,J.jsx)(Pt,{gaps:b,dotId:e,actDot:e??p.node.dots?.[0]?.id}),(0,J.jsxs)(E,{label:`Node details`,value:m,onChange:o,items:_e.map(e=>({value:e,label:Ot[e],...x?.[e]===void 0?{}:{count:x[e]}})),children:[_&&(0,J.jsx)(`p`,{className:`tmap-filter muted`,children:kt(g)}),(0,J.jsx)(Mt,{d:p,tab:m,filter:_?g:null,dotId:e,onShot:d})]})]}),(0,J.jsx)(s,{open:!!u,onClose:()=>d(null),title:u?.route??u?.spec??u?.name??`Screenshot`,description:`Screenshot at full size`,hideDescription:!0,size:`lg`,children:u&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(Me,{url:u.url,className:`tmap-full`}),(0,J.jsx)(`p`,{className:`trace-sec__foot`,children:(0,J.jsx)(`a`,{href:`#/runs/${encodeURIComponent(u.runId)}`,children:`Open the run`})})]})})]})}function It({n:e,open:t,shown:n,toggle:r,onPick:i,onMore:a,onDot:o,selected:s,locked:c}){let l=t.has(e.id)&&e.children.length>0,u=n.get(e.id)??0;return(0,J.jsxs)(`li`,{className:`tmap-item tmap-item--${e.kind}`,children:[(0,J.jsxs)(`div`,{className:`tmap-node${s===e.id?` is-selected`:``}${X(e.status)?` tmap-node--gap`:``}`,children:[e.children.length>0?(0,J.jsx)(`button`,{type:`button`,className:`tmap-toggle${l?` is-open`:``}`,"aria-expanded":l,"aria-label":`${l?`Collapse`:`Expand`} ${e.name}`,disabled:c,onClick:()=>r(e.id),children:(0,J.jsx)(y,{size:12})}):(0,J.jsx)(`span`,{className:`tmap-toggle tmap-toggle--leaf`,"aria-hidden":`true`}),(0,J.jsxs)(`button`,{type:`button`,className:`tmap-open`,onClick:()=>i(e.id),"data-node":e.id,children:[(0,J.jsx)(`span`,{className:`tmap-kind`,children:ge[e.kind]}),(0,J.jsx)(`span`,{className:`tmap-name`,children:e.name}),(0,J.jsx)(Z,{status:e.status}),(0,J.jsx)(Ne,{n:e}),e.screenshot&&!X(e.status)&&(0,J.jsx)(je,{url:e.screenshot,className:`tmap-thumb`})]}),(0,J.jsx)(xt,{dots:e.dots,onDot:o})]}),l&&(0,J.jsxs)(`ul`,{className:`tmap-kids`,children:[e.children.slice(0,u).map(e=>(0,J.jsx)(It,{n:e,open:t,shown:n,locked:c,toggle:r,onPick:i,onMore:a,onDot:o,selected:s},e.id)),u<e.children.length&&(0,J.jsx)(`li`,{className:`tmap-item`,children:(0,J.jsxs)(`button`,{type:`button`,className:`tmap-more`,onClick:()=>a(e.id),children:[(0,J.jsxs)(`span`,{className:`num`,children:[`+`,e.children.length-u]}),` more`]})})]})]})}function Lt({data:e,onOpen:t,onDot:n,selected:r,scope:i,dotFilter:a}){let o=Fe(),[s,c]=(0,U.useState)(new Set),[u,f]=(0,U.useState)(``),[p,h]=(0,U.useState)(2),[g,_]=(0,U.useState)(null),v=(0,U.useMemo)(()=>g??Se(e.tree,p),[g,e.tree,p]),y=(0,U.useCallback)(t=>_(n=>typeof t==`function`?t(n??Se(e.tree,p)):t),[e.tree,p]),[b,x]=(0,U.useState)(null),[S,C]=(0,U.useState)(0),[w,T]=(0,U.useState)(new Map),[ee,E]=(0,U.useState)(0),[O,k]=(0,U.useState)(!1),A=s.size>0||u.trim()!==``,j=(0,U.useMemo)(()=>xe(e.tree,s,u),[e.tree,s,u]),M=(0,U.useMemo)(()=>A&&j?Se(j,1/0):v,[A,j,v]),N=300+ee,P=(0,U.useMemo)(()=>j?rt(j,M,w,N):null,[j,M,w,N]),F=(0,U.useMemo)(()=>be(e.tree),[e.tree]),I=(0,U.useMemo)(()=>Math.max(...F.map(e=>e.depth)),[F]),L=(0,U.useMemo)(()=>j&&b?Ce(j,b):[],[j,b]),R=(0,U.useCallback)(e=>y(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),[y]),z=(0,U.useCallback)(e=>{x(e),C(e=>e+1)},[]),B=e=>{h(e),_(null),z(null)},V=(0,U.useCallback)(e=>{let n=j?Ce(j,e):[],r=n[n.length-1];if(r){if(!r.children.length)return t(e);if(A)return z(e);if(v.has(e)&&b===e){y(t=>{let n=new Set(t);n.delete(e);for(let e of we(r))n.delete(e);return n});let t=n[n.length-2];return z(t&&t.id!==j?.id?t.id:null)}y(t=>new Set(t).add(e)),z(e)}},[j,A,v,y,b,t,z]),H=e=>{if(!e||!j)return A||B(2),z(null);let t=L.findIndex(t=>t.id===e);!A&&t>=0&&y(e=>{let n=new Set(e);for(let e of L.slice(t+1)){n.delete(e.id);for(let t of we(e))n.delete(t)}return n}),z(e)},te=(0,U.useCallback)(e=>{T(t=>new Map(t).set(e,(t.get(e)??24)+100)),E(e=>e+100)},[]),W=e=>c(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),ne=`${[...s].sort().join(`,`)}|${u.trim().toLowerCase()}`,re=s.size+ +!!u.trim(),G=j?(L.length?L:[j]).map(e=>({id:e.id,name:e.name})):[],K=(0,J.jsxs)(J.Fragment,{children:[G.length>0&&(0,J.jsx)(Ie,{path:G,onGo:H,label:`Map level`}),P&&P.hidden>0&&(0,J.jsxs)(`span`,{className:`tmap-shown num`,role:`status`,children:[P.count,` of `,F.length,` shown`]})]});return(0,J.jsxs)(`div`,{className:`tmap`,children:[(0,J.jsxs)(Le,{narrow:o,active:re,lead:K,children:[a,(0,J.jsx)(`div`,{className:`tmap-statuses`,role:`group`,"aria-label":`Show status`,children:he.map(t=>(0,J.jsxs)(`button`,{type:`button`,className:`tmap-chip${s.has(t)?` is-on`:``}`,"aria-pressed":s.has(t),onClick:()=>W(t),children:[(0,J.jsx)(Z,{status:t}),(0,J.jsx)(`span`,{className:`tmap-chip__count num`,children:e.stats[me[t]]})]},t))}),(0,J.jsx)(l,{label:`Search`,className:`tmap-search`,children:(0,J.jsx)(d,{type:`search`,value:u,placeholder:`Name or route`,onChange:e=>f(e.target.value)})}),(0,J.jsxs)(`div`,{className:`tmap-depth`,role:`group`,"aria-label":`Expand`,children:[(0,J.jsx)(D,{size:`sm`,onClick:()=>B(1/0),disabled:A,children:`Expand all`}),(0,J.jsx)(D,{size:`sm`,onClick:()=>B(0),disabled:A,children:`Collapse all`}),[1,2,3].map(e=>(0,J.jsxs)(D,{size:`sm`,onClick:()=>B(e),disabled:A||e>I,"aria-label":`Show ${e} ${e===1?`level`:`levels`}`,children:[`Depth `,e]},e)),(0,J.jsx)(D,{size:`sm`,icon:(0,J.jsx)(m,{size:14}),"aria-pressed":O,onClick:()=>k(e=>!e),children:`List`})]})]}),!e.observed&&(0,J.jsx)(`p`,{className:`tmap-note`,children:`No test run has recorded a page yet. Each run of the dot's tests records the pages they visit, and the map grows from those.`}),j&&P&&!O?(0,J.jsx)(Et,{tree:j,open:M,locked:A,toggle:R,onPick:V,onOpen:t,onMore:te,onDot:n,selected:r,scope:i,fitKey:ne,focus:b,focusKey:S,limits:w,cap:N},i):j&&P?(0,J.jsx)(`div`,{className:`tmap-canvas`,children:(0,J.jsx)(`ul`,{className:`tmap-tree`,"aria-label":`Product map`,children:(0,J.jsx)(It,{n:j,open:M,shown:P.shown,locked:A,toggle:R,onPick:V,onMore:te,onDot:n,selected:r})})}):(0,J.jsx)(`p`,{className:`tmap-note`,role:`status`,children:`No node matches. Change the search or the status buttons.`})]})}function Rt({rows:e,route:n,dotId:r}){let i=new Set(e.map(e=>e.repo)).size<=1,a=e=>N({...n,dotId:r,issue:e});return(0,J.jsx)(`div`,{className:`trace-wrap list-box`,children:(0,J.jsxs)(`table`,{className:`trace-table`,children:[(0,J.jsx)(`caption`,{className:`sr-only`,children:`Requirements with their PRs, tests, defects, and test status`}),(0,J.jsx)(`thead`,{children:(0,J.jsxs)(`tr`,{children:[(0,J.jsx)(`th`,{scope:`col`,children:`Issue`}),(0,J.jsx)(`th`,{scope:`col`,children:`Type`}),(0,J.jsx)(`th`,{scope:`col`,children:`PRs`}),(0,J.jsx)(`th`,{scope:`col`,className:`trace-num`,children:`Tests`}),(0,J.jsx)(`th`,{scope:`col`,children:`Defects`}),(0,J.jsx)(`th`,{scope:`col`,className:`trace-status`,children:`Status`})]})}),(0,J.jsx)(`tbody`,{children:e.map(e=>(0,J.jsxs)(`tr`,{className:n.issue===e.ref?`is-selected`:void 0,onClick:()=>a(e.ref),children:[(0,J.jsx)(`td`,{className:`trace-issue`,children:(0,J.jsx)(t,{source:ae(e.tracker),refKey:ie(e.key,i),title:e.title,href:P({...n,dotId:r,issue:e.ref}),status:e.status})}),(0,J.jsx)(`td`,{className:`trace-type`,children:e.type||`-`}),(0,J.jsx)(`td`,{className:`trace-prs num`,children:e.prs.length===0?`-`:(0,J.jsx)(`div`,{className:`trace-prs__list`,children:e.prs.map(e=>(0,J.jsx)(t,{source:`github-pr`,refKey:`#${e.number}`,title:e.title,href:e.url||void 0,status:K(e.lastVerdict),onClick:e=>e.stopPropagation()},e.ref))})}),(0,J.jsx)(`td`,{className:`trace-num num`,children:e.tests.total?(0,J.jsxs)(`span`,{className:`trace-frac`,"aria-label":oe(e),children:[(0,J.jsx)(`span`,{children:e.tests.passed}),(0,J.jsx)(`span`,{className:`trace-frac__sep`,children:` / `}),(0,J.jsx)(`span`,{children:e.tests.total})]}):(0,J.jsxs)(`span`,{className:`trace-frac`,"aria-label":`-`,children:[(0,J.jsx)(`span`,{}),(0,J.jsx)(`span`,{className:`trace-frac__sep`,children:`-`}),(0,J.jsx)(`span`,{})]})}),(0,J.jsx)(`td`,{className:`trace-defects num${e.defects.open>0?` trace-defects--open`:``}`,children:se(e)}),(0,J.jsx)(`td`,{className:`trace-status`,children:(0,J.jsx)(ce,{code:e.statusCode})})]},e.ref))})]})})}var zt=`traceDot`,Bt=(e,t)=>`trace:${e}:${t.milestone}:${t.status}:${t.repo}`,Vt=e=>`trace-map:${e??`all`}`,Ht=[{value:`table`,label:`Table`},{value:`map`,label:`Map`},{value:`heatmap`,label:`Heatmap`}];function Ut({route:e,dotId:t,view:r,dots:a}){let o=L(Vt(t),e=>h.traceMap(t,e),{refreshOn:[`run`,`approval`],throttleMs:1500}),s=(0,U.useCallback)((t,n,r)=>N({...e,node:t,tab:n,col:r}),[e]),c=(0,U.useCallback)(e=>s(e),[s]),u=(0,U.useCallback)(e=>N({name:`dot`,id:e}),[]),d=o.data,p=t??`all`,m=(0,J.jsx)(l,{label:`Dot`,className:`trace-filter tmap-dot`,children:(0,J.jsxs)(n,{value:e.dotId??``,onChange:t=>N({...e,dotId:t.target.value||void 0,node:void 0,tab:void 0,col:void 0},{replace:!0}),children:[(0,J.jsx)(`option`,{value:``,children:`All dots`}),a.map(e=>(0,J.jsx)(`option`,{value:e.id,children:e.name},e.id))]})});return(0,J.jsxs)(J.Fragment,{children:[o.error&&!d?(0,J.jsx)(i,{title:`Could not load the map`,error:o.error,onRetry:()=>void o.reload()}):null,o.error&&d?(0,J.jsx)(i,{compact:!0,title:`Could not refresh. Showing the last map.`,error:o.error,onRetry:()=>void o.reload()}):null,!d&&!o.error?(0,J.jsx)(f,{label:`Loading the map`,since:o.startedAt}):null,d&&(r===`map`?(0,J.jsx)(Lt,{data:d,onOpen:c,onDot:u,selected:e.node,scope:p,dotFilter:m},p):(0,J.jsx)(Xe,{data:d,onOpen:s,dotFilter:m},p)),(0,J.jsx)(Ft,{dotId:t,node:e.node,tab:e.tab,col:e.col,onClose:()=>N({...e,node:void 0,tab:void 0,col:void 0}),onTab:t=>N({...e,tab:t},{replace:!0}),onDot:u})]})}function Wt({route:e}){let t=R(),o=O(),s=(0,U.useMemo)(()=>(t.data??[]).filter(e=>!e.archived),[t.data]),c=I(zt,``),u=e.dotId??(s.find(e=>e.id===c)??s[0])?.id,d=e.view??`table`,m={milestone:e.milestone??``,status:e.status??``,repo:e.repo??``};(0,U.useEffect)(()=>{u&&F(zt,u)},[u]);let g=L(u?Bt(u,m):null,e=>h.traceability(u,m,e),{refreshOn:[`run`,`approval`],throttleMs:1500}),_=e=>N({name:`trace`,dotId:u,...m,...e,issue:void 0},{replace:!0}),v=!!(m.milestone||m.status||m.repo),y=u?a(u,m):`#`,b=e=>{C()&&u&&(e.preventDefault(),V(y,`traceability-${u}.csv`).catch(e=>o.show({title:`Could not export the CSV`,body:e instanceof Error?e.message:void 0,tone:`error`})))},x=async()=>{if(u)try{let{page:e}=await h.saveReadiness(u,m.milestone);N({name:`report`,id:e.id})}catch(e){o.show({title:`Could not save the report`,body:e instanceof Error?e.message:void 0,tone:`error`})}},S=g.data;return(0,J.jsxs)(`div`,{className:`page trace${d===`table`?``:` trace--views`}`,children:[(0,J.jsxs)(`header`,{className:`page__header`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`h1`,{className:`page__title`,children:`Traceability`}),(0,J.jsx)(`p`,{className:`page__subtitle`,children:`Requirements, their PRs, tests, and defects, as a table, a product map, or a heatmap.`})]}),(0,J.jsxs)(`div`,{className:`page__actions`,children:[u&&(0,J.jsx)(D,{variant:`secondary`,icon:(0,J.jsx)(p,{size:14}),onClick:()=>void x(),disabled:!S||S.rows.length===0,children:`Save as report`}),(0,J.jsx)(`a`,{className:`btn btn--secondary`,href:y,download:!0,onClick:b,"aria-disabled":!u||void 0,children:(0,J.jsx)(`span`,{className:`btn__label`,children:`Export CSV`})})]})]}),s.length===0&&!t.loading?(0,J.jsx)(r,{kind:`first-run`,title:`No tickets yet`,body:`Connect Jira or Linear to see which tickets have tests.`,action:(0,J.jsx)(`a`,{href:`#/dots?new=1`,children:`New dot`})}):(0,J.jsxs)(J.Fragment,{children:[d===`table`&&s.length>1&&(0,J.jsx)(`div`,{className:`trace-filters`,children:(0,J.jsx)(l,{label:`Dot`,className:`trace-filter`,children:(0,J.jsx)(n,{value:u??``,onChange:e=>_({dotId:e.target.value,milestone:``,status:``,repo:``}),children:s.map(e=>(0,J.jsx)(`option`,{value:e.id,children:e.name},e.id))})})}),u?null:(0,J.jsx)(f,{label:`Loading traceability`,since:t.startedAt}),u&&(0,J.jsx)(E,{label:`View`,value:d,onChange:t=>N({...e,dotId:t===`table`?u:e.dotId,view:t===`table`?void 0:t,issue:void 0,node:void 0,tab:void 0,col:void 0},{replace:!0}),items:Ht,idPrefix:`trace-view`,children:d===`table`?(0,J.jsxs)(J.Fragment,{children:[S&&(0,J.jsx)(fe,{values:m,milestones:S.milestones,repos:S.repos,onChange:_}),S&&(0,J.jsxs)(`p`,{className:`trace-summary`,role:`status`,children:[S.readiness.summary,S.readiness.milestone?(0,J.jsxs)(`span`,{className:`muted`,children:[` in `,S.readiness.milestone]}):null]}),g.error&&!S?(0,J.jsx)(i,{title:`Could not load traceability`,error:g.error,onRetry:()=>void g.reload()}):null,g.error&&S?(0,J.jsx)(i,{compact:!0,title:`Could not refresh. Showing the last table.`,error:g.error,onRetry:()=>void g.reload()}):null,!S&&!g.error?(0,J.jsx)(f,{label:`Loading traceability`,since:g.startedAt}):null,S&&u&&(S.rows.length===0?v?(0,J.jsx)(r,{kind:`filtered`,title:`No requirements match`,body:`Change a filter to see more.`,action:(0,J.jsx)(D,{onClick:()=>_({milestone:``,status:``,repo:``}),children:`Clear filters`})}):(0,J.jsx)(r,{kind:`first-run`,title:`No tickets yet`,body:`Features and stories show up here once the dot has read them from your tracker.`}):(0,J.jsx)(Rt,{rows:S.rows,route:e,dotId:u})),u&&(0,J.jsx)(de,{dotId:u,issue:e.issue,onClose:()=>N({...e,issue:void 0})})]}):(0,J.jsx)(Ut,{route:e,dotId:e.dotId??null,view:d,dots:s})})]})]})}function Gt({route:e}){return(0,J.jsx)(Wt,{route:e})}export{Gt as default};
2
+ //# sourceMappingURL=Trace-aF92UWaH.js.map
@@ -0,0 +1,2 @@
1
+ import{H as e,M as t,N as n,P as r,R as i,Tn as a,Vn as o,Wn as s,mn as c,q as l,sn as u}from"./ui-DcmhYyYp.js";import{i as d,r as f}from"./store-IqrqHuFR.js";var p=s(o(),1),m=c(),h=`update-people`,g=[{value:`everything`,label:`Everything`},{value:`needs_me`,label:`Only what needs me`},{value:`off`,label:`Off`}],_={everything:`Urgent items right away, replies where you asked, and a digest every few hours.`,needs_me:`Decisions, critical bugs, prod down or back up, and blocked work. No digests.`,off:`Nothing on the phone or in Slack. The dot chat still keeps every update.`},v={everything:`Every alert the dots send to this device.`,needs_me:`Alerts for what needs you, outages and urgent items only.`,off:`No alerts on this device. The Inbox still lists everything to review.`},y=`Alerts that arrive in these hours are skipped, not sent later. The Inbox keeps everything to review.`,b=e=>e.startsWith(`device:`);function x({value:e,onChange:t,label:n}){let r=(0,p.useRef)([]),i=Math.max(0,g.findIndex(t=>t.value===e));return(0,m.jsx)(`div`,{className:`segmented updates__levels`,role:`radiogroup`,"aria-label":n,onKeyDown:e=>{let n;if(e.key===`ArrowRight`||e.key===`ArrowDown`)n=(i+1)%g.length;else if(e.key===`ArrowLeft`||e.key===`ArrowUp`)n=(i-1+g.length)%g.length;else return;e.preventDefault(),t(g[n].value),r.current[n]?.focus()},children:g.map((n,i)=>(0,m.jsx)(`button`,{ref:e=>{r.current[i]=e},type:`button`,role:`radio`,"aria-checked":e===n.value,tabIndex:e===n.value?0:-1,className:`segmented__item${e===n.value?` is-selected`:``}`,onClick:()=>t(n.value),children:(0,m.jsx)(`span`,{children:n.label})},n.value))})}function S({person:e,onSave:i}){let a=e.prefs,o=b(e.id);return(0,m.jsxs)(`div`,{className:`updates__person`,children:[(0,m.jsxs)(`div`,{className:`updates__head`,children:[(0,m.jsx)(`span`,{className:`updates__name`,children:e.label}),e.inherited&&(0,m.jsx)(`span`,{className:`updates__note`,children:`Follows your settings until changed`})]}),(0,m.jsx)(x,{value:a.level,label:`Updates for ${e.label}`,onChange:e=>i({level:e})}),(0,m.jsx)(`p`,{className:`updates__help`,children:(o?v:_)[a.level]}),(0,m.jsx)(t,{checked:a.quiet.on,onChange:e=>i({quiet:{...a.quiet,on:e}}),label:`Quiet hours`,description:o?y:`Holds the phone and Slack direct messages. The morning note lists what waited.`}),a.quiet.on&&(0,m.jsxs)(`div`,{className:`updates__quiet`,children:[(0,m.jsx)(n,{label:`From`,children:(0,m.jsx)(r,{type:`time`,value:a.quiet.start,onChange:e=>e.target.value&&i({quiet:{...a.quiet,start:e.target.value}})})}),(0,m.jsx)(n,{label:`To`,children:(0,m.jsx)(r,{type:`time`,value:a.quiet.end,onChange:e=>e.target.value&&i({quiet:{...a.quiet,end:e.target.value}})})})]})]})}function C(){let t=l(),n=d(h,e=>a.updatePeople(e)),r=(0,p.useRef)(new Map),o=(0,p.useRef)(new Map),s=(0,p.useRef)(0),c=(0,p.useRef)(new Map),g=async(e,n)=>{let i=++s.current,l=r.current.get(e.id);r.current.set(e.id,i);let u=c.current.get(e.id)??new Set;u.add(i),c.current.set(e.id,u),f(h,t=>(t??[]).map(t=>t.id===e.id?(l===void 0&&o.current.set(e.id,t),{...t,prefs:{...t.prefs,...n,quiet:{...t.prefs.quiet,...n.quiet??{}}},inherited:!1}):t));try{let t=await a.saveUpdatePrefs(e.id,n);u.delete(i);let s={...o.current.get(e.id)??e,prefs:t.prefs,inherited:!1};if(o.current.set(e.id,s),r.current.get(e.id)!==i)return;r.current.delete(e.id),f(h,n=>(n??[]).map(n=>n.id===e.id?{...n,prefs:t.prefs}:n))}catch(a){if(u.delete(i),r.current.get(e.id)===i&&u.size)r.current.set(e.id,Math.max(...u));else if(r.current.get(e.id)===i){r.current.delete(e.id);let t=o.current.get(e.id);t&&f(h,n=>(n??[]).map(n=>n.id===e.id?t:n))}t.show({tone:`error`,title:`Could not save updates for ${e.label}`,body:a instanceof Error?a.message:void 0,action:{label:`Try again`,onClick:()=>void g(e,n)}})}};return(0,m.jsx)(u,{title:`Updates`,description:`How much the dots tell each person, and when they stay quiet.`,children:n.data?(0,m.jsx)(`div`,{className:`updates`,children:n.data.map(e=>(0,m.jsx)(S,{person:e,onSave:t=>void g(e,t)},e.id))}):n.loading?(0,m.jsx)(i,{rows:2,label:`Loading update settings`}):(0,m.jsx)(e,{compact:!0,title:`Could not load update settings`,error:n.error,onRetry:()=>void n.reload()})})}export{C as i,y as n,x as r,v as t};
2
+ //# sourceMappingURL=UpdatesSection-CCWEbkue.js.map
@@ -0,0 +1,2 @@
1
+ import{Bt as e,Cn as t,H as n,I as r,L as i,M as a,N as o,P as s,R as c,S as l,Tn as u,Vn as d,Wn as f,Z as p,_n as m,b as h,gn as g,mn as _,pn as v,q as y,rt as b,x}from"./ui-DcmhYyYp.js";import{r as S,t as C}from"./router-W6nZsQ33.js";import{i as w,n as T,r as E,t as D}from"./store-IqrqHuFR.js";import{a as O,c as k,l as A,t as j}from"./data-CmXvx3Mj.js";import{l as M,y as N}from"./format-BBZ8vFyT.js";import{$ as P,A as F,B as ee,D as te,F as ne,G as I,H as re,I as ie,J as ae,K as L,L as oe,M as se,N as R,O as z,P as ce,Q as le,R as ue,S as B,T as de,U as fe,V as pe,W as me,X as he,Y as V,Z as ge,_ as _e,_t as H,at as ve,et as ye,g as be,h as xe,it as Se,j as Ce,k as we,nt as Te,ot as Ee,q as De,rt as Oe,st as ke,tt as Ae,v as je,x as Me,z as Ne}from"./index-B6qKm1NW.js";import{t as Pe}from"./ListeningLine-BRFNaczY.js";import{A as Fe,a as Ie,d as Le,f as U,h as Re,l as ze,n as Be,p as W,s as Ve,t as He,v as Ue}from"./ModelChoices-BxO1zyyr.js";import{N as We,c as Ge,m as Ke,p as qe,t as Je}from"./RunnerTry-Dgpp67-s.js";import{t as Ye}from"./shadowWeekModel-BUUiww09.js";/* empty css */import{i as Xe,n as Ze,t as Qe}from"./newDotModel-BaLLyw57.js";/* empty css */import{t as $e}from"./ConnectSheet-Cm5vbZdR.js";var G=f(d(),1),K=_();function q({title:e,body:t,optional:n}){return(0,K.jsxs)(`header`,{className:`ob-head`,children:[(0,K.jsxs)(`h2`,{className:`ob-head__title`,tabIndex:-1,"data-step-title":!0,children:[e,n&&(0,K.jsx)(`span`,{className:`ob-head__optional`,children:`Optional`})]}),(0,K.jsx)(`p`,{className:`ob-head__body`,children:t})]})}function et({service:e,children:t}){return e?(0,K.jsxs)(`div`,{className:`ob-service`,"data-service":e.key,children:[(0,K.jsx)(Ve,{provider:e.key,method:e.method}),(0,K.jsxs)(`div`,{className:`ob-service__text`,children:[(0,K.jsxs)(`span`,{className:`ob-service__name`,children:[e.label,(0,K.jsx)(ze,{state:Ue(e)})]}),(0,K.jsx)(`span`,{className:`ob-service__detail`,children:e.account?`${e.account}. ${e.detail}`:e.detail})]}),t&&(0,K.jsx)(`div`,{className:`ob-service__action`,children:t})]}):null}function J({state:e,title:t,detail:n,children:r}){let i=e===`ok`?`passed`:e===`bad`?`failed`:e===`info`?`info`:`flaky`,a=e===`ok`?`OK`:e===`bad`?`Needs a fix`:e===`info`?`Note`:`Check this`;return(0,K.jsxs)(`li`,{className:`ob-check-line is-${e}`,children:[(0,K.jsx)(h,{kind:i,label:a}),(0,K.jsxs)(`span`,{className:`ob-check-line__text`,children:[(0,K.jsx)(`span`,{className:`ob-check-line__title`,children:t}),n&&(0,K.jsx)(`span`,{className:`ob-check-line__detail`,children:n}),r]})]})}function Y({onBack:e,onSkip:t,skipLabel:n=`Skip for now`,primary:r}){return(0,K.jsxs)(`div`,{className:`ob-foot`,children:[e&&(0,K.jsx)(v,{variant:`ghost`,icon:(0,K.jsx)(p,{size:14}),onClick:e,children:`Back`}),(0,K.jsx)(`span`,{className:`ob-foot__spacer`}),t&&(0,K.jsx)(v,{variant:`ghost`,onClick:t,children:n}),r&&(r.disabled&&r.why?(0,K.jsx)(v,{variant:`primary`,"aria-disabled":`true`,"aria-describedby":r.why,onClick:e=>e.preventDefault(),children:r.label}):(0,K.jsx)(v,{variant:`primary`,onClick:r.onClick,disabled:r.disabled,loading:r.loading,children:r.label}))]})}function tt({text:e}){return(0,K.jsx)(K.Fragment,{children:e.split(`/`).map((e,t)=>(0,K.jsxs)(`span`,{children:[t>0&&(0,K.jsxs)(K.Fragment,{children:[`/`,(0,K.jsx)(`wbr`,{})]}),e]},t))})}function nt({view:e,onDone:t,onBack:n,onRefresh:r}){let i=e.server,a=F(i),o=ke(i),[s,c]=(0,G.useState)(!1),l=async()=>{if(r&&!s){c(!0);try{await r()}finally{c(!1)}}},u=i.githubMode!==`pat`,d=i.githubMode!==`app`;return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`Event delivery`,body:a===`confirmed`?`GitHub sends each event to this server as it happens. New dots do not poll.`:a===`waiting`?`This server can receive webhooks, but GitHub has not sent one yet. The dot polls until it does, so no event is missed.`:`GitHub cannot send events to this server yet, so the dot asks GitHub for news on a timer. It starts this way by default.`}),(0,K.jsxs)(`ul`,{className:`ob-check-lines`,"aria-label":`Event delivery checks`,children:[(0,K.jsx)(J,{state:i.publicUrl&&i.publicUrl.startsWith(`https://`)?`ok`:`warn`,title:i.publicUrl?`Public URL: ${i.publicUrl}`:`Public URL: not set`,detail:i.publicUrl?i.publicUrl.startsWith(`https://`)?void 0:`GitHub webhooks need https.`:`Set LOCALDOST_PUBLIC_URL to the address GitHub can reach.`}),(0,K.jsx)(J,{state:i.webhookSecret?`ok`:`warn`,title:i.webhookSecret?`Webhook secret: set`:`Webhook secret: not set`,detail:i.webhookSecret?void 0:`A GitHub App sets it for you, or set GITHUB_WEBHOOK_SECRET.`}),i.webhookRoute&&(0,K.jsx)(J,{state:i.webhookSeen?`ok`:`warn`,title:i.webhookSeen?`GitHub delivery: ${i.webhookSeen.event||`event`}, ${N(i.webhookSeen.at)}`:`GitHub delivery: none yet`,detail:i.webhookSeen?void 0:`No signed event has reached this server from GitHub.`})]}),(0,K.jsxs)(`div`,{className:`ob-panel`,"data-delivery":i.delivery,children:[(0,K.jsx)(`p`,{className:`ob-panel__title`,children:ue(i)}),a!==`confirmed`&&(0,K.jsx)(`p`,{children:a===`waiting`?`Polling does not see CI failures, preview deployments, or /localdost review comments. A working webhook adds them.`:`Polling does not see CI failures, preview deployments, or /localdost review comments. A public URL and a webhook secret add them.`})]}),a===`waiting`&&o&&(0,K.jsxs)(`section`,{className:`ob-panel`,"aria-labelledby":`ob-hook-title`,"data-webhook-setup":!0,children:[(0,K.jsx)(`h3`,{id:`ob-hook-title`,className:`ob-panel__title`,children:`Make GitHub send events here`}),u&&(0,K.jsxs)(`p`,{"data-hook-app":!0,children:[(0,K.jsx)(`strong`,{children:`GitHub App.`}),` It has a webhook only when it was created after the public URL was set. An App made earlier has none: set its webhook URL to`,` `,(0,K.jsx)(`code`,{className:`ob-code`,children:(0,K.jsx)(tt,{text:o})}),` `,`and its secret in the App settings, or create the App again.`]}),d&&(0,K.jsxs)(`div`,{className:`ob-hook`,"data-hook-token":!0,children:[(0,K.jsxs)(`p`,{children:[(0,K.jsx)(`strong`,{children:`Token.`}),` A token has no webhook. In each repo open Settings, Webhooks, Add webhook:`]}),(0,K.jsxs)(`ul`,{className:`ob-list`,children:[(0,K.jsxs)(`li`,{children:[`Payload URL`,` `,(0,K.jsx)(`code`,{className:`ob-code`,children:(0,K.jsx)(tt,{text:o})})]}),(0,K.jsxs)(`li`,{children:[`Content type `,(0,K.jsx)(`code`,{className:`ob-code`,children:`application/json`})]}),(0,K.jsxs)(`li`,{children:[`Secret: the value of `,(0,K.jsx)(`code`,{className:`ob-code`,children:`GITHUB_WEBHOOK_SECRET`})]}),(0,K.jsxs)(`li`,{children:[`Events: `,`Pull requests, Pushes, Workflow runs, Deployment statuses, Issue comments, Issues`]})]}),(0,K.jsx)(`p`,{children:`GitHub sends a ping at once.`})]}),(0,K.jsxs)(`div`,{className:`ob-actions`,children:[(0,K.jsx)(v,{onClick:()=>void l(),loading:s,children:`Check again`}),(0,K.jsx)(`p`,{className:`ob-note`,"aria-live":`polite`,children:s?`Reading this server again.`:`When the ping arrives this step says webhooks, and new dots do not poll.`})]})]}),(0,K.jsx)(Y,{onBack:n,primary:{label:`Continue`,onClick:()=>void t()}})]})}function rt(e){return e.ok?e.issues===`off`?`warn`:`ok`:`bad`}function it({repos:e,label:t=`Test access`,auto:n=!1}){let[r,i]=(0,G.useState)(!1),[a,o]=(0,G.useState)(null),s=(0,G.useRef)(0),c=[...new Set(e.map(e=>e.toLowerCase()))].sort().join(`|`),l=()=>{s.current+=1},u=async()=>{let t=++s.current;i(!0),o(null);let n;try{if(e.length)n={kind:`repos`,access:await H.githubCheck(e)};else{let e=await U.test(`github`);n={kind:`identity`,ok:e.ok,message:e.message}}}catch(e){n={kind:`error`,message:W(e)}}t===s.current&&(o(n),i(!1))};return(0,G.useEffect)(()=>{if(!n||!c)return;let e=setTimeout(()=>void u(),400);return()=>{clearTimeout(e),l(),i(!1)}},[n,c]),(0,K.jsxs)(`div`,{className:`ob-access`,"data-access-test":!0,children:[(0,K.jsxs)(`div`,{className:`ob-actions`,children:[(0,K.jsx)(v,{onClick:()=>void u(),loading:r,children:n&&a?`Test again`:t}),(0,K.jsx)(`p`,{className:`ob-note`,"aria-live":`polite`,children:r?`Asking GitHub about each repo.`:e.length?`Checks ${e.length===1?`the repo`:`all ${e.length} repos`} and ${e.length===1?`its`:`their`} issues.`:`Checks the connection. Each repo is tested when you pick it on the Repos step.`})]}),a?.kind===`identity`&&(0,K.jsx)(Le,{result:{ok:a.ok,message:a.message}}),a?.kind===`error`&&(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:a.message}),a?.kind===`repos`&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(`p`,{className:a.access.ok?`ob-note`:`ob-error`,role:`status`,children:a.access.message}),(0,K.jsx)(`ul`,{className:`ob-check-lines`,"aria-label":`Access by repo`,children:a.access.repos.map(e=>(0,K.jsx)(J,{state:rt(e),title:e.repo,detail:e.message},e.repo))})]})]})}function at(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ot(e,t,n){let r={...e??{mode:`local`}};return t.trim()?r.setup=t.trim():delete r.setup,n.trim()?r.command=n.trim():delete r.command,r}var X=e=>e.toLowerCase();function st(e,t){return{setup:e?.setup??t?.setup.value??``,command:e?.command??t?.command.value??``,baseUrl:e?.baseUrl??t?.baseUrl.value??``}}function ct(e){let t=e.command.trim()?We(e.command):null;return{command:t&&!t.ok?t.error:void 0,baseUrl:e.baseUrl.trim()&&!at(e.baseUrl.trim())?`Use a full URL that starts with https:// or http://.`:void 0}}function lt({progress:e,onDone:t,onSkip:r,onBack:a,onSave:o}){let s=I(e,`app`),c=s.filter(t=>V(e,t)),l=s.filter(t=>!V(e,t)),u=Te(e),d=_e(c),[f,p]=(0,G.useState)({}),[m,h]=(0,G.useState)({}),[g,_]=(0,G.useState)(!1),v=A(),y=t=>e.testsByRepo?.[X(t)]??(t===u?e.tests:void 0),b=e=>f[X(e)]??(d.of(e).data?st(y(e),d.of(e).data):void 0),x=e=>JSON.stringify([e.setup.trim(),e.command.trim(),e.baseUrl.trim()]),S=e=>{let t=b(e),n=m[X(e)];if(n&&t&&n.key===x(t))return n.tried;let r=y(e);return!n&&r?.tried&&t&&x(st(r,void 0))===x(t)?r.tried:void 0},C=(e,t)=>({setup:e.setup.trim(),command:e.command.trim(),baseUrl:e.baseUrl.trim(),...t?{tried:t}:{}}),w=(e,t)=>{let n=b(e);n&&p(r=>({...r,[X(e)]:{...n,...t}}))},T=(e,t)=>{let n=t?.draft??b(e);if(!n)return;let r=t?.tried??S(e),i=C(n,r);o(t=>({testsByRepo:{...t.testsByRepo,[X(e)]:i},...e===u?{tests:i}:{}})).catch(()=>{})},E=(e,t)=>{let n=b(e);if(!n)return;let r=t.result,i=r?{outcome:r.outcome,passed:r.passed,failed:r.failed}:{outcome:`not_run`,passed:0,failed:0};h(t=>({...t,[X(e)]:{tried:i,key:x(n)}})),T(e,{draft:n,tried:i})},D=c.every(e=>!!b(e)),O=()=>{_(!0);let n={...e.testsByRepo};for(let e of c){let t=b(e);if(!t)continue;let r=ct(t);if(r.command||r.baseUrl)return;n[X(e)]=C(t,S(e))}let r={testsByRepo:n};return u&&n[X(u)]&&(r.tests=n[X(u)]),t(r)},k=Fe(v.data);return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`Check how your tests run`,body:`These come from each repo's scan and CI workflow. Change anything that looks wrong, then try it once. Nothing is posted by a try.`}),!s.length&&(0,K.jsx)(`p`,{className:`ob-note`,role:`status`,children:`No app repo is picked, so there are no tests to check. Pick one on the Repos step, or skip this step.`}),l.length>0&&(0,K.jsxs)(`p`,{className:`ob-note`,role:`status`,"data-tests-off":!0,children:[l.join(`, `),` `,l.length===1?`is`:`are`,` not tested (Run tests is off), so there is nothing to check for`,` `,l.length===1?`it`:`them`,`.`]}),c.map(e=>{let t=d.of(e),r=b(e);return t.loading&&!r?(0,K.jsx)(i,{width:`80%`,height:16},e):r?(0,K.jsx)(ut,{repo:e,main:e===u,many:c.length>1,draft:r,suggestion:t.data,submitted:g,tried:S(e),onEdit:t=>w(e,t),onBlur:()=>T(e),onResult:t=>E(e,t),settingsKey:x(r)},e):(0,K.jsx)(n,{compact:!0,title:`Could not read ${e}`,error:t.error,onRetry:()=>d.reload()},e)}),c.length>1&&(0,K.jsxs)(`p`,{className:`ob-note`,"data-one-command":!0,children:[`The dot runs one command: the one from `,u,`. The settings of the other repos are saved here and not used yet.`]}),(0,K.jsx)(`p`,{className:`ob-note`,"data-engine-default":!0,children:k?(0,K.jsxs)(K.Fragment,{children:[`New tests use the workspace default engine: `,(0,K.jsx)(`strong`,{children:k}),`. `,(0,K.jsx)(`a`,{href:`#/setup`,children:`Change it on Setup`}),`.`]}):`Loading the test engine default.`}),(0,K.jsx)(Y,{onBack:a,onSkip:()=>void r(),primary:D?{label:`Continue`,onClick:()=>void O()}:void 0})]})}function ut({repo:e,main:t,many:n,draft:i,suggestion:a,submitted:c,tried:l,settingsKey:u,onEdit:d,onBlur:f,onResult:p}){let m=a,h=ct(i),g=m?.input.runner?.mode===`demo`;return(0,K.jsxs)(`section`,{className:`ob-tests`,"data-repo":e,"aria-label":`Tests of ${e}`,children:[n&&(0,K.jsxs)(`h3`,{className:`ob-sub`,children:[e,t&&(0,K.jsx)(`span`,{className:`ob-head__optional`,children:`Main`})]}),g&&(0,K.jsx)(`p`,{className:`ob-note`,children:`Demo mode runs the two sample shop specs against the sample shop.`}),(0,K.jsx)(o,{label:`Setup steps`,hint:m?.setup.source??`One step per line. They run through the shell before the tests.`,children:(0,K.jsx)(r,{className:`ob-mono`,rows:3,value:i.setup,onChange:e=>d({setup:e.target.value}),onBlur:f,spellCheck:!1,placeholder:`npm ci`})}),(0,K.jsx)(o,{label:`Test command`,error:c||i.command?h.command:void 0,hint:m?.command.source??`Runs without a shell.`,children:(0,K.jsx)(s,{className:`ob-mono`,value:i.command,onChange:e=>d({command:e.target.value}),onBlur:f,autoComplete:`off`,spellCheck:!1,placeholder:g?`Demo specs`:`npx playwright test`})}),(0,K.jsx)(o,{label:`QA base URL`,error:c||i.baseUrl?h.baseUrl:void 0,hint:m?.baseUrl.source??`Where the tests open the app.`,children:(0,K.jsx)(s,{type:`url`,inputMode:`url`,value:i.baseUrl,onChange:e=>d({baseUrl:e.target.value}),onBlur:f,autoComplete:`off`,placeholder:`https://qa.acme.com`})}),(0,K.jsx)(Je,{label:`Try once`,getInput:()=>h.command?{error:`Test command: ${h.command}`}:h.baseUrl?{error:`Base URL: ${h.baseUrl}`}:{runner:ot(m?.input.runner,i.setup,i.command),repo:m?.input.repo??null,...i.baseUrl.trim()?{baseUrl:i.baseUrl.trim()}:{}},onResult:p},u),l&&l.outcome!==`not_run`&&(0,K.jsxs)(`p`,{className:`ob-counts num`,"data-try-counts":!0,children:[(0,K.jsxs)(`span`,{className:`ob-counts__ok`,children:[l.passed,` passed`]}),(0,K.jsxs)(`span`,{className:l.failed?`ob-counts__bad`:``,children:[l.failed,` failed`]})]})]})}var dt=[`playwright`,`cypress`,`webdriverio`,`pytest`,`junit`,`katalon`],Z=e=>e.toLowerCase();function ft(e,t){let n=ge(e,t).prScope;if(!n)return;let r=n.authors?.length?n.authors:void 0;if(r||n.skipDrafts||n.skipBots)return{...r?{authors:r}:{},skipDrafts:!!n.skipDrafts,skipBots:!!n.skipBots}}function pt(e,t,n,r,i,a={}){let o=t.tests??(Te(t)?t.testsByRepo?.[Z(Te(t))]:void 0),s=Ze(e),c={...s,name:n,tracker:Oe(e.tracker.choices,t.tracker,s.tracker),...o?{setup:o.setup??``,command:o.command??``,baseUrl:o.baseUrl??``}:{}},l={...Qe(e,c),mascot:r,rules:{}};t.tracker?.kind===`github`&&t.githubIssues&&(l.tracker=ie(t.githubIssues));let u=[...I(t,`app`),...I(t,`tests`)],d=u.some(e=>De(t,e)===`app`&&(ft(t,e)||!V(t,e)));if(u.length>1||d){let n=Z(Ne(t)??u[0]??``);l.repos=u.map(r=>{let i=De(t,r)===`tests`?`test`:`app`,o=i===`app`?ft(t,r):void 0;return{repo:Z(r),role:i,...Z(r)===n&&e.repo.defaultBranch?{defaultBranch:e.repo.defaultBranch}:{},...i===`test`?{test:{framework:a[Z(r)]??`playwright`}}:{},...o?{prScope:o}:{},...i===`app`&&!V(t,r)?{runTests:!1}:{}}})}return i&&(l.pollGithub=re(i)),(t.rules?.shadowWeek??!0)&&(l.shadowWeekDays=7),t.rules?.dailyModelCap&&(l.dailyModelCap=t.rules.dailyModelCap),t.slack?.channel&&(l.slackChannel=t.slack.channel.id),l}function Q(e){return JSON.stringify(e??null,(e,t)=>t&&typeof t==`object`&&!Array.isArray(t)?Object.fromEntries(Object.entries(t).sort(([e],[t])=>e.localeCompare(t))):t)}function mt(e){return[...new Set((e??[]).map(e=>e.trim().replace(/^@/,``).toLowerCase()).filter(Boolean))].sort()}function ht(e){let t=mt(e.prScope?.authors),n={...t.length?{authors:t}:{},...e.prScope?.skipDrafts?{skipDrafts:!0}:{},...e.prScope?.skipBots?{skipBots:!0}:{}};return{repo:Z(e.repo??e.id??``),role:e.role,...Object.keys(n).length?{prScope:n}:{},...e.runTests===!1?{runTests:!1}:{}}}function gt(e){let{repos:t,repoSetup:n,tracker:r,githubIssues:i,tests:a,testsByRepo:o}=e;return{...t?{repos:t}:{},...n?{repoSetup:n}:{},...r===void 0?{}:{tracker:r},...i?{githubIssues:i}:{},...a?{tests:a}:{},...o?{testsByRepo:o}:{}}}var _t={status:`active`,step:`dot`,steps:{}};function vt(e){let t=e.tests??(Te(e)?e.testsByRepo?.[Z(Te(e))]:void 0);return t?{setup:t.setup??``,command:t.command??``,baseUrl:t.baseUrl??``}:void 0}function yt(e){return[...I(e,`app`),...I(e,`tests`)].map(t=>{let n=De(e,t)===`tests`?`test`:`app`;return ht({repo:t,role:n,prScope:n===`app`?ft(e,t):void 0,runTests:n===`app`?V(e,t):void 0})})}function bt(e,t){if(!e)return{repos:!1,main:!1,tracker:!1,tests:!!vt(t)};let n={..._t,...e};return{repos:Q(yt(n))!==Q(yt(t)),main:Z(Ne(n)??``)!==Z(Ne(t)??``),tracker:Q({t:n.tracker,g:n.tracker?.kind===`github`?n.githubIssues:void 0})!==Q({t:t.tracker,g:t.tracker?.kind===`github`?t.githubIssues:void 0}),tests:Q(vt(n))!==Q(vt(t))}}function xt(e,t,n,r,i={}){let a=pt(t,n,``,`pip`,r,i),o=bt(n.dot?.basis,n),s={};if(o.repos||o.main){let n=Z(`${t.repo.owner}/${t.repo.name}`),r=a.repos??[{repo:n,role:`app`,...t.repo.defaultBranch?{defaultBranch:t.repo.defaultBranch}:{}}],i=e.repos??(e.repo?[{repo:Z(`${e.repo.owner}/${e.repo.name}`),role:`app`,prScope:e.repo.prScope,runTests:e.repo.runTests}]:[]);Q(r.map(ht))!==Q(i.map(ht))&&(s.repos=r)}if(o.tracker||o.main){let t=a.tracker??null;Q(t)!==Q(e.tracker)&&(s.tracker=t)}if(o.main||o.tests&&vt(n)){let t=o.main?a.runner:ot(e.runner,a.runner?.setup??``,a.runner?.command??``);t&&Q(t)!==Q(e.runner)&&(s.runner=t),(a.baseUrl??``)!==(e.baseUrl??``)&&(s.baseUrl=a.baseUrl??``)}return s}function St(e){return[e.repos?`the repo`:``,e.tracker===void 0?``:`the tickets`,e.runner?`the test command`:``,e.baseUrl===void 0?``:`the test site`].filter(Boolean)}function Ct({view:e,progress:t,onDone:n,onSkip:r,onBack:i,suggest:a}){let c=a?.data,d=O(),f=(0,G.useMemo)(()=>(d.data??[]).filter(e=>!e.archived),[d.data]),[p,h]=(0,G.useState)(c?.name.value??`My first dot`),[_,v]=(0,G.useState)(null),y=_??ne(f.map(e=>l(e))),[b,S]=(0,G.useState)(!1),[w,D]=(0,G.useState)(null),[A,M]=(0,G.useState)(!1),N=t.dot&&f.find(e=>e.id===t.dot.id),P=se(t),F=t.slack?.channel,ee=t.rules?.shadowWeek??!0,te=k().data?.services.find(e=>e.key===`github`)?.state===`ready`,re=Xe({...wt,name:p},f.map(e=>e.name)).name,ie=async()=>{let e={};for(let n of I(t,`tests`)){let t=await H.profile(n).catch(()=>void 0);e[Z(n)]=t?.testFrameworks.map(e=>e.framework).find(e=>dt.includes(e))}return e},ae=async()=>{if(M(!0),D(null),!(re||P||!c)){S(!0);try{let r=await ie(),i=await u.createDot(pt(c,t,p,y,e.server,r));E(j.dots,e=>[...(e??[]).filter(e=>e.id!==i.id),i]),T(j.dots),await n({dot:{id:i.id,name:i.name,basis:gt(t)}})}catch(e){D(W(e))}finally{S(!1)}}},L=St(N&&c?xt(N,c,t,e.server):{}),oe=async()=>{if(!N||!c)return n();S(!0),D(null);try{let r=xt(N,c,t,e.server,await ie());if(Object.keys(r).length){let e=await u.updateDot(N.id,r);E(j.dots,t=>(t??[]).map(t=>t.id===e.id?e:t)),T(j.dots)}await n({dot:{id:N.id,name:N.name,basis:gt(t)}})}catch(e){D(W(e))}finally{S(!1)}};if(N)return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`Create your first dot`,body:`${N.name} is watching. Change its rules, site checks and schedule on the dot page any time.`}),(0,K.jsx)(`div`,{className:`ob-panel`,"data-listening":!0,"data-dot-listening":!0,children:N.listening?(0,K.jsx)(Pe,{dot:N}):ue(e.server)}),L.length>0&&(0,K.jsx)(`p`,{className:`ob-note`,role:`status`,"data-pending-changes":!0,children:`Continue saves your new choices on ${N.name}: ${L.length>1?`${L.slice(0,-1).join(`, `)} and ${L[L.length-1]}`:L[0]}.`}),w&&(0,K.jsxs)(`p`,{className:`ob-error`,role:`alert`,children:[`Could not save your choices on the dot. `,w]}),(0,K.jsx)(Y,{onBack:i,primary:{label:`Continue`,onClick:()=>void oe(),loading:b}})]});let R=[...I(t,`app`),...I(t,`tests`)],z=Ee(t),le=ce(t,e.server),B=ve([...R,...Se(t)?[Se(t)]:[]]);return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`Create your first dot`,body:P?`A dot needs an app repo to watch.`:`It watches ${R.length===1?R[0]:`${R.length} repos`} with what the earlier steps found.`}),P&&(0,K.jsxs)(`div`,{className:`ob-error`,role:`alert`,"data-blocker":!0,children:[(0,K.jsx)(`p`,{children:P}),(0,K.jsx)(`a`,{href:C({name:`welcome`,step:`repo`}),children:`Go to the Repos step`})]}),(0,K.jsx)(o,{label:`Name`,error:A||p!==(c?.name.value??`My first dot`)?re:void 0,children:(0,K.jsx)(s,{value:p,onChange:e=>h(e.target.value),autoComplete:`off`,maxLength:80})}),(0,K.jsxs)(`fieldset`,{className:`mascot-pick`,children:[(0,K.jsx)(`legend`,{className:`field__label`,children:`Mascot`}),(0,K.jsx)(`div`,{className:`mascot-pick__opts`,children:m.map(e=>(0,K.jsxs)(`label`,{className:`mascot-opt${y===e?` is-selected`:``}`,children:[(0,K.jsx)(`input`,{type:`radio`,name:`ob-mascot`,value:e,checked:y===e,onChange:()=>v(e)}),(0,K.jsx)(x,{name:e,state:`ok`,size:36,decorative:!0}),(0,K.jsx)(`span`,{className:`mascot-opt__label`,children:g[e]})]},e))})]}),!P&&(0,K.jsxs)(`section`,{className:`ob-rules`,"aria-labelledby":`ob-sum-title`,"data-summary":!0,children:[(0,K.jsx)(`h3`,{id:`ob-sum-title`,className:`ob-rules__title`,children:`What the dot will do`}),(0,K.jsxs)(`dl`,{className:`ob-rules__list`,children:[(0,K.jsx)(`dt`,{children:`Watches`}),(0,K.jsx)(`dd`,{children:R.length?`${R.map(e=>`${e} (${Me[De(t,e)].toLowerCase()}${De(t,e)===`app`&&!V(t,e)?`, no tests`:``})`).join(`, `)}.`:`No repo yet.`}),(0,K.jsx)(`dt`,{children:`Tickets`}),(0,K.jsxs)(`dd`,{"data-tickets":!0,children:[t.tracker?t.tracker.label:`No tracker.`,z.length?` ${z.join(`, `)} ${z.length===1?`is`:`are`} Issues only but not the tracker repo, so the dot does not read ${z.length===1?`it`:`them`}.`:``]}),(0,K.jsx)(`dt`,{children:`Hears about changes`}),(0,K.jsx)(`dd`,{"data-listening":!0,children:ue(e.server)}),(0,K.jsx)(`dt`,{children:`Slack`}),(0,K.jsx)(`dd`,{children:F?F.name:`Not connected.`}),(0,K.jsx)(`dt`,{children:`Rules`}),(0,K.jsxs)(`dd`,{children:[ee?`First week: PR comments and checks wait in the Inbox for 7 days. Tickets, bug reports and apps that change data always wait.`:`Tests, checks and PR comments on its own. Tickets, bug reports and apps that change data wait for you. Reverts go to a person.`,le?(0,K.jsxs)(`span`,{"data-first-look":!0,children:[` `,le]}):null]})]})]}),!P&&te&&B.length>0&&(0,K.jsxs)(`section`,{className:`ob-rules`,"aria-labelledby":`ob-access-title`,"data-dot-access":!0,children:[(0,K.jsx)(`h3`,{id:`ob-access-title`,className:`ob-rules__title`,children:`GitHub access`}),(0,K.jsx)(it,{repos:B,auto:!0})]}),w&&(0,K.jsxs)(`p`,{className:`ob-error`,role:`alert`,children:[`Could not create the dot. `,w]}),(0,K.jsx)(Y,{onBack:i,onSkip:()=>void r(),primary:{label:`Create dot`,onClick:()=>void ae(),loading:b,disabled:!!P,why:`ob-create-why`}}),P&&(0,K.jsx)(`p`,{className:`ob-note`,id:`ob-create-why`,children:`Create dot is off until a repo is an app repo.`})]})}var wt={name:``,tracker:`none`,baseUrl:``,setup:``,command:``,mission:`set`,notifyWhen:``,mustNot:``,pathFilters:``,smokeGrep:``,instructions:``,slackChannel:``,digestHour:`9`,...Ge()};function Tt(e={}){let t=k(),n=t.data,r=y(),[i,a]=(0,G.useState)(null),[o,s]=(0,G.useState)(null),[c,l]=(0,G.useState)(!0),u=(0,G.useRef)(null),d=(0,G.useRef)(e.onChanged);(0,G.useEffect)(()=>{d.current=e.onChanged});let f=(0,G.useCallback)(e=>{u.current?.abort(),u.current=e,U.detect(e.signal).then(s).catch(()=>{e.signal.aborted||s(null)}).finally(()=>{u.current===e&&l(!1)})},[]),p=(0,G.useCallback)(()=>{l(!0),f(new AbortController)},[f]);(0,G.useEffect)(()=>(f(new AbortController),()=>u.current?.abort()),[f]);let m=e=>n?.services.find(t=>t.key===e),h=(e,t,n=`success`)=>{e&&E(j.setup,t=>t&&{...t,services:t.services.map(t=>t.key===e.key?{...t,...e}:t)}),T(j.setup),t&&r.show({title:t,tone:n}),i&&d.current?.(i)},g=i?m(i)??null:null;return{setup:t,status:n,service:m,open:a,sheet:(0,K.jsx)($e,{status:g,open:!!g,onClose:()=>a(null),detected:o,detecting:c,onRedetect:()=>{p(),T(j.setup)},onChanged:h}),detected:o,detecting:c}}function Et({view:e,progress:t,onDone:n,onSkip:r,onBack:i}){let a=Tt(),o=a.service(`github`),s=o?.state===`ready`,c=!s&&e.demo&&!!e.demoRepo,l=e.server.publicUrl,u=a.detected?.ghCli?.signedIn?`Found a GitHub CLI login${a.detected.ghCli.account?` as ${a.detected.ghCli.account}`:``}. Connect uses it with one click.`:`Connect with the GitHub CLI login, a GitHub App that Setup creates for you, or a token.`,d=ve([...t.repos??[],...t.githubIssues?[t.githubIssues.repo]:[]]);return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`Connect GitHub`,body:`localdost reads pull requests and issues, runs checks, and files defects through this connection. On a team server a GitHub App is best: it posts as its own bot.`}),(0,K.jsxs)(et,{service:o,children:[!s&&!c&&(0,K.jsx)(v,{variant:`primary`,size:`sm`,onClick:()=>a.open(`github`),children:`Connect GitHub`}),s&&(0,K.jsx)(v,{variant:`ghost`,size:`sm`,onClick:()=>a.open(`github`),children:`Change`})]}),!s&&!c&&(0,K.jsx)(`p`,{className:`ob-note`,children:u}),c&&(0,K.jsx)(`p`,{className:`ob-note`,children:`Demo mode: the sample shop stands in for a GitHub repo. Connect GitHub on Setup to use your own.`}),(0,K.jsxs)(`ul`,{className:`ob-check-lines`,"aria-label":`Before you connect`,children:[(0,K.jsx)(J,{state:`info`,title:`An organization owner approves an App`,detail:`In an organization, an owner has to approve a GitHub App, or a fine-grained token, before it can read the repos.`}),(0,K.jsx)(J,{state:l&&l.startsWith(`https://`)?`ok`:`warn`,title:l?`Public URL is ${l}`:`Set the public URL before Create App`,detail:l&&l.startsWith(`https://`)?`The App gets its webhook from this address.`:`The App gets a webhook only when an https public URL is already set. Without it the dot polls.`}),(0,K.jsx)(J,{state:`info`,title:`A token needs these permissions`,detail:`${Re}.`})]}),(s||c)&&(0,K.jsx)(it,{repos:s?d:[]}),(0,K.jsx)(Y,{onBack:i,onSkip:()=>void r(),primary:s||c?{label:`Continue`,onClick:()=>void n()}:void 0}),a.sheet]})}function Dt({view:e,progress:t,onDone:n,onSkip:r,onBack:i}){let a=Tt(),o=a.service(`model`),s=w(He,e=>U.modelChoices(e)),[c,l]=(0,G.useState)(!1),[u,d]=(0,G.useState)(null),[f,p]=(0,G.useState)(!1),[m,h]=(0,G.useState)(null),g=o?.state===`ready`||e.demo&&o?.state===`demo`,_=ee(t,e.server)===`team`||e.server.token,y=e.server.remote?`on the server`:`on this machine`,b=e=>!!s.data?.choices.some(t=>t.method===e&&t.available),x=[a.detected?.claudeCli?.signedIn||b(`claude-cli`)?`Claude Code${a.detected?.claudeCli?.account?` (${a.detected.claudeCli.account})`:``}`:``,a.detected?.codexCli?.signedIn||b(`codex-cli`)?`Codex`:``].filter(Boolean),S=s.data?.choices.find(e=>e.active),C=!!s.data?.autoPicked&&!!S&&!s.data.envOverride,T=async()=>{l(!0),d(null);try{d(await U.test(`model`))}catch(e){d({ok:!1,message:W(e)})}finally{l(!1)}},E=async()=>{if(S&&!f){p(!0),h(null);try{await U.switchModel(S.method),await s.reload()}catch(e){h(W(e))}finally{p(!1)}}},D=g&&!C;return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`How should the dot think?`,body:`The model reads diffs and test results and writes the reviews. A subscription you are already signed in to works, with no key to paste.`}),_&&(0,K.jsx)(`p`,{className:`ob-note`,"data-team-key":!0,children:`On a team server, use a team API key. A personal subscription would be spent by everyone.`}),(0,K.jsx)(et,{service:o}),e.demo&&o?.state===`demo`&&(0,K.jsx)(`p`,{className:`ob-note`,children:`Demo mode answers with a sample model, so this step works without an account. Connect a real model any time on Setup.`}),(0,K.jsx)(`p`,{className:`ob-note`,"aria-live":`polite`,children:a.detecting&&!a.detected?`Looking for signed-in Claude and Codex logins ${y}.`:x.length?`Found a signed-in ${x.join(` and `)} ${y}.${S?``:` Nothing uses it until you say so.`}`:`No signed-in Claude or Codex login found ${y}. Sign in with claude auth login${e.server.remote?` there`:``}, or use an API key.`}),C&&S&&(0,K.jsxs)(`div`,{className:`ob-panel`,role:`group`,"aria-label":`Keep the login localdost picked`,"data-keep-login":!0,children:[(0,K.jsxs)(`p`,{className:`ob-panel__title`,children:[`Use `,S.label,` for every dot?`]}),(0,K.jsx)(`p`,{children:`localdost found this login at first start and is using it. Every dot on this server spends from it.`}),(0,K.jsxs)(`div`,{className:`ob-actions`,children:[(0,K.jsx)(v,{variant:`primary`,loading:f,onClick:()=>void E(),children:`Keep this login`}),(0,K.jsx)(v,{variant:`secondary`,onClick:()=>a.open(`model`),disabled:!o,children:`Use an API key instead`})]}),m&&(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:m})]}),(0,K.jsx)(Be,{availableFirst:!0,autoNote:!1}),(0,K.jsxs)(`div`,{className:`ob-actions`,children:[g&&(0,K.jsx)(v,{onClick:()=>void T(),loading:c,children:`Test`}),!C&&(0,K.jsx)(v,{variant:`ghost`,onClick:()=>a.open(`model`),disabled:!o,children:`Use an API key instead`})]}),(0,K.jsx)(Le,{result:u,pending:c,pendingText:`Asking the model for a short answer.`}),(0,K.jsx)(Y,{onBack:i,onSkip:()=>void r(),primary:D?{label:`Continue`,onClick:()=>void n()}:void 0}),a.sheet]})}var Ot=[`ready`,`stale`,`error`,`refused`],kt={queued:`Waiting to scan`,scanning:`Scanning`,ready:`Scanned`,stale:`Scanned`,error:`Scan failed`,refused:`Not added`},$=e=>e.toLowerCase(),At=[`app`,`tests`,`issues`];function jt(e,t,n){let r=e.repoSetup?.[$(t)];return{role:r?.role??`app`,authors:(r?.prScope?.authors??[]).join(`, `),skipDrafts:r?.prScope?.skipDrafts??n,skipBots:r?.prScope?.skipBots??n,runTests:r?.runTests!==!1}}function Mt(e){if(e.role!==`app`)return{role:e.role};let t=P(e.authors);return{role:e.role,prScope:{...t.length?{authors:t}:{},skipDrafts:e.skipDrafts,skipBots:e.skipBots},...e.runTests?{}:{runTests:!1}}}function Nt({view:e,progress:t,onDone:n,onSkip:r,onBack:i,pollMs:a=1e3}){let o=Tt(),s=o.service(`github`),c=s?.state===`ready`,l=!c&&e.demo&&!!e.demoRepo,u=ee(t,e.server)===`team`,[d,f]=(0,G.useState)(t.repos??[]),[p,m]=(0,G.useState)({}),[h,g]=(0,G.useState)({}),[_,y]=(0,G.useState)(!1),[b,x]=(0,G.useState)(null),S=(0,G.useRef)(!0);(0,G.useEffect)(()=>(S.current=!0,()=>{S.current=!1}),[]);let C=e=>p[$(e)]??jt(t,e,u),w=(e,t)=>m(n=>({...n,[$(e)]:{...C(e),...t}})),T=()=>({...t,repoSetup:Object.fromEntries(d.map(e=>[$(e),Mt(C(e))]))});(0,G.useEffect)(()=>{let e=new AbortController;for(let n of t.repos??[])H.profile(n,e.signal).then(e=>g(t=>({...t,[$(n)]:{state:`ready`,profile:e}}))).catch(()=>{});return()=>e.abort()},[]);let E=(e,t)=>f(n=>t?[...n.filter(t=>$(t)!==$(e)),e]:n.filter(t=>$(t)!==$(e))),D=he(T(),d),O=async()=>{if(!_&&D.length){y(!0),x(null);try{let e=await H.addRepos(D),t={};for(let n of e.results)n.ok||(t[$(n.repo)]={state:`refused`,error:n.error});let n=D.filter(e=>!t[$(e)]);for(let e of n){let n=await H.scan(e);t[$(e)]={state:n.scan.state}}g(e=>({...e,...t}));let r=Date.now()+3e5,i=t;for(;S.current&&n.some(e=>!Ot.includes(i[$(e)]?.state??`queued`))&&Date.now()<r;){if(await new Promise(e=>setTimeout(e,a)),!S.current)return;let e=await H.repos();i={...i};for(let t of n){let n=e.find(e=>e.id===$(t));n&&(i[$(t)]={state:n.scan.state,...n.scan.error?{error:n.scan.error}:{}})}g(e=>({...e,...i}))}for(let e of n){if(![`ready`,`stale`].includes(i[$(e)]?.state??``))continue;let t=await H.profile(e).catch(()=>void 0);t&&S.current&&g(n=>({...n,[$(e)]:{...n[$(e)],state:`ready`,profile:t}}))}}catch(e){S.current&&x(W(e))}finally{S.current&&y(!1)}}},k=o.detected?.ghCli?.signedIn?`Found a GitHub CLI login${o.detected.ghCli.account?` as ${o.detected.ghCli.account}`:``}. Connect uses it with one click.`:`Connect with the GitHub CLI login, a GitHub App that Setup creates for you, or a token.`,A=d.length,j=I(T(),`app`,d).length;return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`Pick the repos to watch`,body:`localdost reads each repo to find your apps, routes, and tests. Nothing is posted to GitHub in this step.`}),(0,K.jsxs)(et,{service:s,children:[!c&&!l&&(0,K.jsx)(v,{variant:`primary`,size:`sm`,onClick:()=>o.open(`github`),children:`Connect GitHub`}),c&&(0,K.jsx)(v,{variant:`ghost`,size:`sm`,onClick:()=>o.open(`github`),children:`Change`})]}),!c&&!l&&(0,K.jsx)(`p`,{className:`ob-note`,children:k}),l&&(0,K.jsx)(`p`,{className:`ob-note`,children:`Demo mode: the sample shop stands in for a GitHub repo. Connect GitHub on Setup to pick your own.`}),e.sandbox&&(0,K.jsx)(`p`,{className:`ob-panel`,role:`status`,"data-sandbox-note":!0,children:`Sandbox mode is on. Jobs do not run, so scans wait and never finish. You can still pick repos and go on.`}),c?(0,K.jsx)(It,{picked:d,onToggle:E}):l?(0,K.jsx)(`ul`,{className:`ob-repos`,"aria-label":`Repositories`,children:(0,K.jsx)(Lt,{full:e.demoRepo,meta:`Sample shop with two Playwright specs`,checked:d.some(t=>$(t)===$(e.demoRepo)),onToggle:E})}):null,A>0&&(0,K.jsxs)(`section`,{className:`ob-roles`,"aria-label":`What each repo is for`,children:[(0,K.jsx)(`h3`,{className:`ob-sub`,children:`What each repo is for`}),(0,K.jsx)(`ul`,{className:`ob-repo-cards`,children:d.map(e=>(0,K.jsx)(Pt,{full:e,draft:C(e),onChange:t=>w(e,t)},e))}),!j&&(0,K.jsx)(`p`,{className:`ob-note`,role:`status`,"data-no-app":!0,children:`No app repo yet. A dot reviews the pull requests of an app repo, so set one repo to App.`})]}),c&&A>0&&(0,K.jsxs)(`section`,{className:`ob-roles`,"aria-label":`GitHub access`,"data-repo-access":!0,children:[(0,K.jsx)(`h3`,{className:`ob-sub`,children:`GitHub access`}),(0,K.jsx)(it,{repos:d,auto:!0})]}),(c||l)&&!e.sandbox&&(0,K.jsxs)(`div`,{className:`ob-actions`,children:[(0,K.jsx)(v,{onClick:()=>void O(),loading:_,disabled:!D.length,children:D.length>1?`Scan ${D.length} repos`:`Scan repo`}),(0,K.jsx)(`p`,{className:`ob-note`,"aria-live":`polite`,children:_?`Scanning. A large repo can take a minute.`:A?D.length?`${A} picked.`:`Issues only repos have no code to scan.`:`Pick at least one repo.`})]}),b&&(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:b}),(0,K.jsx)(Ft,{picked:he(T(),d),scans:h}),(0,K.jsx)(Y,{onBack:i,onSkip:()=>void r(),primary:A?{label:`Continue`,onClick:()=>void n({repos:d,repoSetup:T().repoSetup})}:void 0}),o.sheet]})}function Pt({full:e,draft:t,onChange:n}){let r=`ob-role-${e}`;return(0,K.jsxs)(`li`,{className:`ob-repo-card`,"data-repo":e,children:[(0,K.jsx)(`p`,{className:`ob-repo-card__name`,children:e}),(0,K.jsxs)(`fieldset`,{className:`ob-roles__group`,children:[(0,K.jsxs)(`legend`,{className:`sr-only`,children:[`Role of `,e]}),At.map(e=>(0,K.jsxs)(`label`,{className:`ob-pill${t.role===e?` is-selected`:``}`,children:[(0,K.jsx)(`input`,{type:`radio`,name:r,value:e,checked:t.role===e,onChange:()=>n({role:e})}),(0,K.jsx)(`span`,{children:Me[e]})]},e))]}),(0,K.jsx)(`p`,{className:`ob-note`,children:L(t.role,t.runTests)}),t.role===`app`&&(0,K.jsxs)(`div`,{className:`ob-scope`,children:[(0,K.jsx)(o,{label:`Only pull requests by`,hint:`GitHub logins, separated by commas. Empty means everyone.`,children:(0,K.jsx)(s,{value:t.authors,onChange:e=>n({authors:e.target.value}),placeholder:`Everyone`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`,"data-field":`authors`})}),(0,K.jsxs)(`label`,{className:`ob-check-input`,children:[(0,K.jsx)(`input`,{type:`checkbox`,checked:t.skipDrafts,onChange:e=>n({skipDrafts:e.target.checked})}),(0,K.jsx)(`span`,{children:`Skip draft pull requests`})]}),(0,K.jsxs)(`label`,{className:`ob-check-input`,children:[(0,K.jsx)(`input`,{type:`checkbox`,checked:t.skipBots,onChange:e=>n({skipBots:e.target.checked})}),(0,K.jsx)(`span`,{children:`Skip bot pull requests`})]}),(0,K.jsxs)(`label`,{className:`ob-check-input`,children:[(0,K.jsx)(`input`,{type:`checkbox`,checked:t.runTests,onChange:e=>n({runTests:e.target.checked}),"data-field":`runTests`}),(0,K.jsx)(`span`,{children:`Run tests for this repo`})]}),!t.runTests&&(0,K.jsx)(`p`,{className:`ob-note`,"data-tests-off":!0,children:`Use this for a repo with no Playwright suite, such as a back end.`})]})]})}function Ft({picked:e,scans:t}){let n=e.map(e=>[e,t[$(e)]]).filter(([,e])=>!!e);return n.length?(0,K.jsx)(`ul`,{className:`ob-scans`,"aria-label":`Scan results`,children:n.map(([e,t])=>(0,K.jsxs)(`li`,{className:`ob-scan`,"data-repo":e,"data-state":t.state,children:[(0,K.jsxs)(`div`,{className:`ob-scan__head`,children:[(0,K.jsx)(`span`,{className:`ob-scan__name`,children:e}),(0,K.jsx)(`span`,{className:`ob-chip ob-chip--${t.state}`,children:kt[t.state]})]}),t.profile?(0,K.jsx)(`ul`,{className:`ob-facts`,children:me(t.profile).map(e=>(0,K.jsx)(`li`,{children:e},e))}):t.error?(0,K.jsx)(`p`,{className:`ob-scan__error`,children:t.error}):null]},e))}):null}function It({picked:r,onToggle:a,single:c=!1,label:l=`Search repositories`}){let[d,f]=(0,G.useState)(``),[p,m]=(0,G.useState)({loading:!0}),[h,g]=(0,G.useState)(0);(0,G.useEffect)(()=>{let e=new AbortController,t=setTimeout(()=>{m(e=>({...e,loading:!0})),u.dotRepos(d.trim(),e.signal).then(e=>m({loading:!1,data:e})).catch(t=>{e.signal.aborted||m({loading:!1,error:t})})},d?250:0);return()=>{clearTimeout(t),e.abort()}},[d,h]);let _=p.data?.repos??[],v=r.filter(e=>!_.some(t=>$(t.fullName)===$(e))),y=d.trim(),b=c&&/^[A-Za-z0-9_.-]{1,100}\/[A-Za-z0-9_.-]{1,100}$/.test(y)&&![..._.map(e=>e.fullName),...r].some(e=>$(e)===$(y))?y:null;return(0,K.jsxs)(`div`,{className:`ob-picker`,children:[(0,K.jsx)(o,{label:l,hideLabel:!0,children:(0,K.jsxs)(`div`,{className:`ob-search`,children:[(0,K.jsx)(e,{size:16}),(0,K.jsx)(s,{type:`search`,value:d,onChange:e=>f(e.target.value),placeholder:`Search, or type owner/name`,autoComplete:`off`,spellCheck:!1})]})}),p.error||p.data?.error?(0,K.jsx)(n,{compact:!0,title:`GitHub did not list your repositories`,error:p.error??new t(502,p.data?.error??``,`/api/dots/repos`),onRetry:()=>g(e=>e+1)}):!p.data&&p.loading?(0,K.jsx)(`div`,{className:`ob-repos`,"aria-busy":`true`,"aria-label":`Loading repositories`,children:[0,1,2].map(e=>(0,K.jsx)(i,{width:`60%`,height:14},e))}):(0,K.jsxs)(`ul`,{className:`ob-repos`,"aria-label":`Repositories`,"aria-busy":p.loading||void 0,children:[b&&(0,K.jsx)(Lt,{full:b,meta:`Typed by hand`,checked:!1,onToggle:a,single:!0}),v.map(e=>(0,K.jsx)(Lt,{full:e,checked:!0,onToggle:a,single:c},e)),_.map(e=>(0,K.jsx)(Lt,{full:e.fullName,meta:[e.language,e.private?`private`:``].filter(Boolean).join(`, `),checked:r.some(t=>$(t)===$(e.fullName)),onToggle:a,single:c},e.fullName)),!_.length&&!v.length&&!b&&(0,K.jsx)(`li`,{className:`ob-note`,children:d.trim()?`No repository matches "${d.trim()}".`:`This connection sees no repositories.`})]})]})}function Lt({full:e,meta:t,checked:n,onToggle:r,single:i=!1}){return(0,K.jsx)(`li`,{children:(0,K.jsxs)(`label`,{className:`ob-repo${n?` is-selected`:``}`,children:[(0,K.jsx)(`input`,{type:i?`radio`:`checkbox`,name:i?`ob-tracker-repo`:void 0,checked:n,onChange:t=>r(e,t.target.checked)}),(0,K.jsxs)(`span`,{className:`ob-repo__text`,children:[(0,K.jsx)(`span`,{className:`ob-repo__name`,children:e}),t&&(0,K.jsx)(`span`,{className:`ob-repo__meta`,children:t})]})]})})}function Rt(e){return e.toLocaleDateString(void 0,{weekday:`short`,day:`numeric`,month:`short`})}function zt({progress:e,onDone:t,onSkip:n,onBack:r}){let[i,c]=(0,G.useState)(e.rules?.shadowWeek??!0),[l,u]=(0,G.useState)(e.rules?.dailyModelCap?String(e.rules.dailyModelCap):``),[d,f]=(0,G.useState)(!1),p=qe(l),m=ae(i);return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`Rules`,body:`Choose what the dot may do on its own, and how many AI calls it may make each day. You can change each one on the dot page at any time.`}),(0,K.jsx)(a,{checked:i,onChange:c,label:`First week: you OK every post`,description:i?`For 7 days, until ${Rt(le())}, PR comments and checks wait in the Inbox for your OK. Then they post on their own.`:`Off: the dot comments on pull requests and posts checks from the first change.`}),(0,K.jsx)(o,{label:`Daily AI calls`,error:d?p:null,hint:`At the cap new reviews wait until midnight on the server, and answers in Ask say so. Empty: no cap. You can change it on the dot page.`,className:`ob-cap`,children:(0,K.jsx)(s,{value:l,onChange:e=>u(e.target.value),onBlur:()=>f(!0),inputMode:`numeric`,placeholder:`No cap`,autoComplete:`off`,spellCheck:!1,"data-field":`dailyModelCap`})}),(0,K.jsxs)(`table`,{className:`ob-rules-table`,"aria-label":`Outward actions and their rules`,children:[(0,K.jsx)(`thead`,{children:(0,K.jsxs)(`tr`,{children:[(0,K.jsx)(`th`,{scope:`col`,children:`Action`}),(0,K.jsx)(`th`,{scope:`col`,children:`Starts as`})]})}),(0,K.jsx)(`tbody`,{children:m.map(e=>(0,K.jsxs)(`tr`,{"data-kind":e.kind,className:e.shadow?`is-shadow`:void 0,children:[(0,K.jsx)(`th`,{scope:`row`,children:e.label}),(0,K.jsx)(`td`,{children:e.level})]},e.kind))})]}),(0,K.jsx)(Y,{onBack:r,onSkip:()=>void n(),primary:{label:`Continue`,onClick:()=>{if(p)return f(!0);let e=Ke(l);t({rules:{shadowWeek:i,...e?{dailyModelCap:e}:{}}})}}})]})}var Bt=/^[UW][A-Z0-9]{2,20}$/;function Vt({progress:e,onDone:t,onSkip:n,onBack:r}){let i=Tt(),a=i.service(`slack`),c=a?.state===`ready`,l=e.slack,u=a?.fields?.find(e=>e.key===`SLACK_ALLOWED_USERS`),d=u?.value??``,f=u?.source===`env`,[p,m]=(0,G.useState)(l?.channel??null),[h,g]=(0,G.useState)(null),[_,y]=(0,G.useState)(!1),[b,x]=(0,G.useState)(null),S=h??(l?.approvers??P(d)).join(`, `),C=async()=>{x(null);let e=P(S).map(e=>e.toUpperCase()),n=e.find(e=>!Bt.test(e));if(n)return x(`"${n}" is not a Slack member ID. They look like U0123ABCD.`);y(!0);try{c&&!f&&e.join(`,`)!==P(d).join(`,`)&&await U.save(`slack`,{method:`socket`,values:{allowedUsers:e.join(`,`)},test:!1}),await t({slack:{...p?{channel:p}:{},...e.length?{approvers:e}:{}}})}catch(e){x(W(e))}finally{y(!1)}};return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{optional:!0,title:`Connect Slack`,body:`The dot posts outages and digests in a channel, answers mentions there, and can ask for approvals there. Skip it and the Inbox does all of that.`}),(0,K.jsx)(et,{service:a,children:(0,K.jsx)(v,{size:`sm`,variant:c?`ghost`:`primary`,onClick:()=>i.open(`slack`),disabled:!a,children:c?`Change`:`Connect Slack`})}),c&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(Ie,{provider:`slack`,kind:`channels`,label:`Channel`,value:p?[p.id]:[],onChange:(e,t)=>m(e[0]&&t[0]?{id:e[0],name:t[0].label}:null),empty:`The bot sees no channels. Invite it to one, then press Check again on Setup.`}),(0,K.jsx)(o,{label:`Approvers`,hint:f?`Set by the environment (SLACK_ALLOWED_USERS). Change it there.`:`Slack member IDs, separated by commas. Only these people can approve or reject a draft from Slack. In Slack, open a profile, then Copy member ID.`,children:(0,K.jsx)(s,{value:S,onChange:e=>g(e.target.value),placeholder:`U0123ABCD, U0456EFGH`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`characters`,readOnly:f,"data-field":`approvers`})})]}),b&&(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:b}),(0,K.jsx)(Y,{onBack:r,onSkip:()=>void n(),primary:c?{label:`Continue`,onClick:()=>void C(),loading:_}:void 0}),i.sheet]})}function Ht({view:e,progress:t,onDone:r,onSkip:a,onBack:c,suggest:l}){let u=Tt({onChanged:()=>void l?.reload()}),d=t.githubIssues,[f,p]=(0,G.useState)(()=>t.tracker===null?`none`:t.tracker&&t.tracker.kind!==`github`?`other`:`github`),[m,h]=(0,G.useState)(d?.repo??we(t)??``),[g,_]=(0,G.useState)(d?.types??[...je]),[y,b]=(0,G.useState)((d?.labels??[]).join(`, `)),[x,S]=(0,G.useState)(d?.milestone??``),[C,w]=(0,G.useState)({loading:!1}),[T,E]=(0,G.useState)(null),[D,O]=(0,G.useState)(null),k=g.join(`|`),A=u.service(`github`)?.state===`ready`;(0,G.useEffect)(()=>{if(f!==`github`||!m||!A)return;let e=new AbortController,t=setTimeout(()=>{w(e=>({...e,loading:!0,error:void 0})),H.issueCount({repo:m,types:k?k.split(`|`):[],labels:P(y),...x.trim()?{milestone:x.trim()}:{}},e.signal).then(e=>w({loading:!1,data:e})).catch(t=>{e.signal.aborted||w({loading:!1,error:W(t)})})},400);return()=>{clearTimeout(t),e.abort()}},[f,m,A,k,y,x]);let j=l?.data,M=(j?.tracker.choices??[]).filter(e=>e.kind!==`github`),N=t.tracker&&t.tracker.kind!==`github`?M.findIndex(e=>e.kind===t.tracker.kind&&e.label===t.tracker.label):-1,F=D??(N>=0?String(N):M.length?`0`:`none`),ee=()=>{if(E(null),f===`none`)return r({tracker:null,githubIssues:void 0});if(f===`other`){let e=F===`none`?void 0:M[Number(F)];return r({tracker:e?{kind:e.kind,label:e.label}:null,githubIssues:void 0})}return m?g.length?r({tracker:{kind:`github`,label:`GitHub Issues in ${m}`},githubIssues:{repo:m,types:g,labels:P(y),...x.trim()?{milestone:x.trim()}:{}}}):E(`Pick at least one issue type.`):E(`Pick the repo that holds the issues.`)},ne=(e,t)=>{let n=u.service(e),r=n?.state===`ready`;return(0,K.jsx)(et,{service:n,children:(0,K.jsx)(v,{size:`sm`,variant:r?`ghost`:`secondary`,onClick:()=>u.open(e),children:r?`Change`:`Connect ${t}`})})},I=(e,t,n)=>(0,K.jsxs)(`label`,{className:`ob-choice${f===e?` is-selected`:``}`,children:[(0,K.jsx)(`input`,{type:`radio`,name:`ob-tracker-kind`,value:e,checked:f===e,onChange:()=>p(e)}),(0,K.jsxs)(`span`,{className:`ob-choice__text`,children:[(0,K.jsx)(`span`,{className:`ob-choice__label`,children:t}),(0,K.jsx)(`span`,{className:`ob-choice__hint`,children:n})]})]});return(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{optional:!0,title:`Connect a ticket tracker`,body:`With a tracker, the dot reviews new tickets: open questions, gaps in the acceptance criteria and things to test by hand. Bug reports it files go here too. Ticket comments always wait for your OK.`}),(0,K.jsxs)(`fieldset`,{className:`ob-choices`,children:[(0,K.jsx)(`legend`,{className:`field__label`,children:`Tracker`}),I(`github`,`GitHub Issues`,`Issues of any repo the connection can read. The repo does not need code.`),f===`github`&&(0,K.jsxs)(`div`,{className:`ob-subform`,"data-github-issues":!0,children:[!A&&!e.demo&&(0,K.jsx)(`p`,{className:`ob-note`,children:`Connect GitHub on the GitHub step first, so localdost can read the repo.`}),(0,K.jsx)(It,{picked:m?[m]:[],onToggle:(e,t)=>t&&h(e),single:!0,label:`Search the issues repo`}),(0,K.jsxs)(`fieldset`,{className:`ob-types`,children:[(0,K.jsx)(`legend`,{className:`field__label`,children:`Issue types`}),(0,K.jsx)(`div`,{className:`ob-types__list`,children:je.map(e=>(0,K.jsxs)(`label`,{className:`ob-check-input`,children:[(0,K.jsx)(`input`,{type:`checkbox`,checked:g.includes(e),onChange:t=>_(n=>t.target.checked?[...n,e]:n.filter(t=>t!==e))}),(0,K.jsx)(`span`,{children:e})]},e))}),(0,K.jsx)(`p`,{className:`field__hint`,children:`Feature, Task, and Story are reviewed as requirements. Bug is a defect.`})]}),(0,K.jsx)(o,{label:`Required labels`,hint:`An issue needs one of them. Leave empty for any issue.`,children:(0,K.jsx)(s,{value:y,onChange:e=>b(e.target.value),placeholder:`pod:agentic`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`none`,"data-field":`labels`})}),(0,K.jsx)(o,{label:`Milestone`,hint:`Only issues in this milestone. Leave empty for any.`,children:(0,K.jsx)(s,{value:x,onChange:e=>S(e.target.value),placeholder:`Sprint 42`,autoComplete:`off`,spellCheck:!1,"data-field":`milestone`})}),(0,K.jsx)(`div`,{className:`ob-count`,"aria-live":`polite`,"data-issue-count":!0,children:m?A?C.loading&&!C.data?(0,K.jsx)(i,{width:`40%`,height:14}):C.error?(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:C.error}):C.data?(0,K.jsx)(`p`,{className:`ob-count__line num`,children:te(C.data,x.trim())}):null:(0,K.jsx)(`p`,{className:`ob-note`,children:`Connect GitHub to count the open issues.`}):(0,K.jsx)(`p`,{className:`ob-note`,children:`Pick a repo to count its open issues.`})})]}),I(`other`,`Other trackers`,`Linear or Jira.`),f===`other`&&(0,K.jsxs)(`div`,{className:`ob-subform`,"data-other-trackers":!0,children:[(0,K.jsxs)(`div`,{className:`ob-services`,children:[ne(`linear`,`Linear`),ne(`jira`,`Jira`)]}),l?l.loading&&!j?(0,K.jsx)(`div`,{"aria-busy":`true`,"aria-label":`Reading the repo`,children:(0,K.jsx)(i,{width:`70%`,height:14})}):j?M.length?(0,K.jsxs)(`fieldset`,{className:`ob-choices ob-choices--inner`,children:[(0,K.jsx)(`legend`,{className:`field__label`,children:`Tickets for this dot`}),M.map((e,t)=>(0,K.jsxs)(`label`,{className:`ob-choice${F===String(t)?` is-selected`:``}`,children:[(0,K.jsx)(`input`,{type:`radio`,name:`ob-tracker`,value:String(t),checked:F===String(t),onChange:()=>O(String(t))}),(0,K.jsxs)(`span`,{className:`ob-choice__text`,children:[(0,K.jsx)(`span`,{className:`ob-choice__label`,children:e.label}),t===0&&(0,K.jsxs)(`span`,{className:`ob-choice__hint`,children:[`Suggested: `,j.tracker.source]})]})]},e.label))]}):(0,K.jsx)(`p`,{className:`ob-note`,children:`Connect Linear or Jira above to get a team or project to pick.`}):(0,K.jsx)(n,{compact:!0,title:`Could not read the repo for tracker choices`,error:l.error,onRetry:()=>void l.reload()}):(0,K.jsx)(`p`,{className:`ob-note`,children:`Pick a repo on the Repos step to get a suggested team or project.`})]}),I(`none`,`No tracker`,`The dot reviews pull requests and merges only.`)]}),T&&(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:T}),(0,K.jsx)(Y,{onBack:c,onSkip:()=>void a(),primary:{label:`Continue`,onClick:()=>void ee()}}),u.sheet]})}async function Ut(e,t,n,r=30,i=()=>!0){for(let a=0;a<r&&i();a++){let r=(await u.feed({dotId:e,limit:10}).catch(()=>[])).find(e=>e.jobId===t);if(r)return r.id;await new Promise(e=>setTimeout(e,n))}}function Wt({view:e,progress:t,onBack:r,onFinish:a,pollMs:o=500}){let s=t.dot,[c,l]=(0,G.useState)({loading:!!s&&!e.sandbox}),[d,f]=(0,G.useState)(0),[m,h]=(0,G.useState)(null),[g,_]=(0,G.useState)(null),y=(0,G.useRef)(!0);(0,G.useEffect)(()=>(y.current=!0,()=>{y.current=!1}),[]),(0,G.useEffect)(()=>{if(!s||e.sandbox)return;let t=new AbortController;return u.pulls(s.id,t.signal).then(e=>l({loading:!1,pulls:e})).catch(e=>{t.signal.aborted||l({loading:!1,error:e})}),()=>t.abort()},[s,d,e.sandbox]);let b=c.pulls?pe(c.pulls):null,x=O(),S=s?x.data?.find(e=>e.id===s.id):void 0,C=Ye(S),w=S?!!C:t.rules?.shadowWeek??!0,T=async e=>{if(s&&b&&!m){h(e?`post`:`quiet`),_(null);try{let t=await u.requestReview(s.id,e?{pr:b.pr}:{pr:b.pr,post:!1}),n=t.runId??await Ut(s.id,t.jobId,o,30,()=>y.current);if(!y.current)return;await a({...n?{id:n}:{},jobId:t.jobId,title:t.title},`done`)}catch(e){if(!y.current)return;_(W(e)),h(null)}}},E=()=>void a(void 0,`skipped`);return s?e.sandbox?(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`See your first review`,body:`${s.name} is ready, but this server is in sandbox mode.`}),(0,K.jsx)(`p`,{className:`ob-panel`,role:`status`,"data-sandbox-note":!0,children:`Sandbox mode is on. Jobs do not run here, so a review cannot start. Turn sandbox mode off and restart to see one.`}),(0,K.jsx)(Y,{onBack:r,primary:{label:`Finish`,onClick:E}})]}):(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`See your first review`,body:`${s.name} reviews a pull request now: it scopes the change, runs the tests that match, and writes what to test. You watch it live.`}),c.loading?(0,K.jsx)(`div`,{"aria-busy":`true`,"aria-label":`Looking for pull requests`,children:(0,K.jsx)(i,{width:`80%`,height:16})}):c.error?(0,K.jsx)(n,{compact:!0,title:`Could not list the pull requests`,error:c.error,onRetry:()=>f(e=>e+1)}):b?(0,K.jsxs)(`div`,{className:`ob-panel`,"data-review-target":!0,children:[(0,K.jsx)(`p`,{className:`ob-panel__title`,children:b.kind===`open`?`Newest open pull request, #${b.pr}`:`Last merge, pull request #${b.pr}`}),(0,K.jsx)(`p`,{children:b.title}),(0,K.jsx)(`p`,{className:`ob-note`,children:`Review without posting writes the review and holds the comment and the check in your Inbox. Nothing reaches GitHub until you approve.`})]}):(0,K.jsx)(`p`,{className:`ob-note`,children:`No open or merged pull request found. The dot reviews the next one on its own.`}),g&&(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:g}),b&&w&&(0,K.jsx)(`p`,{className:`ob-panel`,role:`status`,"data-shadow-note":!0,children:`The first week is on${C?`, until ${M(C.until)}`:``}, so the comment and the check wait in the Inbox after every review. End it on the dot's Settings page to post at once.`}),b&&(0,K.jsxs)(`div`,{className:`ob-actions`,"data-review-actions":!0,children:[(0,K.jsx)(v,{variant:`primary`,loading:m===`quiet`,onClick:()=>void T(!1),children:`Review without posting`}),!w&&(0,K.jsx)(v,{variant:`secondary`,loading:m===`post`,onClick:()=>void T(!0),children:`Post a comment and a check on PR #${b.pr}`})]}),(0,K.jsxs)(`div`,{className:`ob-foot`,children:[r&&(0,K.jsx)(v,{variant:`ghost`,icon:(0,K.jsx)(p,{size:14}),onClick:r,children:`Back`}),(0,K.jsx)(`span`,{className:`ob-foot__spacer`}),(0,K.jsx)(v,{variant:`ghost`,onClick:E,children:b?`Skip for now`:`Finish`})]})]}):(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:`See your first review`,body:`There is no dot yet, so there is nothing to review. Create one on the First dot step, or finish now and create one from the Dots page.`}),(0,K.jsx)(Y,{onBack:r,primary:{label:`Finish`,onClick:E}})]})}var Gt=[{mode:`team`,title:`A team server`,body:`One server for your team. You set it up once, then others open the link.`},{mode:`laptop`,title:`My laptop`,body:`Only you, on this machine. Nothing to host.`}];function Kt({view:e,progress:t,onDone:n,onDemo:r,onDismiss:i}){let[a,o]=(0,G.useState)(null),[s,c]=(0,G.useState)(null),[l,u]=(0,G.useState)(null),d=l??ee(t,e.server),f=async(e,t)=>{if(!a){o(e),c(null);try{await t()}catch(e){c(e instanceof Error?e.message:String(e))}finally{o(null)}}},p=d===`team`?Ae(e.server):[],m=p.filter(e=>!e.ok);return(0,K.jsxs)(`div`,{className:`ob-step ob-welcome`,children:[(0,K.jsxs)(`div`,{className:`ob-welcome__art`,"aria-hidden":`true`,children:[(0,K.jsx)(x,{name:`pip`,state:`ok`,size:64,decorative:!0}),(0,K.jsx)(x,{name:`nova`,state:`running`,size:64,decorative:!0}),(0,K.jsx)(x,{name:`bolt`,state:`ok`,size:64,decorative:!0})]}),(0,K.jsx)(q,{title:`Welcome to localdost`,body:`A dot is a QA helper that never sleeps. It reads every pull request, runs your tests, and tells you when something needs you. Where does this one run?`}),(0,K.jsxs)(`fieldset`,{className:`ob-choices`,children:[(0,K.jsx)(`legend`,{className:`field__label`,children:`Where localdost runs`}),Gt.map(e=>(0,K.jsxs)(`label`,{className:`ob-choice${d===e.mode?` is-selected`:``}`,children:[(0,K.jsx)(`input`,{type:`radio`,name:`ob-mode`,value:e.mode,checked:d===e.mode,onChange:()=>u(e.mode)}),(0,K.jsxs)(`span`,{className:`ob-choice__text`,children:[(0,K.jsx)(`span`,{className:`ob-choice__label`,children:e.title}),(0,K.jsx)(`span`,{className:`ob-choice__hint`,children:e.body})]})]},e.mode))]}),d===`team`&&(0,K.jsxs)(`section`,{className:`ob-panel`,"aria-label":`Team server check`,"data-team-check":!0,children:[(0,K.jsx)(`p`,{className:`ob-panel__title`,children:m.length?`Not ready for a team yet: ${m.length} to fix.`:`Ready for a team.`}),(0,K.jsx)(`ul`,{className:`ob-check-lines`,children:p.map(e=>(0,K.jsx)(J,{state:e.ok?`ok`:`bad`,title:e.title,detail:e.detail},e.key))}),(0,K.jsx)(`p`,{className:`ob-note`,children:`You can go on without fixing these. Come back to this step after you restart the server.`})]}),(0,K.jsx)(`p`,{className:`ob-note`,children:`Most steps can be skipped. Your progress is saved, so you can stop and come back.`}),s&&(0,K.jsx)(`p`,{className:`ob-error`,role:`alert`,children:s}),(0,K.jsxs)(`div`,{className:`ob-foot`,children:[(0,K.jsx)(v,{variant:`ghost`,onClick:i,children:`Skip setup`}),(0,K.jsx)(`span`,{className:`ob-foot__spacer`}),e.demo&&(0,K.jsx)(v,{variant:`secondary`,loading:a===`demo`,onClick:()=>void f(`demo`,r),children:`Try the demo`}),(0,K.jsx)(v,{variant:`primary`,loading:a===`start`,onClick:()=>void f(`start`,()=>n({mode:d})),children:`Start`})]})]})}function qt({routeStep:e}){let t=xe(),r=y(),i=t.progress,a=z(i,e),o=Ne(i),s=be(o),d=o?{data:s.data,loading:s.loading,error:s.error,reload:s.reload}:null,f=(0,G.useRef)(!0);if((0,G.useEffect)(()=>{if(f.current){f.current=!1;return}document.querySelector(`[data-step-title]`)?.focus({preventScroll:!0})},[a]),!t.view)return t.loading?(0,K.jsx)(c,{rows:4,label:`Loading setup`}):(0,K.jsx)(n,{title:`Could not load your setup progress`,error:t.error,onRetry:()=>void t.reload()});let p=async e=>{try{await t.save(e)}catch(e){throw r.show({title:`Could not save your progress.`,body:W(e),tone:`error`}),e}},m=e=>S(C({name:`welcome`,step:e.step})),h=async(e,t,n={})=>{n.repos&&Ne({...i,...n})?.toLowerCase()!==o?.toLowerCase()&&Object.assign(n,{tests:void 0,...i.githubIssues||n.githubIssues?{}:{tracker:void 0}});let r=de(i,e,t,n);await p(r),m(r)},g=async e=>{let t=D(`onboarding`)?.progress??i;await p({...t,...typeof e==`function`?e(t):e,status:t.status===`new`?`active`:t.status})},_=e=>{let t=fe(e);if(t)return()=>{let e=oe(i,t);p(e).catch(()=>{}),m(e)}},x=e=>({view:t.view,progress:i,onDone:t=>h(e,`done`,t),onSkip:()=>h(e,`skipped`).catch(()=>{}),onBack:_(e),onSave:g,onRefresh:t.reload}),w=()=>{p(Ce(i)).then(()=>S(`#/dots`)).catch(()=>{})},E=async(e,t)=>{await p(R(i,e,t)),T(j.dots),S(e?.id?C({name:`run`,id:e.id}):C({name:`dots`}))},O=async()=>{let e=t.view?.demoRepo??`demo/shop-web`,n=(await u.listDots()).filter(e=>!e.archived),r=n.find(t=>t.repo&&`${t.repo.owner}/${t.repo.name}`.toLowerCase()===e);if(!r){let t=await u.suggestDot(e);r=await u.createDot({...t.input,mascot:ne(n.map(e=>l(e)))}),T(j.dots)}let a={...i,status:`active`,demo:!0,repos:[e],dot:{id:r.id,name:r.name},steps:{welcome:`done`,delivery:`skipped`,model:`skipped`,github:`skipped`,repo:`skipped`,tracker:`skipped`,tests:`skipped`,slack:`skipped`,rules:`skipped`,dot:`done`},step:`value`,startedAt:i.startedAt??new Date().toISOString()};await p(a),m(a)},k=a===`dot`&&d&&!d.data,A;if(k&&d.loading)A=(0,K.jsx)(c,{rows:3,label:`Reading ${o}`});else if(k)A=(0,K.jsxs)(`div`,{className:`ob-step`,children:[(0,K.jsx)(q,{title:ye(a).title,body:`localdost could not read ${o}.`}),(0,K.jsx)(n,{compact:!0,title:`Could not read ${o}`,error:d.error,onRetry:()=>void d.reload()}),(0,K.jsx)(Y,{onBack:_(a),onSkip:()=>void h(a,`skipped`).catch(()=>{})})]});else switch(a){case`welcome`:A=(0,K.jsx)(Kt,{...x(`welcome`),onDemo:O,onDismiss:w});break;case`delivery`:A=(0,K.jsx)(nt,{...x(`delivery`)});break;case`model`:A=(0,K.jsx)(Dt,{...x(`model`)});break;case`github`:A=(0,K.jsx)(Et,{...x(`github`)});break;case`repo`:A=(0,K.jsx)(Nt,{...x(`repo`)});break;case`tracker`:A=(0,K.jsx)(Ht,{...x(`tracker`),suggest:d});break;case`tests`:A=(0,K.jsx)(lt,{...x(`tests`)});break;case`slack`:A=(0,K.jsx)(Vt,{...x(`slack`)});break;case`rules`:A=(0,K.jsx)(zt,{...x(`rules`)});break;case`dot`:A=(0,K.jsx)(Ct,{...x(`dot`),suggest:d});break;case`value`:A=(0,K.jsx)(Wt,{...x(`value`),onFinish:E})}let M=B.findIndex(e=>e.key===a);return(0,K.jsxs)(`div`,{className:`ob`,"data-step":a,children:[(0,K.jsxs)(`nav`,{className:`ob-nav`,"aria-label":`Setup steps`,children:[(0,K.jsxs)(`div`,{className:`ob-nav__top`,children:[(0,K.jsxs)(`p`,{className:`ob-nav__count num`,children:[`Step `,M+1,` of `,B.length]}),a!==`welcome`&&(0,K.jsx)(v,{variant:`ghost`,size:`sm`,className:`ob-nav__close`,onClick:w,children:`Close setup`})]}),(0,K.jsx)(`ol`,{className:`ob-steps`,children:B.map((e,t)=>{let n=i.steps[e.key],r=e.key===a;return(0,K.jsxs)(`li`,{className:[`ob-steps__item`,r?`is-current`:``,n?`is-${n}`:``].filter(Boolean).join(` `),"aria-current":r?`step`:void 0,children:[(0,K.jsx)(`span`,{className:`ob-steps__n`,"aria-hidden":`true`,children:n===`done`&&!r?(0,K.jsx)(b,{size:12}):t+1}),(0,K.jsxs)(`span`,{className:`ob-steps__label`,children:[e.label,n&&!r&&(0,K.jsxs)(`span`,{className:`sr-only`,children:[`, `,n]})]})]},e.key)})})]}),(0,K.jsx)(`div`,{className:`ob-body`,children:A},a)]})}function Jt({step:e}){return(0,K.jsx)(`div`,{className:`page qd-touch ob-page`,children:(0,K.jsx)(qt,{routeStep:e})})}export{Jt as default};
2
+ //# sourceMappingURL=Welcome-CCcy558Q.js.map
@@ -0,0 +1 @@
1
+ .chat-layout{--acard-w:320px;--acard-pill-w:220px;min-width:0;height:100%;display:flex;position:relative}.chat-layout>.chat{flex:1 1 0;min-width:0}.acard{display:none}.activity-pill{display:flex}@media (min-width:900px){.activity-pill{display:none!important}.acard{z-index:var(--z-sticky);display:block;position:absolute;inset-block-start:var(--space-4);inset-inline-end:var(--space-4)}}.acard--open{width:var(--acard-w);max-height:calc(100% - 2 * var(--space-4) - 90px);overscroll-behavior:contain;border:var(--hairline);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-2);overflow-y:auto}.acard__inner{gap:var(--space-4);padding:var(--space-5);flex-direction:column;display:flex}.acard-sheet .acard__inner{padding:var(--space-1) var(--space-4) var(--space-6)}.acard-sheet .dialog__body{padding:0}@media (min-width:1128px){.chat-layout:has(.acard--open)>.chat{margin-inline:auto calc(var(--acard-w) + 2 * var(--space-4))}}@media (min-width:900px) and (max-width:1679px){.chat-layout:has(.acard--pill) .chat__head{padding-inline-end:calc(var(--acard-pill-w) + 2 * var(--space-4))}}.acard__head{align-items:center;gap:var(--space-3);display:flex}.acard__who{flex:1;min-width:0}.acard__name{font-size:var(--text-md);font-weight:var(--weight-semibold);line-height:var(--leading-tight);overflow-wrap:anywhere}.acard__line{font-size:var(--text-sm);color:var(--text-3);text-wrap:pretty;margin-top:2px}.acard__collapse{width:var(--control-sm);height:var(--control-sm);margin:calc(-1 * var(--space-1)) calc(-1 * var(--space-1)) 0 0;border-radius:var(--radius);color:var(--text-3);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-self:flex-start;align-items:center;display:inline-flex;position:relative}.acard__collapse:after{content:"";position:absolute;inset:-8px}.acard__collapse:hover{background:var(--surface-hover);color:var(--text)}.acard__actions{gap:var(--space-2);flex-wrap:wrap;display:flex}.acard__push .toggle__label{font-size:var(--text-sm)}.acard__push .toggle__desc{font-size:var(--text-xs)}.acard__error-text{gap:var(--space-1);margin-top:var(--space-1);font-size:var(--text-xs);color:var(--outage-fg);display:flex}.acard__section{gap:var(--space-1);flex-direction:column;display:flex}.acard__h{margin-bottom:var(--space-1);font-size:var(--text-xs);font-weight:var(--weight-medium);color:var(--text-3)}.acard__list{border:var(--hairline);border-radius:var(--radius-md);margin:0;padding:0;list-style:none;overflow:hidden}.acard__list>li+li{border-top:var(--hairline)}.acard__list .acard__row{border-radius:0}.acard__row{align-items:flex-start;gap:var(--space-2);min-height:var(--row-compact);padding:var(--space-1) var(--space-2);border-radius:var(--radius);color:var(--text);font-size:var(--text-sm);line-height:1.4;display:flex}a.acard__row:hover{background:var(--surface-hover);text-decoration:none}.acard__row-text{flex-direction:column;flex:1;min-width:0;display:flex}.acard__row-title{overflow-wrap:anywhere;text-wrap:pretty}.acard__row-detail{font-size:var(--text-xs);color:var(--text-3);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.acard__row-time{font-size:var(--text-xs);color:var(--text-3);white-space:nowrap;flex:none;margin-top:1px}.acard__kind{font-size:var(--text-xs);color:var(--text-3);flex:none;margin-top:1px}.acard__waiting{margin:0 calc(-1 * var(--space-2));color:var(--text-3);align-items:center}.acard__waiting>.status-icon{margin-top:0}.acard__waiting--some{color:var(--text);font-weight:var(--weight-medium)}.acard__muted,.acard__stale{font-size:var(--text-sm);color:var(--text-3);text-wrap:pretty;margin:0}.acard__stale{color:var(--attention-fg)}.acard__error{align-items:flex-start;gap:var(--space-2);font-size:var(--text-sm);flex-direction:column;display:flex}.acard__more{margin-top:var(--space-1);color:var(--text-2);font-size:var(--text-xs);cursor:pointer;background:0 0;border:0;align-self:flex-start;padding:0;position:relative}.acard__more:after{content:"";position:absolute;inset:-8px -6px}.acard__more:hover{color:var(--text);text-decoration:underline}.acard--pill{inset-block-start:var(--space-3)}.acard__pill{align-items:center;gap:var(--space-2);max-width:var(--acard-pill-w);min-height:var(--control);padding:0 var(--space-3) 0 var(--space-2);border:var(--hairline);border-radius:var(--radius-full);background:var(--surface);box-shadow:var(--shadow-1);color:var(--text);font-size:var(--text-sm);cursor:pointer;display:flex}.acard__pill:hover{background:var(--surface-hover)}.acard__pill-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.activity-pill{align-items:center;gap:var(--space-2);width:calc(100% - 2 * var(--gutter));min-height:var(--tap);margin:var(--space-2) var(--gutter);padding:0 var(--space-3);border:var(--hairline);border-radius:var(--radius-full);background:var(--surface);color:var(--text);font-size:var(--text-sm);text-align:left;cursor:pointer;flex:none}.activity-pill__text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.activity-tree{padding-bottom:var(--space-3);flex-direction:column;display:flex}.activity-tree__empty,.activity-tree__stale{padding:var(--space-4);font-size:var(--text-sm);color:var(--text-3);text-wrap:pretty;margin:0}.activity-tree__stale{padding-block:var(--space-2);color:var(--attention-fg)}.activity-waiting{align-items:center;gap:var(--space-2);min-height:var(--row);padding:0 var(--space-4);border-bottom:var(--hairline);color:var(--text-3);font-size:var(--text-sm);display:flex}.activity-waiting--some{color:var(--text);font-weight:var(--weight-medium);background:var(--attention-bg)}.activity-waiting:hover{background:var(--surface-hover);text-decoration:none}.activity-waiting--some:hover{background:var(--attention-bg)}.activity-waiting__text{flex:1;min-width:0}.activity-group{display:block}.activity-group__head{align-items:center;gap:var(--space-2);width:100%;min-height:var(--row-compact);margin-top:var(--space-2);padding:0 var(--space-4);color:var(--text-2);font-size:var(--text-sm);font-weight:var(--weight-semibold);text-align:left;cursor:pointer;background:0 0;border:0;display:flex;position:relative}.activity-group__head:hover{background:var(--surface-hover)}.activity-group__icon{color:var(--text-3);flex:none}.activity-group__name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.activity-group__count{color:var(--text-3);font-weight:var(--weight-regular);flex:none}.activity-rows{margin:0;padding:0;list-style:none}.activity-rows>li+li{border-top:var(--hairline)}.activity-row__link{align-items:flex-start;gap:var(--space-3);min-height:var(--row);padding:var(--space-2) var(--space-4) var(--space-2) var(--space-6);color:var(--text);display:flex}a.activity-row__link:hover{background:var(--surface-hover);text-decoration:none}.activity-row--faded{opacity:.6}.activity-row--faded:hover,.activity-row--faded:focus-within{opacity:1}.activity-row__text{flex-direction:column;flex:1;min-width:0;display:flex}.activity-row__sub,.activity-row__step{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.activity-row__title{overflow-wrap:anywhere;text-wrap:pretty;font-size:var(--text-sm);font-weight:var(--weight-medium);line-height:1.35}.activity-row__sub{font-size:var(--text-xs);color:var(--text-3);line-height:1.4}.activity-row__step{font-size:var(--text-xs);color:var(--running-fg);font-variant-numeric:tabular-nums;line-height:1.4}.activity-row__tag{padding:0 var(--space-2);border-radius:var(--radius-sm);background:var(--surface-2);color:var(--text-2);font-size:var(--text-xs);flex:none;margin-top:1px;line-height:18px}.acard__row>.status-icon,.activity-row__link>.status-icon{margin-top:2px}.activity-pill>.status-icon{margin-top:0}.feed-tree-sheet .dialog__body{padding:0}
@@ -0,0 +1,2 @@
1
+ import{Mn as e,Vn as t,Wn as n}from"./ui-DcmhYyYp.js";import{c as r,i}from"./store-IqrqHuFR.js";import{y as a}from"./format-BBZ8vFyT.js";var o={working:`Working on it`,queued:`Waiting in the queue`,passed:`Tests passed, no bugs`,bugs:`Bugs found`,draft:`Something waits for your OK`,idle:`Idle`},s={working:`running`,queued:`queued`,passed:`passed`,bugs:`bug`,draft:`draft`,idle:`none`};function c(e){return e===`working`||e===`queued`}function l(e){let t=new Map;for(let n of e){let e=`${n.groupKind}:${n.group}`,r=t.get(e);r||(r={name:n.group,kind:n.groupKind,items:[],active:0},t.set(e,r)),r.items.push(n),n.state===`working`&&r.active++}let n=[...t.values()];for(let e of n)e.items.sort((e,t)=>u(e)-u(t)||t.at.localeCompare(e.at));return n.sort((e,t)=>Number(t.active>0)-Number(e.active>0)||t.items[0].at.localeCompare(e.items[0].at))}function u(e){return e.state===`working`?0:e.state===`queued`?1:e.state===`draft`?2:3}function d(e,t){if(e.state===`queued`)return e.step;if(e.state===`working`)return t?.total?`Running tests ${Math.min(t.done,t.total)}/${t.total}`:t?.step??e.step}function f(e){let t=e?.items??[];return{working:t.filter(e=>e.state===`working`).length,queued:t.filter(e=>e.state===`queued`).length,waiting:e?.waiting??0,reviewing:(e?.notes??[]).some(e=>!e.held)}}function p(e){let t=f(e),n=[];return t.working?n.push(`${t.working} running`):t.reviewing&&n.push(`reviewing old tickets`),t.queued&&n.push(`${t.queued} queued`),t.waiting&&n.push(`${t.waiting} to review`),n.length?n.join(`, `):`Nothing running`}function m(e){return e===0?`Nothing to review`:e===1?`1 item to review`:`${e} items to review`}function h(e){return e.drafts>0?`${e.drafts} to review`:e.primary?`primary`:void 0}function g(e){return e.filter(e=>c(e.state)).sort((e,t)=>u(e)-u(t)||t.at.localeCompare(e.at))}function _(e){return e.filter(e=>!c(e.state)).sort((e,t)=>t.at.localeCompare(e.at))}function v(e){if(e.kind===`pr`){let t=/#(\d+)$/.exec(e.key);if(t)return`PR #${t[1]}`}return e.kind===`ticket`?e.key:e.title}function y(e){let t=(e.data?.items??[]).filter(e=>e.state===`working`);return t.length===1?`Working on ${v(t[0])}`:t.length>1?`Working on ${t.length} things`:e.paused?`Paused`:e.lastRunAt?`Active ${a(e.lastRunAt,e.now)}`:`No activity yet`}var b={comment:`Comment`,defect:`Defect`,report:`Report`,check:`Check`};function x(e){return e===0?`Nothing to review`:e===1?`1 item to review`:`${e} items to review`}var S=n(t(),1),C=/^Test (passed|failed|skipped|timed out):/,w=/^Running (\d+) tests?$/,T=2e4;function E(t){let n=`activity:${t??`all`}`,a=i(n,n=>e(`/activity`,{signal:n,query:{dotId:t}}),{refreshOn:[`run`,`approval`],throttleMs:800}),[o,s]=(0,S.useState)({});r(e=>{if(e.type===`run_step`){let t=e.step.label;s(n=>{let r=n[e.runId]??{done:0},i=r.seen??[];return!C.test(t)||i.includes(t.replace(C,``))?{...n,[e.runId]:{...r,step:t}}:{...n,[e.runId]:{...r,step:t,done:r.done+1,seen:[...i,t.replace(C,``)]}}})}else if(e.type===`run_log`){let t=w.exec(e.line);t&&s(n=>({...n,[e.runId]:{...n[e.runId]??{done:0},total:Number(t[1])}}))}else e.type===`run`&&e.run.status!==`running`&&s(t=>{if(!(e.run.id in t))return t;let{[e.run.id]:n,...r}=t;return r})},[`run_step`,`run_log`,`run`]);let{reload:c}=a,l=!!a.data?.items.some(e=>e.state===`queued`);return(0,S.useEffect)(()=>{if(!l)return;let e=setInterval(()=>{document.visibilityState===`visible`&&c()},T);return()=>clearInterval(e)},[l,c]),{...a,progress:o}}export{m as a,g as c,y as d,d as f,o as i,p as l,x as m,b as n,f as o,h as p,s as r,l as s,E as t,_ as u};
2
+ //# sourceMappingURL=activity-CBfTSxqw.js.map
@@ -0,0 +1,2 @@
1
+ import{Cn as e,Dn as t,Vn as n,Wn as r,kn as i}from"./ui-DcmhYyYp.js";var a=r(n(),1);async function o(n,r){let i;try{i=await fetch(n,{headers:t(),signal:r})}catch(t){throw t instanceof DOMException&&t.name===`AbortError`?t:new e(0,`Could not reach the localdost server.`,n)}if(!i.ok)throw new e(i.status,i.status===401||i.status===403?`This file needs an access token. Add it in Settings.`:`Could not load this file.`,n);return i.blob()}function s(e){let t=!!e&&!!i(),[n,r]=(0,a.useState)(null);return(0,a.useEffect)(()=>{if(!e||!t)return;let n=new AbortController,i=null;return o(e,n.signal).then(t=>{i=URL.createObjectURL(t),r({url:e,src:i,error:null})},t=>{n.signal.aborted||r(n=>({url:e,src:n?.src??``,error:t}))}),()=>{if(n.abort(),i){let e=i;setTimeout(()=>URL.revokeObjectURL(e),5e3)}}},[e,t]),e?t?{src:n?.src||null,error:n?.url===e?n.error:null}:{src:e,error:null}:{src:null,error:null}}async function c(e,t){let n=document.createElement(`a`);if(n.download=t,!i()){n.href=e,n.click();return}let r=await o(e),a=URL.createObjectURL(r);n.href=a,n.click(),setTimeout(()=>URL.revokeObjectURL(a),1e4)}export{s as n,c as t};
2
+ //# sourceMappingURL=authedMedia-BTYt_tyu.js.map
@@ -0,0 +1,2 @@
1
+ import{Cn as e,Dn as t}from"./ui-DcmhYyYp.js";import{f as n}from"./index-B6qKm1NW.js";var r={max_runtime_s:120,max_tokens:2e4,max_actions:5},i=class extends e{field;constructor(e,t,n,r,i){super(e,t,n,r),this.name=`BeeApiError`,i&&(this.field=i)}},a={no_tenant:`Sign in to TinyBee on this phone first.`,not_paired:`This laptop is not paired with your account yet.`,wrong_tenant:`This laptop belongs to another TinyBee account.`};function o(){let e=n();return e?{Authorization:`Bearer ${e.accessToken}`}:t()}async function s(e,t={}){let{method:n=`GET`,body:r,signal:s,query:c}=t,l=`/api/v1${e}`;if(c){let e=new URLSearchParams;for(let[t,n]of Object.entries(c))n!==void 0&&n!==``&&e.set(t,String(n));let t=e.toString();t&&(l+=`?${t}`)}let u={Accept:`application/json`,...o()};r!==void 0&&(u[`Content-Type`]=`application/json`);let d;try{d=await fetch(l,{method:n,headers:u,body:r===void 0?void 0:JSON.stringify(r),signal:s})}catch(e){throw e instanceof DOMException&&e.name===`AbortError`?e:new i(0,navigator.onLine?`Could not reach your Bee.`:`You are offline.`,l)}if(!d.ok){let e,t=``,n;try{let r=await d.json();e=r.error??r.code,t=r.message??``,n=r.field}catch{}let r=t||e&&a[e]||(d.status===401?`Sign in again to reach your Bee.`:d.status===403?`Your Bee refused this.`:`Your Bee answered ${d.status}.`);throw new i(d.status,r,l,e,n)}if(d.status!==204)return await d.json()}var c={workflows:e=>s(`/workflows`,{signal:e}),workflow:(e,t)=>s(`/workflows/${encodeURIComponent(e)}`,{signal:t}),create:e=>s(`/workflows`,{method:`POST`,body:e}),fromText:(e,t)=>s(`/workflows/from-text`,{method:`POST`,body:{text:e},signal:t}),validate:(e,t)=>s(`/workflows/validate`,{method:`POST`,body:e,signal:t}),update:(e,t)=>s(`/workflows/${encodeURIComponent(e)}`,{method:`PATCH`,body:t}),remove:e=>s(`/workflows/${encodeURIComponent(e)}`,{method:`DELETE`}),toggle:(e,t)=>s(`/workflows/${encodeURIComponent(e)}/toggle`,{method:`POST`,body:{enabled:t}}),duplicate:e=>s(`/workflows/${encodeURIComponent(e)}/duplicate`,{method:`POST`,body:{}}),run:(e,t=!1)=>s(`/workflows/${encodeURIComponent(e)}/run`,{method:`POST`,body:{dry:t}}),skills:e=>s(`/skills`,{signal:e}),skill:(e,t)=>s(`/skills/${encodeURIComponent(e)}`,{signal:t}),runs:(e,t,n)=>s(`/runs`,{signal:n,query:{workflow:e,limit:t}}),runDetail:(e,t)=>s(`/runs/${encodeURIComponent(e)}`,{signal:t}),digest:(e=!1,t)=>s(`/digest`,{signal:t,query:{unread:e?`1`:void 0}})},l=[{name:`gmail.read`,kind:`read`,connection:`gmail`,label:`Read Gmail`},{name:`gmail.search`,kind:`read`,connection:`gmail`,label:`Search Gmail`},{name:`gmail.label`,kind:`write`,connection:`gmail`,label:`Label or move mail`},{name:`gmail.draft`,kind:`write`,connection:`gmail`,label:`Draft a reply`},{name:`gmail.send`,kind:`send`,connection:`gmail`,label:`Send mail`},{name:`drive.read`,kind:`read`,connection:`drive`,label:`Read Drive files`},{name:`drive.search`,kind:`read`,connection:`drive`,label:`Search Drive`},{name:`sheets.read`,kind:`read`,connection:`sheets`,label:`Read a sheet`},{name:`sheets.append`,kind:`write`,connection:`sheets`,label:`Write to a sheet`},{name:`web.fetch`,kind:`read`,label:`Fetch a web page`},{name:`notify.push`,kind:`send`,label:`Notify me`},{name:`digest.append`,kind:`internal`,label:`Add to digest`},{name:`memory.note`,kind:`internal`,label:`Remember a note`}];function u(e){let t=l.find(t=>t.name===e);return!t||t.kind===`read`||t.kind===`internal`?`auto`:`ask`}var d={gmail:`gmail.read`,drive:`drive.read`,sheets:`sheets.read`,web:`web.fetch`};function f(e){let t=new Set(e.agent.tools);for(let n of e.inputs)d[n.connection]&&t.add(d[n.connection]);for(let n of e.outputs)t.add(n.action);return l.map(e=>e.name).filter(e=>t.has(e))}export{s as a,c as i,r as n,u as o,l as r,f as s,i as t};
2
+ //# sourceMappingURL=beeApi-BHW8Tx1s.js.map
@@ -0,0 +1,2 @@
1
+ import{Tn as e,Vn as t,Wn as n}from"./ui-DcmhYyYp.js";import{i as r,o as i,r as a,t as o}from"./store-IqrqHuFR.js";var s=n(t(),1),c={dots:`dots`,archivedDots:`dots:archived`,dot:e=>`dot:${e}`,approvalsPending:`approvals:pending`,health:`health`,disk:`disk`,setup:`setup`,engines:`setup:engines`};function l(e,t){if(!t.delivery)return{...e,status:t.status};let{listening:n,pollSec:r,listeningMissing:i,listeningReason:a,...o}=e;return{...o,status:t.status,...t.delivery}}function u(){let t=r(c.dots,t=>e.listDots(t),{refreshOn:[`run`,`approval`],throttleMs:1500});return(0,s.useEffect)(()=>{let e=i.onEvent(e=>{e.type===`dot`&&o(c.dots)&&a(c.dots,t=>(t??[]).map(t=>t.id===e.watchId?l(t,e):t))});return()=>{e()}},[]),t}function d(){return r(c.archivedDots,t=>e.listArchivedDots(t))}function f(){return r(c.approvalsPending,t=>e.listApprovals({status:`pending`},t),{refreshOn:[`approval`],throttleMs:300})}function p(){return r(c.health,t=>e.health(t))}function m(){return r(c.disk,t=>e.disk(t),{refreshOn:[`disk`],throttleMs:300})}function h(){return r(c.setup,t=>e.setup(t))}function g(t=!0){return r(t?c.engines:null,t=>e.testEngines(t))}export{u as a,h as c,m as i,g as l,l as n,p as o,d as r,f as s,c as t};
2
+ //# sourceMappingURL=data-CmXvx3Mj.js.map
@@ -0,0 +1 @@
1
+ .eng{gap:var(--space-3);margin-top:var(--space-6);flex-direction:column;display:flex}.eng-head__title{font-size:var(--text-lg)}.eng-head__body{margin-top:var(--space-1);max-width:68ch;color:var(--text-2);text-wrap:pretty}.eng-row{gap:var(--space-2) var(--space-4);padding:var(--space-3) var(--gutter);border-bottom:var(--hairline);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}.eng-row:last-child{border-bottom:0}.eng-row__main{min-width:0}.eng-row__head{align-items:center;gap:var(--space-1) var(--space-3);flex-wrap:wrap;display:flex}.eng-row__name{font-weight:var(--weight-medium);white-space:nowrap}.eng-row__runs{text-wrap:pretty;margin-top:2px}.eng-row__detail{font-size:var(--text-sm);color:var(--text-3);overflow-wrap:anywhere;text-wrap:pretty;margin-top:2px}.eng-row--missing .eng-row__detail{color:var(--attention-fg)}.eng-row__toggle{min-width:0}.eng-row .toggle__label,.eng-row .toggle__desc{white-space:nowrap}@media (min-width:640px){.eng-row{grid-template-columns:minmax(0,1fr) auto;align-items:center}.eng-row__toggle{width:240px}}@media (max-width:380px){.eng-row__name,.eng-row .cx-state,.eng-row .toggle__label{font-size:var(--text-sm)}.eng-row .toggle__desc{font-size:var(--text-xs)}}.eng-foot{align-items:center;gap:var(--space-2) var(--space-4);padding:0 var(--gutter);flex-wrap:wrap;display:flex}.eng-foot__default{white-space:nowrap}.eng-foot__k{color:var(--text-3)}.eng-foot__note{min-width:0;font-size:var(--text-sm);color:var(--text-3);text-wrap:pretty;flex:240px}.eng-foot .btn{white-space:nowrap}@media (min-width:640px){.eng-foot{padding-left:0;padding-right:0}}.dot-head__engines{align-items:baseline;gap:var(--space-2);min-width:0;max-width:100%;display:inline-flex}.dot-head__engines-text{overflow-wrap:anywhere;text-wrap:pretty;min-width:0}@media (min-width:640px){.dot-head__engines-text{overflow-wrap:normal;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}}.dot-head__engines-word{white-space:nowrap}.dot-head__engines-change{white-space:nowrap;flex:none}
@@ -0,0 +1,2 @@
1
+ import{yn as e}from"./ui-DcmhYyYp.js";import{c as t}from"./router-W6nZsQ33.js";var n={spend_cap:`The team's AI limit is used up, so no result was written. Your admin can raise it.`,quota:`The AI account has no credit left, so no result was written. Your admin can add credit.`,rate_limit:`The AI service is busy, so no result was written.`,auth_expired:`The AI sign-in expired, so no result was written. Your admin can sign in again in Settings.`};function r(e,t){return e!==`model_unavailable`||t!==`spend_cap`&&t!==`quota`&&t!==`auth_expired`}function i(e,t,r){switch(e){case`model_unavailable`:return r&&n[r]?n[r]:t?`The AI service is not available, so no result was written. Your admin can check the AI settings.`:`The AI service could not answer, so no result was written. Your admin can check the AI settings.`;case`model_cap`:return`Paused: the team's AI limit for today is used up, so this check waits for the reset. Your admin can raise the limit.`;case`deploy_wait`:return`This check waits for the deploy of this merge. No result was written yet.`;case`shutdown`:return`The server was shut down while this check was running.`;case`restart`:return`The server restarted while this check was running.`;case`lease_expired`:return`The worker stopped responding.`;case void 0:case``:return`The server may have restarted.`;default:return`${e.replace(/\.$/,``)}.`}}var a={pr_check:`PR check`,post_merge:`After merge`,ci_failure:`Build failed`,ticket_review:`Ticket review`,outage:`Site down`,recovery:`Site back up`,digest:`Daily digest`,rerun:`Check again`,repo_scan:`Code scan`,test_design:`Test cases`,nightly_run:`Nightly check`,workflow:`Workflow`};function o(n){if(n.kind===`nightly_run`)return a.nightly_run;let r=t(n);return r?e[r]:void 0}function s(e){let t=a[e.kind]??e.kind;return o(e)===t?void 0:t}var c={pass:`Passed`,product_failure:`Bug found`,test_failure:`Test needs a fix`,environment_failure:`Could not check`,flaky:`Flaky`,needs_attention:`Needs a person`,info:`For your info`};function l(e,t){if(e===`needs_attention`){if(t===`outage`)return`Site down`;if(t===`ticket_review`)return`Needs answers`}return c[e]}var u={pass:`ok`,product_failure:`outage`,test_failure:`attention`,environment_failure:`attention`,flaky:`attention`,needs_attention:`attention`,info:`paused`},d=[`pass`,`product_failure`,`test_failure`,`environment_failure`,`flaky`,`needs_attention`,`info`],f={pass:`passed`,product_failure:`bug`,test_failure:`attention`,environment_failure:`blocked`,flaky:`flaky`,needs_attention:`waiting`,info:`info`};function p(e){let t=t=>({status:u[t],label:l(t,e.kind),icon:f[t]});switch(e.status){case`running`:return{status:`running`,label:`Running`,icon:`running`};case`cancelled`:return{status:`paused`,label:`Cancelled`,icon:`cancelled`};case`interrupted`:return e.interruptReason===`model_cap`?{status:`paused`,label:`Paused until reset`,icon:`paused`}:e.interruptReason===`deploy_wait`?{status:`paused`,label:`Waiting for deploy`,icon:`paused`}:{status:`attention`,label:`Stopped`,icon:`paused`};case`failed`:return e.verdict?t(e.verdict.outcome):{status:`outage`,label:`Could not check`,icon:`failed`};default:return e.verdict?t(e.verdict.outcome):{status:`ok`,label:`Done`,icon:`passed`}}}function m(e){return e.verdict?.headline?.trim()||e.trigger?.title?.trim()||a[e.kind]||e.kind}var h={run_tests:`Run tests`,check_run:`GitHub check`,pr_comment:`PR comment`,ticket_comment:`Ticket comment`,push_notify:`Phone alert`,open_pr:`Open PR`,revert:`Revert`,mcp_tool:`App action`,slack_post:`Slack post`,report_edit:`Report edit`,file_defect:`Bug report`,issue_create:`Bug report`,case_retire:`Archive test case`,ticket_status:`Ticket status`},g={executed:{label:`Done`,tone:`ok`},pending_approval:{label:`To review`,tone:`attention`},handed_off:{label:`Left to you`,tone:`neutral`},blocked:{label:`Not allowed`,tone:`outage`}},_={"product-area":`Product area`,"qa-lead":`QA lead`,"release-guard":`Release check`,"ticket-reviewer":`Ticket review`,"prod-watcher":`Site check`,custom:`Custom`},v={passed:{label:`Passed`,status:`ok`},failed:{label:`Failed`,status:`outage`},timedOut:{label:`Timed out`,status:`outage`},flaky:{label:`Flaky`,status:`attention`},skipped:{label:`Skipped`,status:`paused`}};function y(e,t,n=`${t}s`){return`${e.toLocaleString()} ${e===1?t:n}`}function b(e){if(e==null||!Number.isFinite(e)||e<0)return`-`;if(e<1e3)return`${Math.round(e)}\u00a0ms`;let t=e/1e3;if(t<60)return`${t<10?t.toFixed(1):Math.round(t)}\u00a0s`;let n=Math.floor(t/60),r=Math.round(t%60);return r?`${n}\u00a0min ${r}\u00a0s`:`${n}\u00a0min`}function x(e){return!Number.isFinite(e)||e<0?`-`:e<1024?`${e}\u00a0B`:e<1048576?`${(e/1024).toFixed(+(e<10240))}\u00a0KB`:`${(e/1024/1024).toFixed(1)}\u00a0MB`}function S(e,t=Date.now()){if(!e)return`-`;let n=Date.parse(e);if(!Number.isFinite(n))return`-`;let r=Math.round((t-n)/1e3),i=Math.abs(r);if(i<45)return`just now`;let a=null;return i<3600?a=`${Math.max(1,Math.round(i/60))}\u00a0min`:i<86400?a=`${Math.round(i/3600)}\u00a0h`:i<604800&&(a=`${Math.round(i/86400)}\u00a0d`),a?r>=0?`${a} ago`:`in ${a}`:new Date(n).toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:new Date(n).getFullYear()===new Date(t).getFullYear()?void 0:`numeric`})}function C(e){if(!e)return``;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):``}function w(e){if(!e)return``;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`}):``}function T(e){let t=new Date(e);return Number.isNaN(t.getTime())?`unknown`:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function E(e,t=new Date){if(e===`unknown`)return`Unknown date`;let n=T(t.toISOString()),r=new Date(t);if(r.setDate(r.getDate()-1),e===n)return`Today`;if(e===T(r.toISOString()))return`Yesterday`;let[i,a,o]=e.split(`-`).map(Number);return new Date(i,a-1,o).toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`,year:i===t.getFullYear()?void 0:`numeric`})}function D(e,t){let n=[],r=new Date;for(let i of e){let e=T(t(i)),a=n[n.length-1];(!a||a.key!==e)&&(a=n.find(t=>t.key===e)??{key:e,label:E(e,r),items:[]},n.includes(a)||n.push(a)),a.items.push(i)}return n}function O(e){if(!e.finishedAt)return;let t=Date.parse(e.finishedAt)-Date.parse(e.createdAt)-(e.deployWaitedMs??0);return Number.isFinite(t)?Math.max(0,t):void 0}function k(e){let t=e.report;if(!t)return null;let n=[`${t.passed} passed`];return t.failed&&n.push(`${t.failed} failed`),t.flaky&&n.push(`${t.flaky} flaky`),t.skipped&&n.push(`${t.skipped} skipped`),n.join(`, `)}var A=/^(--reporter|--config|-c|--output)(=|$)/;function j(e){let t=e.trim().split(/\s+/).filter(Boolean),n=t[0]===`docker`&&t.length>2?2:0,r=[];for(let e=n;e<t.length;e++){let n=A.exec(t[e]);if(!n){r.push(t[e]);continue}!n[2]&&e+1<t.length&&!t[e+1].startsWith(`-`)&&e++}return r.join(` `)}function M(e){let t=e.replace(/^\[[^\]]+\]\s*/,``).replace(/\s@[\w-]+/g,``).split(/\s+(?:›|>)\s+/).map(e=>e.trim()).filter(Boolean);return t.length<2?t[0]??e.trim():`${t.slice(0,-1).join(`, `)}: ${t[t.length-1]}`}function N(e,t=1/0){return e.normalize(`NFKD`).replace(/[^A-Za-z0-9._-]+/g,`-`).replace(/\.{2,}/g,`.`).replace(/^[^A-Za-z0-9]+/,``).replace(/-+/g,`-`).slice(0,t).replace(/[-.]+$/,``).toLowerCase()}var P=40;function F(e,t){if(!t?.length)return null;let n=t.find(t=>t.evidence?.screenshots.some(t=>t.name===e));if(n)return M(n.title);let r=/^a\d+-(?:frame-\d+-)?(.+?)(?:-(?:chromium|firefox|webkit))?(?:-test-failed-\d+)?\.(?:png|jpe?g|webp)$/i.exec(e);if(!r)return null;let i=r[1].toLowerCase(),a=e=>e.title.replace(/^\[[^\]]+\]\s*/,``),o=t.filter(e=>N(a(e),P)===i),s=o.length?o:t.filter(e=>N(a(e)).startsWith(i)),c=new Set(s.map(e=>M(e.title)));return c.size===1?[...c][0]:null}function I(e){return/^\[([^\]]+)\]/.exec(e)?.[1]??``}function L(e){return e.replace(/^\[[^\]]+\]\s*/,``).split(/\s+[›>]\s+/).map(e=>e.trim()).join(` > `)}export{o as C,k as D,L as E,I as O,p as S,j as T,M as _,c as a,r as b,v as c,w as d,x as f,s as g,i as h,f as i,C as l,D as m,g as n,d as o,b as p,a as r,_ as s,h as t,F as u,y as v,m as w,O as x,S as y};
2
+ //# sourceMappingURL=format-BBZ8vFyT.js.map
@@ -0,0 +1 @@
1
+ .form-stack{gap:var(--space-4);flex-direction:column;display:flex}.form-alert{padding:var(--space-3) var(--space-4);border:1px solid var(--outage);border-radius:var(--radius-md);background:var(--outage-bg);color:var(--text);font-size:var(--text-sm)}.form-alert:focus-visible{box-shadow:var(--focus-ring)}.form-alert__title{font-weight:var(--weight-semibold);color:var(--outage-fg);margin-bottom:var(--space-1)}.form-alert__code{margin-top:var(--space-1);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-3)}.form-alert__list{padding-left:var(--space-4);margin:0}.form-alert__list .link-btn{min-height:0;font-weight:var(--weight-medium);padding:0}.choice__label--brand{align-items:center;gap:var(--space-2);display:inline-flex}
@@ -0,0 +1,2 @@
1
+ import{n as e,t,u as n}from"./index-B6qKm1NW.js";function r(e){let t=(e+`=`.repeat((4-e.length%4)%4)).replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t),r=new Uint8Array(new ArrayBuffer(n.length));for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}async function i(){if(e()){let e=await t();return e===`registered`?`subscribed`:e}if(typeof Notification>`u`||!(`serviceWorker`in navigator)||!(`PushManager`in window))return`unsupported`;if(await Notification.requestPermission()!==`granted`)return`denied`;let i=await navigator.serviceWorker.ready,{publicKey:a}=await n.pushVapid(),o=await i.pushManager.getSubscription()??await i.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:r(a)});return await n.pushSubscribe(o.toJSON()),`subscribed`}export{i as enableHivePush};
2
+ //# sourceMappingURL=hivePush-DZJDokj7.js.map
@@ -0,0 +1,2 @@
1
+ import{$t as e,Gt as t,Kt as n,Qt as r,Tn as i,Vn as a,W as o,Wn as s,Xt as c,b as l,ht as u,mn as d,pn as f,q as p,t as m,ut as h}from"./ui-DcmhYyYp.js";import{t as g}from"./router-W6nZsQ33.js";import{i as _}from"./store-IqrqHuFR.js";import{r as v}from"./true-9Q68cs5b.js";var y=s(a(),1);function b(e){switch(e){case`sent`:return`check`;case`sending`:case`retry`:case`unreachable`:case`key_missing`:return`clock`;case`key_rejected`:case`project_not_found`:case`refused`:return`cross`;case`no_tests`:case`sandbox`:return`skip`;default:return`warn`}}var x=e=>/[.!?]$/.test(e.trim())?e.trim():`${e.trim()}.`;function S(e,t){switch(e.code){case`sent`:return`Sent to True Platform`;case`sending`:return`Sending to True Platform...`;case`retry`:return`Not sent yet: ${x(e.error??`True Platform did not answer.`)}${e.nextAt?` Trying again at ${t(e.nextAt)}.`:``}`;case`unreachable`:return`Not sent yet: True Platform has not answered${e.since?` since ${t(e.since)}`:``}.${e.nextAt?` Checking again at ${t(e.nextAt)}.`:``}`;case`key_missing`:return`Not sent yet: waiting for the key. Ask your admin to set LOCALDOST_KATALON_API_KEY on the localdost server.`;case`key_rejected`:return`Not sent: the True Platform key was rejected. Ask your admin to check it.`;case`project_not_found`:return`Not sent: ${e.projectId?`project ${e.projectId}`:`the project`} was not found for this key. Ask your admin to check the project ID.`;case`no_tests`:return`Not sent: the tests did not run.`;case`gave_up_24h`:return`Not sent: gave up after 24 hours.`;case`dependency`:return x(e.error??`Not sent because an earlier item was not sent.`);case`other_user`:return`Not sent: this run was started by another True Platform user.`;case`refused`:return`Not sent: ${x(e.error??`True Platform refused it.`)}`;case`sandbox`:return`Not sent: sandbox mode.`}}var C=d(),w={check:`passed`,clock:`queued`,cross:`failed`,skip:`skipped`,warn:`attention`},ee={queued:`Waiting`,running:`Sending`,done:`Sent`,held:`Held`,gave_up:`Not sent`},T=(e,t,n)=>`true-line:${e}:${t}:${n}`;function E(e,t){return t===`case`&&e.code===`sent`&&e.trueName?`In True Platform: ${e.trueName}`:S(e,v)}function D(e){let t=e.details??[],n=e.earlierRounds??[];return!t.length&&!n.length?null:(0,C.jsxs)(o,{children:[t.length>0&&(0,C.jsx)(`ul`,{className:`true-line__list`,children:t.map(e=>(0,C.jsxs)(`li`,{className:`true-line__item`,"data-state":e.state,children:[(0,C.jsx)(`span`,{className:`true-line__item-label`,children:e.label}),(0,C.jsx)(`span`,{className:`true-line__item-state`,children:ee[e.state]??e.state}),e.error&&(0,C.jsx)(`span`,{className:`true-line__item-error`,children:e.error}),e.attempts>0&&(0,C.jsx)(`span`,{className:`true-line__item-tries`,children:e.attempts===1?`Tried once`:`Tried ${e.attempts} times`})]},e.id))}),n.length>0&&(0,C.jsx)(`ul`,{className:`true-line__list`,children:n.map(e=>(0,C.jsxs)(`li`,{className:`true-line__item`,children:[(0,C.jsxs)(`span`,{className:`true-line__item-label`,children:[`Round `,e.round]}),(0,C.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,children:`Open in True`})]},e.round))})]})}function O({dotId:e,kind:t,id:n}){let r=p(),a=T(e,t,n),o=_(a,r=>i.trueLine(e,t,n,r),{refreshOn:[`run`],throttleMs:1500}),[s,c]=(0,y.useState)(!1),u=o.data,d=u&&`code`in u?u:void 0,m=!!d&&d.code!==`sent`&&!d.canResend;if((0,y.useEffect)(()=>{if(!m)return;let e=setInterval(()=>void o.reload(),8e3);return()=>clearInterval(e)},[m,o]),!d)return null;let h=w[b(d.code)],g=async()=>{if(d.itemId){c(!0);try{await i.trueResendItem(e,d.itemId),await o.reload()}catch(e){r.show({title:`Could not send again`,body:e instanceof Error?e.message:`Try again.`,tone:`error`})}finally{c(!1)}}},v=E(d,t);return(0,C.jsxs)(`div`,{className:`true-line-block`,"data-true-line":t,children:[(0,C.jsxs)(`div`,{className:`true-line`,role:`status`,"data-true-state":d.code,children:[(0,C.jsx)(l,{kind:h,label:v,decorative:!0}),(0,C.jsx)(`span`,{className:`true-line__text`,children:v}),d.url&&(0,C.jsxs)(`a`,{className:`true-line__link`,href:d.url,target:`_blank`,rel:`noreferrer`,children:[d.urlLabel??`Open in True`,` `,(0,C.jsx)(`span`,{"aria-hidden":`true`,children:`>`})]}),d.canResend&&(0,C.jsx)(f,{variant:`secondary`,size:`sm`,onClick:()=>void g(),disabled:s,children:`Send again`})]}),d.notes?.map(e=>(0,C.jsx)(`p`,{className:`true-line__note`,children:e},e)),D(d)]})}var k={manual:`Manual`,playwright:`Playwright`,aivision:`AI-Vision`},A={draft:`Draft`,ready:`Ready`,retired:`Archived`},j={designer:`Written by the dot`,user:`A person`,imported:`Imported`},M={must:`Must`,should:`Should`,could:`Could`},N={passed:`Passed`,failed:`Failed`,skipped:`Skipped`,blocked:`Blocked`},P=Object.keys(k),F=Object.keys(A),I=Object.keys(M),L=Object.keys(N),R={passed:`passed`,failed:`failed`,skipped:`skipped`,blocked:`blocked`};function z(e,t){let n=e.ref.indexOf(`#`),r=n<0?e.ref:t&&e.ref.slice(0,n)===t.toLowerCase()?e.ref.slice(n):e.ref.slice(e.ref.lastIndexOf(`/`,n)+1);return{source:e.source,refKey:r,title:e.title,href:e.url}}function B(e){let t=e.draft+e.ready,n=[e.draft?`${e.draft} draft`:``,e.ready?`${e.ready} ready`:``].filter(Boolean).join(`, `),r=`${t} ${t===1?`test case`:`test cases`}${n?`: ${n}`:``}.`;return e.retired?`${r} ${e.retired} archived.`:r}function V(e){return e.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean)}var H=e=>`impact:${e}:`,U=(e,t=``,n=``)=>`${H(e)}${t}:${n}`;function W(i,a=16){let o=i.subject===`spec`;return i.verdict===`valid`?{word:`Still valid`,tone:`ok`,icon:(0,C.jsx)(c,{size:a})}:{accepted:{word:i.verdict===`obsolete`?`Archived`:o?`Updated`:`Accepted`,tone:`ok`,icon:(0,C.jsx)(n,{size:a})},rejected:{word:o?`Dismissed`:`Rejected`,tone:`paused`,icon:(0,C.jsx)(r,{size:a})},expired:{word:`Not decided`,tone:`neutral`,icon:(0,C.jsx)(e,{size:a})}}[i.state]||(i.verdict===`update`?{word:`Needs update`,tone:`attention`,icon:(0,C.jsx)(h,{size:a})}:{word:`Obsolete`,tone:`attention`,icon:(0,C.jsx)(t,{size:a})})}function G({item:e,fold:t=`fold`}){let n=W(e);return(0,C.jsx)(m,{icon:n.icon,word:n.word,tone:n.tone,fold:t})}var K={high:`High confidence`,medium:`Medium confidence`,low:`Low confidence`};function q(e){return{source:`case`,refKey:e.caseKey,title:e.title,href:g({name:`cases`,dotId:e.dotId,case:e.caseKey})}}function J(e){return{source:`spec`,title:e.title,href:e.specUrl,status:e.specPath}}function Y(e,t){return z(e.requirement,t)}var X=e=>e.expected?`${e.action}. You see: ${e.expected}`:e.action;function Z(e,t){let n=e??[],r=t??[],i=[];for(let e=0;e<Math.max(n.length,r.length);e++)JSON.stringify(n[e]??null)!==JSON.stringify(r[e]??null)&&i.push({n:e+1,...n[e]?{before:n[e]}:{},...r[e]?{after:r[e]}:{}});return i}var Q=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`;function $(e){let t=(e?.cases??0)+(e?.specs??0);return t>0?`${t} more matched and ${t===1?`was`:`were`} left out.`:``}function te(e,t){if(!e.length)return`No existing tests look affected.`;let n=t=>e.filter(e=>e.verdict===t).length,r=[n(`update`)?`${n(`update`)} ${n(`update`)===1?`needs`:`need`} an update`:``,n(`obsolete`)?`${n(`obsolete`)} ${n(`obsolete`)===1?`is`:`are`} obsolete`:``,n(`valid`)?`${n(`valid`)} ${n(`valid`)===1?`is`:`are`} still valid`:``].filter(Boolean),i=$(t);return`${Q(e.length,`existing test`)} checked: ${r.join(`, `)}.${i?` ${i}`:``}`}function ne({flag:e,fold:t=`fold`}){let n=e.verdict===`update`?`${e.ticket} changes this test case. A new version waits for you.`:`${e.ticket} makes this test case obsolete. Archiving it waits in the Inbox for your OK.`;return(0,C.jsx)(`span`,{title:n,className:`needs-review`,children:(0,C.jsx)(m,{icon:(0,C.jsx)(u,{size:16}),word:`Needs review`,tone:`attention`,fold:t})})}export{B as C,O as E,A as S,V as T,L as _,Z as a,j as b,te as c,X as d,Y as f,M as g,I as h,q as i,$ as l,k as m,G as n,U as o,P as p,ne as r,H as s,K as t,J as u,R as v,z as w,F as x,N as y};
2
+ //# sourceMappingURL=impactModel-MY1OFuiP.js.map