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,150 @@
1
+ // Spec inventory: every test file in the checkout with its titles, visited routes,
2
+ // test ids, text locators and imports, each with a line number, so a spec can be
3
+ // linked to an impact area and a removed selector can be traced to the line that uses it.
4
+ import { posix } from 'node:path';
5
+ import { isTestFile } from './classify.js';
6
+ import { extractImports } from './imports.js';
7
+ export const MAX_SPECS = 2000;
8
+ const SPEC_CODE = /\.(ts|tsx|js|jsx|mjs|cjs|py)$/;
9
+ function lineAt(text, index) {
10
+ let n = 1;
11
+ for (let i = 0; i < index && i < text.length; i++)
12
+ if (text.charCodeAt(i) === 10)
13
+ n++;
14
+ return n;
15
+ }
16
+ function unq(s) {
17
+ return s.replace(/\\(['"`\\])/g, '$1');
18
+ }
19
+ /** Path part of a goto target: drops `${baseUrl}`, origins and query strings. */
20
+ export function routeOfTarget(target) {
21
+ let t = target.trim();
22
+ t = t.replace(/^\$\{[^}]*\}/, '');
23
+ const abs = /^[a-z]+:\/\/[^/]+(\/.*)?$/i.exec(t);
24
+ if (abs)
25
+ t = abs[1] ?? '/';
26
+ if (!t.startsWith('/')) {
27
+ if (t === '' || t === '.')
28
+ return '/';
29
+ if (/^[\w-]+(\/|$)/.test(t))
30
+ t = `/${t}`;
31
+ else
32
+ return null;
33
+ }
34
+ t = t.split(/[?#]/)[0].replace(/\$\{[^}]*\}/g, ':param');
35
+ return t.length > 1 ? t.replace(/\/+$/, '') : t;
36
+ }
37
+ const STR = `(['"\`])((?:\\\\.|(?!\\1)[^\\n])*)\\1`;
38
+ const TITLE_RE = new RegExp(`\\b(?:test|it|describe|context|suite|specify)(?:\\.(?:describe|only|skip|fixme|serial|parallel|step|concurrent|each\\([^)]*\\)))*\\s*\\(\\s*${STR}`, 'g');
39
+ const GOTO_RE = new RegExp(`(?:\\.goto|cy\\.visit|\\bvisit|\\bnavigate(?:To)?)\\(\\s*${STR}`, 'g');
40
+ const REQ_RE = new RegExp(`\\b(?:request|client|api|supertest\\([^)]*\\)|agent)\\.(?:get|post|put|patch|delete)\\(\\s*${STR}`, 'g');
41
+ const TESTID_RE = new RegExp(`getByTestId\\(\\s*${STR}`, 'g');
42
+ const ATTR_RE = /\[\s*data-(?:testid|test-id|test|cy|qa)\s*=\s*["']?([^"'\]\s]+)["']?\s*\]/g;
43
+ const ROLE_NAME_RE = new RegExp(`getByRole\\([^)]*?\\bname:\\s*${STR}`, 'g');
44
+ const TEXT_RE = new RegExp(`(?:getBy(?:Text|Label|Placeholder|AltText|Title)|findBy(?:Text|LabelText|PlaceholderText)|getBy(?:LabelText|PlaceholderText|DisplayValue)|toHaveText|toContainText|toHaveValue|cy\\.contains|has-text\\(|text=)\\(?\\s*${STR}`, 'g');
45
+ /** Parses one spec file. Imports stay raw here; specInventory resolves them. */
46
+ export function parseSpec(path, text, smokeGrep = '@smoke') {
47
+ const refs = [];
48
+ const titles = [];
49
+ const push = (kind, value, index) => {
50
+ const v = unq(value).trim();
51
+ if (!v || v.length > 200)
52
+ return;
53
+ refs.push({ kind, value: v, line: lineAt(text, index) });
54
+ };
55
+ if (path.endsWith('.py')) {
56
+ for (const m of text.matchAll(/^\s*(?:async\s+)?def\s+(test_\w+)/gm))
57
+ titles.push(m[1]);
58
+ for (const m of text.matchAll(/^\s*class\s+(Test\w+)/gm))
59
+ titles.push(m[1]);
60
+ for (const m of text.matchAll(/\b(?:client|page|self\.client)\.(?:get|post|put|patch|delete|goto)\(\s*f?(['"])([^'"]*)\1/g)) {
61
+ const r = routeOfTarget(m[2]);
62
+ if (r)
63
+ push('route', r, m.index ?? 0);
64
+ }
65
+ for (const m of text.matchAll(/get_by_test_id\(\s*(['"])([^'"]+)\1/g))
66
+ push('testid', m[2], m.index ?? 0);
67
+ for (const m of text.matchAll(/get_by_(?:text|label|placeholder)\(\s*(['"])([^'"]+)\1|get_by_role\([^)]*name\s*=\s*(['"])([^'"]+)\3/g))
68
+ push('text', m[2] ?? m[4], m.index ?? 0);
69
+ }
70
+ else {
71
+ for (const m of text.matchAll(TITLE_RE))
72
+ titles.push(unq(m[2]));
73
+ for (const m of text.matchAll(GOTO_RE)) {
74
+ const r = routeOfTarget(m[2]);
75
+ if (r)
76
+ push('route', r, m.index ?? 0);
77
+ }
78
+ for (const m of text.matchAll(REQ_RE)) {
79
+ const r = routeOfTarget(m[2]);
80
+ if (r)
81
+ push('route', r, m.index ?? 0);
82
+ }
83
+ for (const m of text.matchAll(TESTID_RE))
84
+ push('testid', m[2], m.index ?? 0);
85
+ for (const m of text.matchAll(ROLE_NAME_RE))
86
+ push('text', m[2], m.index ?? 0);
87
+ for (const m of text.matchAll(TEXT_RE))
88
+ push('text', m[2], m.index ?? 0);
89
+ }
90
+ for (const m of text.matchAll(ATTR_RE))
91
+ push('testid', m[1], m.index ?? 0);
92
+ const uniq = (k) => [...new Set(refs.filter((r) => r.kind === k).map((r) => r.value))];
93
+ const e2e = /@playwright\/test|from ['"]cypress['"]|\bcy\.|\bpage\.goto\(|playwright\.sync_api|from playwright|webdriverio|\bbrowser\.url\(/.test(text) ||
94
+ /(^|\/)(e2e|cypress|playwright)\//.test(path);
95
+ refs.sort((a, b) => a.line - b.line || (a.kind < b.kind ? -1 : a.kind > b.kind ? 1 : a.value < b.value ? -1 : 1));
96
+ return {
97
+ path,
98
+ kind: e2e ? 'e2e' : 'unit',
99
+ titles: [...new Set(titles)],
100
+ routes: uniq('route'),
101
+ testIds: uniq('testid'),
102
+ texts: uniq('text'),
103
+ refs,
104
+ smoke: !!smokeGrep && text.includes(smokeGrep),
105
+ };
106
+ }
107
+ /** Test files the import graph does not hold (for example .rb, .go, .java) are left out. */
108
+ export function specInventory(view, graph, opts = {}) {
109
+ const candidates = [...new Set([...view.list(), ...(opts.extra ?? [])])].filter((f) => SPEC_CODE.test(f) && isTestFile(f) && !/\.d\.ts$/.test(f));
110
+ const out = [];
111
+ for (const path of candidates.sort().slice(0, MAX_SPECS)) {
112
+ const text = view.read(path);
113
+ if (text === null)
114
+ continue;
115
+ const info = parseSpec(path, text, opts.smokeGrep);
116
+ // Skip helpers in test folders that hold no test.
117
+ if (!info.titles.length && !info.refs.length)
118
+ continue;
119
+ let imports = [];
120
+ const resolved = graph?.edges.get(path);
121
+ if (resolved)
122
+ imports = [...resolved].sort();
123
+ else if (!graph)
124
+ imports = extractImports(path, text)
125
+ .map((i) => i.spec)
126
+ .filter((s) => s.startsWith('.'))
127
+ .map((s) => posix.normalize(posix.join(posix.dirname(path), s)));
128
+ out.push({ ...info, imports });
129
+ }
130
+ return out;
131
+ }
132
+ /** Unit tests that sit next to a source file: foo.test.ts, __tests__/foo.test.ts, test_foo.py, foo_test.go. */
133
+ export function isNeighbourTest(spec, source) {
134
+ const sDir = posix.dirname(source);
135
+ const sStem = (source.split('/').pop() ?? '').replace(/\.[^.]+$/, '');
136
+ const tDir = posix.dirname(spec);
137
+ const tName = spec.split('/').pop() ?? '';
138
+ const tStem = tName
139
+ .replace(/\.(test|spec)\.[^.]+$/, '')
140
+ .replace(/^test_/, '')
141
+ .replace(/_test\.[^.]+$/, '')
142
+ .replace(/\.py$/, '');
143
+ if (tStem !== sStem)
144
+ return false;
145
+ if (tDir === sDir || tDir === `${sDir}/__tests__` || tDir === `${sDir}/tests` || tDir === `${sDir}/test`)
146
+ return true;
147
+ // src/foo.ts and test/foo.test.ts: a test folder beside the source folder.
148
+ return /^(__tests__|tests?|spec)$/.test(posix.basename(tDir)) && posix.dirname(tDir) === posix.dirname(sDir);
149
+ }
150
+ //# sourceMappingURL=specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs.js","sourceRoot":"","sources":["../../src/review/specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ // ASD-STE100 (Simplified Technical English) rules for text a QA engineer reads first (KAT-144):
2
+ // the change summary on the run page and at the top of the PR comment. One source for the prompt
3
+ // rule block, the reviewer answer check, the summary builder and the readability eval.
4
+ //
5
+ // The script checks what a script can check: sentence length, sentence count, passive voice,
6
+ // banned words and file names. "One meaning per word" stays a prompt rule.
7
+ /** An instruction (a sentence that starts with a verb) has at most 20 words. */
8
+ export const STE_MAX_INSTRUCTION_WORDS = 20;
9
+ /** A descriptive sentence has at most 25 words. */
10
+ export const STE_MAX_DESCRIPTION_WORDS = 25;
11
+ export const STE_MAX_SUMMARY_SENTENCES = 3;
12
+ /**
13
+ * Words a QA engineer should not have to decode, with the everyday word to use instead.
14
+ * The prompt lists them, the check sends them back, the eval counts them.
15
+ */
16
+ export const STE_BANNED = [
17
+ ['utilize', 'use'],
18
+ ['leverage', 'use'],
19
+ ['facilitate', 'help'],
20
+ ['implement', 'add'],
21
+ ['functionality', 'feature'],
22
+ ['robust', 'say what it survives'],
23
+ ['seamless', 'say what works'],
24
+ ['streamline', 'make shorter'],
25
+ ['refactor', 'restructure'],
26
+ ['plumbing', 'connect'],
27
+ ['wire up', 'connect'],
28
+ ['scaffold', 'add'],
29
+ ['under the hood', 'in the code'],
30
+ ['end-to-end', 'full'],
31
+ ['codepath', 'part of the code'],
32
+ ['code path', 'part of the code'],
33
+ ['orchestrate', 'run'],
34
+ ['delve', 'look'],
35
+ ['enhance', 'improve'],
36
+ ['prior to', 'before'],
37
+ ['in order to', 'to'],
38
+ ['approximately', 'about'],
39
+ ['commence', 'start'],
40
+ ['terminate', 'stop'],
41
+ ];
42
+ const BANNED_RE = STE_BANNED.map(([w]) => [new RegExp(`\\b${w.replace(/[-\s]/g, '[-\\s]')}(s|d|ed|es|ing)?\\b`, 'i'), w]);
43
+ /** Verbs a QA instruction starts with. A sentence that starts with one is an instruction. */
44
+ const INSTRUCTION_VERBS = new Set('add check click compare confirm create delete edit enter fill go install open paste press read remove rename review run save select set start stop test try type update upload use watch write'.split(' '));
45
+ /** Common irregular past participles; regular ones end in -ed. */
46
+ const IRREGULAR_PARTICIPLES = 'built broken brought bought caught chosen done drawn driven eaten fallen felt found forgotten given gone grown held hidden hit kept known laid led left lent let lost made meant met paid put read run said seen sent set shown shut sold spent split spread stolen struck taken taught thrown told understood won written';
47
+ /** Words that may sit between the be-verb and the participle: "is now shown", "was also removed". */
48
+ const PASSIVE_ADVERBS = '(?:\\w+ly|now|also|only|not|still|then|never|always|already)';
49
+ const PASSIVE_RE = new RegExp(`\\b(is|are|was|were|be|been|being|gets|got|get)\\s+(?:${PASSIVE_ADVERBS}\\s+)?(\\w{2,}ed|${IRREGULAR_PARTICIPLES.split(' ').join('|')})\\b`, 'i');
50
+ /** "-ed" words after a be-verb that are adjectives, not participles. */
51
+ const ED_ADJECTIVES = new Set('based needed used supposed tired interested related advanced detailed limited experienced concerned speed feed seed need started'.split(' '));
52
+ /**
53
+ * A file path or file name, such as src/review/render.ts or package.json. A slash pair such as
54
+ * "pass/fail" or "TCP/IP" is not a path: a path needs a file extension or three segments.
55
+ */
56
+ const FILE_EXT = '(?:tsx?|jsx?|mjs|cjs|css|scss|json|ya?ml|md|py|go|rs|java|kt|rb|php|cs|swift|sql|html|sh|toml|lock)';
57
+ const FILE_RE = new RegExp(`(?:[\\w.-]+/)+[\\w-]+\\.${FILE_EXT}\\b|[\\w.-]+/[\\w.-]+/[\\w.-]+|\\b[\\w-]+\\.${FILE_EXT}\\b`, 'gi');
58
+ /** Product names that look like file names. */
59
+ const NOT_FILES = /^(node|next|vue|nuxt|three|express|deno|chart|ember|backbone)\.js$/i;
60
+ export function steWords(s) {
61
+ return s.split(/\s+/).filter((w) => /[A-Za-z0-9]/.test(w)).length;
62
+ }
63
+ /** Sentences of a text. Splits on . ! ? followed by space and a capital, a digit or a quote. */
64
+ export function steSentences(text) {
65
+ return text
66
+ .split('\n')
67
+ .flatMap((line) => line.trim().split(/(?<=[.!?])\s+(?=[A-Z0-9"'(`])/))
68
+ .map((s) => s.trim())
69
+ .filter((s) => steWords(s) > 0);
70
+ }
71
+ export function isInstruction(sentence) {
72
+ const first = sentence
73
+ .replace(/^[^A-Za-z]+/, '')
74
+ .split(/\s+/)[0]
75
+ ?.toLowerCase() ?? '';
76
+ return INSTRUCTION_VERBS.has(first);
77
+ }
78
+ export function wordLimit(sentence) {
79
+ return isInstruction(sentence) ? STE_MAX_INSTRUCTION_WORDS : STE_MAX_DESCRIPTION_WORDS;
80
+ }
81
+ /** The passive phrase in a sentence, such as "was removed", or null. A heuristic: it misses some, and says so in the docs. */
82
+ export function passivePhrase(sentence) {
83
+ const m = PASSIVE_RE.exec(sentence);
84
+ if (!m)
85
+ return null;
86
+ if (ED_ADJECTIVES.has(m[2].toLowerCase()))
87
+ return null;
88
+ return m[0];
89
+ }
90
+ export function bannedWords(text) {
91
+ return BANNED_RE.filter(([re]) => re.test(text)).map(([, w]) => w);
92
+ }
93
+ export function mentionsFile(text) {
94
+ return [...text.matchAll(FILE_RE)].some((m) => !NOT_FILES.test(m[0]));
95
+ }
96
+ export function steCheck(text) {
97
+ const ss = steSentences(text);
98
+ const long = ss.filter((s) => steWords(s) > wordLimit(s));
99
+ const passive = ss.map(passivePhrase).filter((p) => !!p);
100
+ const banned = bannedWords(text);
101
+ const fileNames = mentionsFile(text);
102
+ return { sentences: ss.length, long, passive, banned, fileNames, ok: !long.length && !passive.length && !banned.length && !fileNames };
103
+ }
104
+ /** Errors a reviewer gets back for its changeSummary field. Passive voice stays a prompt rule: the heuristic is too loose to loop on. */
105
+ export function steErrors(label, text) {
106
+ const out = [];
107
+ const ss = steSentences(text);
108
+ if (ss.length < 2 || ss.length > STE_MAX_SUMMARY_SENTENCES)
109
+ out.push(`${label} has ${ss.length} sentences; write 2 or 3.`);
110
+ for (const s of ss) {
111
+ const n = steWords(s);
112
+ const max = wordLimit(s);
113
+ if (n > max)
114
+ out.push(`${label} has a sentence of ${n} words ("${s.slice(0, 48)}..."); use at most ${max}.`);
115
+ }
116
+ if (mentionsFile(text))
117
+ out.push(`${label} names a file; describe what the user sees instead.`);
118
+ const banned = bannedWords(text);
119
+ if (banned.length)
120
+ out.push(`${label} uses ${banned.map((w) => `"${w}"`).join(', ')}; use ${banned.map((w) => STE_BANNED.find(([b]) => b === w)?.[1]).join(', ')}.`);
121
+ return out;
122
+ }
123
+ /** The STE rule block for the QA review prompt. */
124
+ export function steRuleBlock() {
125
+ return `Change summary rules (ASD-STE100, Simplified Technical English). changeSummary is the first thing a QA engineer reads on the run page and the PR comment. Write it for a person who will not read the diff:
126
+ - Write 2 or 3 sentences. Say what the change does for a user, then what it changes in behavior.
127
+ - A descriptive sentence has at most ${STE_MAX_DESCRIPTION_WORDS} words. An instruction has at most ${STE_MAX_INSTRUCTION_WORDS} words and starts with the verb.
128
+ - Use the active voice. Name the actor: "The page now shows", not "is now shown".
129
+ - Use one word for one meaning, and the same word every time. Do not switch between "dot", "agent" and "bot".
130
+ - No file names, paths, function names, ids or line numbers. Name the screen, the flow or the setting.
131
+ - Use everyday words. Do not use: ${STE_BANNED.map(([w, use]) => `${w} (use "${use}")`).join(', ')}.`;
132
+ }
133
+ //# sourceMappingURL=ste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ste.js","sourceRoot":"","sources":["../../src/review/ste.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ // The file of a test case that ran in a Tests repo (KAT-86). The report of a run merges the cases of the app repo's own tests and of
2
+ // each Tests repo, and one file name can exist in both, so a case of a Tests repo names its file as `owner/name:path`, with the repo
3
+ // in lower case. Results, flaky keys, evidence, bug signatures and defect drafts all read that one name.
4
+ const PREFIXED = /^([A-Za-z0-9][A-Za-z0-9-]{0,38}\/[A-Za-z0-9._-]{1,100}):(.+)$/;
5
+ /** The file of a case that ran in the Tests repo `repo` ("owner/name"). */
6
+ export function testRepoFile(repo, path) {
7
+ return `${repo.toLowerCase()}:${path}`;
8
+ }
9
+ /** The repo and the path of a case file. A file with no `owner/name:` in front belongs to the app repo's own tests. */
10
+ export function splitTestRepoFile(file) {
11
+ const m = PREFIXED.exec(file);
12
+ return m ? { repo: m[1].toLowerCase(), path: m[2] } : { path: file };
13
+ }
14
+ /** True for a case file of a Tests repo. */
15
+ export function isTestRepoFile(file) {
16
+ return PREFIXED.test(file);
17
+ }
18
+ //# sourceMappingURL=test-repo-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-repo-file.js","sourceRoot":"","sources":["../../src/review/test-repo-file.ts"],"names":[],"mappings":"AAAA,qIAAqI;AACrI,qIAAqI;AACrI,yGAAyG;AAEzG,MAAM,QAAQ,GAAG,+DAA+D,CAAC;AAEjF,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY;IACrD,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACzE,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,53 @@
1
+ /** The tests that ran to the end: passed, failed and flaky. A skipped test did not run, so it is never counted here (KAT-402). */
2
+ export function testsRan(r) {
3
+ return r.passed + r.failed + r.flaky;
4
+ }
5
+ /** "53 were skipped (they do not apply to this project)." The one sentence for tests the run skipped (KAT-402). */
6
+ export function skippedSentence(n) {
7
+ return `${n} ${n === 1 ? 'was' : 'were'} skipped (${n === 1 ? 'it does' : 'they do'} not apply to this project).`;
8
+ }
9
+ const RULE_WORDS = {
10
+ directive: 'the PR description names it',
11
+ match_branch: 'the PR branch exists in the Tests repo',
12
+ fixed: "the dot's settings name it",
13
+ default: 'the default branch',
14
+ };
15
+ /** Why this ref ran, in a few words. */
16
+ export function refRuleWords(rule) {
17
+ return RULE_WORDS[rule];
18
+ }
19
+ /**
20
+ * One line for a person: "Ran 24 True Platform tests from true-dogfood-tests: 23 passed, 1 failed.", or why nothing ran. A skipped
21
+ * test did not run (KAT-402), so it stays out of "Ran" and gets its own sentence: "Ran 85 tests from e2e: 85 passed. 53 were
22
+ * skipped (they do not apply to this project)." A batch of skipped tests only says that all of them were skipped.
23
+ */
24
+ export function testRepoSentence(t) {
25
+ if (t.notRun)
26
+ return `${t.notRunOnPurpose ? `The Tests repo ${t.name} was skipped` : `The Tests repo ${t.name} could not be run`}: ${t.notRun.replace(/[.\s]+$/, '')}.`;
27
+ const total = t.passed + t.failed + t.flaky + t.skipped;
28
+ if (!total)
29
+ return `The Tests repo ${t.name} had no tests to run.`;
30
+ const ran = testsRan(t);
31
+ const what = `${t.label ? `${t.label} ` : ''}${total === 1 ? 'test' : 'tests'}`;
32
+ if (!ran)
33
+ return `${t.skipped === 1 ? `The ${what} from ${t.name} was` : `All ${t.skipped} ${what} from ${t.name} were`} skipped (${t.skipped === 1 ? 'it does' : 'they do'} not apply to this project).`;
34
+ const parts = [`${t.passed} passed`];
35
+ if (t.failed)
36
+ parts.push(`${t.failed} failed`);
37
+ if (t.flaky)
38
+ parts.push(`${t.flaky} passed on retry`);
39
+ const head = `Ran ${ran} ${t.label ? `${t.label} ` : ''}${ran === 1 ? 'test' : 'tests'} from ${t.name}: ${parts.join(', ')}.`;
40
+ return t.skipped ? `${head} ${skippedSentence(t.skipped)}` : head;
41
+ }
42
+ /** The developer detail of one Tests repo batch: the repo, the ref and commit, why that ref, the tests chosen, and the URL. */
43
+ export function testRepoDetail(t) {
44
+ if (!t.sha)
45
+ return `${t.repo}: ${t.notRun ?? 'not run'}`;
46
+ const parts = [`${t.repo} at ${t.ref} (${t.sha.slice(0, 7)}), because ${refRuleWords(t.refRule)}`, `tests: ${t.selection || 'the whole suite'}`];
47
+ if (t.baseUrl)
48
+ parts.push(`against ${t.baseUrl}`);
49
+ if (t.note)
50
+ parts.push(t.note.replace(/[.\s]+$/, ''));
51
+ return `${parts.join('; ')}.`;
52
+ }
53
+ //# sourceMappingURL=test-repo-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-repo-lines.js","sourceRoot":"","sources":["../../src/review/test-repo-lines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,232 @@
1
+ // Ticket review on demand (KAT-98): a person points the dot at a Jira, Linear, or GitHub issue,
2
+ // by URL or key, from chat or POST /api/dots/:id/review { ticket }. The dot reads the ticket
3
+ // through the connected tracker and runs the same ticket_review job the webhook and the poller
4
+ // queue, so the comment goes through the dot's rules (ask first by default).
5
+ import { list } from '../db.js';
6
+ import { jiraFor } from '../integrations/jira.js';
7
+ import { linearFor } from '../integrations/linear.js';
8
+ import { githubMode } from '../integrations/github.js';
9
+ import { bodyHash, issueApi, parseIssueRef, trackerRepos } from '../integrations/github-issues.js';
10
+ import { trackerProjectKeys } from '../ticket-keys.js';
11
+ import { enqueue } from '../queue.js';
12
+ import { dispatchTrigger } from '../webhooks.js';
13
+ const JIRA_URL = /\bhttps?:\/\/([a-z0-9.-]+)(?::\d+)?\/(?:browse\/|[^\s]*?[?&](?:selectedIssue|issueKey)=)([A-Z][A-Z0-9_]{0,19}-\d{1,9})\b[^\s)>\]]*/gi;
14
+ const LINEAR_URL = /\bhttps?:\/\/linear\.app\/[\w-]+\/issue\/([A-Z][A-Z0-9]{0,9}-\d{1,9})\b[^\s)>\]]*/gi;
15
+ const GITHUB_ISSUE_URL = /\bhttps?:\/\/github\.com\/([\w.-]+)\/([\w.-]+)\/issues\/(\d{1,9})\b[^\s)>\]]*/gi;
16
+ const BARE_KEY = /(?<![\w/-])([A-Z][A-Z0-9]{1,9}-\d{1,9})(?![\w-])/g;
17
+ const trackerKeys = trackerProjectKeys;
18
+ /**
19
+ * Every ticket a chat line or a request names, in order: Jira browse URLs, Linear issue URLs,
20
+ * GitHub issue URLs, and bare keys such as TAD-3 whose prefix is one of the dot's tracker keys.
21
+ * A bare key with another prefix is ignored, so "UTF-8" or "ES-2015" is not a ticket.
22
+ */
23
+ export function findTicketRefs(text, w) {
24
+ const out = [];
25
+ const seen = new Set();
26
+ const push = (r) => {
27
+ const id = `${r.tracker}:${r.key}`;
28
+ if (!seen.has(id)) {
29
+ seen.add(id);
30
+ out.push(r);
31
+ }
32
+ };
33
+ let rest = text;
34
+ for (const m of text.matchAll(LINEAR_URL)) {
35
+ push({ tracker: 'linear', key: m[1].toUpperCase(), url: m[0] });
36
+ rest = rest.replace(m[0], ' ');
37
+ }
38
+ for (const m of text.matchAll(GITHUB_ISSUE_URL)) {
39
+ push({ tracker: 'github', key: `${m[1]}/${m[2]}#${m[3]}`, url: m[0], owner: m[1], repo: m[2], number: Number(m[3]) });
40
+ rest = rest.replace(m[0], ' ');
41
+ }
42
+ for (const m of text.matchAll(JIRA_URL)) {
43
+ if (/(^|\.)(github\.com|linear\.app)$/i.test(m[1]))
44
+ continue;
45
+ let origin;
46
+ try {
47
+ origin = new URL(m[0]).origin;
48
+ }
49
+ catch {
50
+ /* matched text is not a URL */
51
+ }
52
+ push({ tracker: 'jira', key: m[2].toUpperCase(), url: m[0], ...(origin ? { origin } : {}) });
53
+ rest = rest.replace(m[0], ' ');
54
+ }
55
+ const keys = trackerKeys(w);
56
+ const kind = w?.tracker?.kind;
57
+ if (keys.length && (kind === 'jira' || kind === 'linear')) {
58
+ for (const m of rest.matchAll(BARE_KEY)) {
59
+ const key = m[1].toUpperCase();
60
+ if (keys.includes(key.split('-')[0]))
61
+ push({ tracker: kind, key });
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ /** Reads `ticket` from a request body or a tool input: a URL or a key. */
67
+ export function parseTicketInput(value, w) {
68
+ const raw = typeof value === 'string' ? value.trim() : '';
69
+ if (!raw)
70
+ return { ok: false, error: 'ticket must be a ticket URL or a key such as SHOP-12.' };
71
+ const found = findTicketRefs(raw, w);
72
+ if (found[0])
73
+ return { ok: true, ref: found[0] };
74
+ // owner/name#12, or #12 on a dot whose GitHub Issues tracker reads one repo.
75
+ const gh = parseIssueRef(raw);
76
+ if (gh)
77
+ return { ok: true, ref: { tracker: 'github', key: `${gh.full}#${gh.number}`, owner: gh.owner, repo: gh.name, number: gh.number } };
78
+ const hash = /^#(\d{1,9})$/.exec(raw);
79
+ const repos = w ? trackerRepos(w) : [];
80
+ if (hash && w?.tracker?.kind === 'github' && repos.length === 1) {
81
+ const [owner, repo] = repos[0].split('/');
82
+ return { ok: true, ref: { tracker: 'github', key: `${repos[0]}#${hash[1]}`, owner, repo, number: Number(hash[1]) } };
83
+ }
84
+ // A bare key the dot's tracker keys do not list: use the dot's tracker when it has one.
85
+ const key = /^([A-Za-z][A-Za-z0-9]{0,9}-\d{1,9})$/.exec(raw)?.[1]?.toUpperCase();
86
+ const kind = w?.tracker?.kind;
87
+ if (key && (kind === 'jira' || kind === 'linear'))
88
+ return { ok: true, ref: { tracker: kind, key } };
89
+ if (key)
90
+ return { ok: false, error: `${w?.name ?? 'This dot'} has no Jira or Linear tracker, so ${key} cannot be looked up. Send the full ticket URL.` };
91
+ return { ok: false, error: 'That is not a Jira, Linear, or GitHub issue URL or key.' };
92
+ }
93
+ const trimSlash = (s) => s.replace(/\/+$/, '');
94
+ /** Jira client for the ref, or why there is none. The URL's site must be the connected one. */
95
+ function jiraForRef(w, ref) {
96
+ const client = jiraFor(w);
97
+ if (client.mode !== 'live')
98
+ return { ok: false, error: 'Jira is not connected. Connect it on the Setup page (site URL, email, and API token), then ask again.' };
99
+ const base = trimSlash(client.baseUrl ?? '');
100
+ if (ref.origin && base && trimSlash(ref.origin).toLowerCase() !== new URL(base).origin.toLowerCase())
101
+ return { ok: false, error: `That ticket is on ${ref.origin}, but the connected Jira site is ${new URL(base).origin}.` };
102
+ return { ok: true, client };
103
+ }
104
+ /** Reads the ticket through the connected tracker. Errors say what is missing in words. */
105
+ export async function fetchTicketRef(w, ref) {
106
+ try {
107
+ if (ref.tracker === 'jira') {
108
+ const j = jiraForRef(w, ref);
109
+ if (!j.ok)
110
+ return { ok: false, code: 409, error: j.error };
111
+ return { ok: true, ticket: await j.client.getIssue(ref.key) };
112
+ }
113
+ if (ref.tracker === 'linear') {
114
+ const client = linearFor(w);
115
+ if (client.mode !== 'live')
116
+ return { ok: false, code: 409, error: 'Linear is not connected. Connect it on the Setup page (API key), then ask again.' };
117
+ return { ok: true, ticket: await client.getIssue(ref.key) };
118
+ }
119
+ // GitHub issues (KAT-87): read through the GitHub connection, from a repo the dot watches.
120
+ if (githubMode() === 'demo')
121
+ return { ok: false, code: 409, error: 'GitHub is not connected. Connect it on the Setup page, then ask again.' };
122
+ const full = `${ref.owner}/${ref.repo}`.toLowerCase();
123
+ const watched = new Set([...trackerRepos(w), ...(w.repo ? [`${w.repo.owner}/${w.repo.name}`.toLowerCase()] : [])]);
124
+ if (!watched.has(full))
125
+ return {
126
+ ok: false,
127
+ code: 409,
128
+ error: `${w.name} does not watch ${ref.owner}/${ref.repo}, so it cannot review that issue. Add the repo to the dot's GitHub Issues tracker.`,
129
+ };
130
+ return { ok: true, ticket: await issueApi(`${ref.owner}/${ref.repo}`).getIssue(ref.number) };
131
+ }
132
+ catch (err) {
133
+ const msg = err instanceof Error ? err.message : String(err);
134
+ if (/is a pull request, not an issue/.test(msg))
135
+ return { ok: false, code: 409, error: `${ref.key} is a pull request. Ask me to review the PR instead.` };
136
+ if (/HTTP 404|not found|Entity not found/i.test(msg))
137
+ return { ok: false, code: 404, error: `${ref.key} was not found, or the connected account cannot see it.` };
138
+ if (/HTTP 401|HTTP 403/i.test(msg))
139
+ return {
140
+ ok: false,
141
+ code: 502,
142
+ error: `The tracker refused to show ${ref.key} (${/HTTP (\d+)/.exec(msg)?.[1]}). Check the connection on the Setup page.`,
143
+ };
144
+ return { ok: false, code: 502, error: `Could not read ${ref.key}: ${msg.slice(0, 200)}` };
145
+ }
146
+ }
147
+ const stamp = () => `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`;
148
+ /** A queued or running ticket_review job of this dot for the same ticket. */
149
+ export function activeTicketReviewJob(watchId, tracker, key) {
150
+ return list('jobs', { watchId, kind: 'ticket_review', status: ['queued', 'running'] }).find((j) => {
151
+ const t = j.payload?.ticket;
152
+ return t?.tracker === tracker && t.key === key;
153
+ });
154
+ }
155
+ /**
156
+ * Queues a ticket review for the dot. Same job, flow, and rules gate as a new ticket from the
157
+ * webhook or the poller; a review of the same ticket still queued or running is returned instead.
158
+ */
159
+ export async function requestTicketReview(w, ref, opts) {
160
+ if (w.archived)
161
+ return { ok: false, code: 409, error: `${w.name} is archived.` };
162
+ if (w.paused)
163
+ return { ok: false, code: 409, error: `${w.name} is paused. Resume it to review.` };
164
+ const fetched = await fetchTicketRef(w, ref);
165
+ if (!fetched.ok)
166
+ return fetched;
167
+ const ticket = fetched.ticket;
168
+ const tracker = ticket.tracker;
169
+ const title = `${ticket.key}: ${ticket.title}`;
170
+ const active = activeTicketReviewJob(w.id, tracker, ticket.key);
171
+ if (active)
172
+ return { ok: true, duplicate: true, jobId: active.id, title, ticket };
173
+ const ev = {
174
+ source: tracker,
175
+ kind: 'ticket_created',
176
+ dedupeKey: `review:${tracker}:${ticket.key}:${stamp()}`,
177
+ title,
178
+ ticket: tracker === 'github'
179
+ ? { key: ticket.key, id: ticket.id, tracker, projectKey: ticket.key.split('#')[0], bodyHash: bodyHash(ticket.title, ticket.description) }
180
+ : { key: ticket.key, id: ticket.id, tracker, projectKey: ticket.key.split('-')[0] },
181
+ ...(tracker === 'github' ? { repo: { owner: ticket.key.split('/')[0], name: ticket.key.split('/')[1].split('#')[0] } } : {}),
182
+ inlineTicket: ticket,
183
+ requestedBy: opts.requestedBy,
184
+ ...(ticket.url ? { url: ticket.url } : {}),
185
+ };
186
+ const res = dispatchTrigger(ev, { watchIds: [w.id] });
187
+ const job = res.jobs[0];
188
+ if (!res.accepted || !job)
189
+ return { ok: false, code: 409, error: res.reason ?? 'The review was not queued.' };
190
+ return { ok: true, duplicate: false, jobId: job.jobId, title, ticket };
191
+ }
192
+ /** A queued or running test_design job of this dot for the same ticket. */
193
+ export function activeTestDesignJob(watchId, tracker, key) {
194
+ return list('jobs', { watchId, kind: 'test_design', status: ['queued', 'running'] }).find((j) => {
195
+ const t = j.payload?.ticket;
196
+ return t?.tracker === tracker && t.key === key;
197
+ });
198
+ }
199
+ /**
200
+ * Queues the test designer for a ticket the dot can read (chat tool design_tests). The job stores draft cases and
201
+ * posts nothing outward, so no approval is involved. A design of the same ticket still queued or running is
202
+ * returned instead of a second job.
203
+ */
204
+ export async function requestTestDesign(w, ref, opts) {
205
+ if (w.archived)
206
+ return { ok: false, code: 409, error: `${w.name} is archived.` };
207
+ if (w.paused)
208
+ return { ok: false, code: 409, error: `${w.name} is paused. Resume it to design tests.` };
209
+ const fetched = await fetchTicketRef(w, ref);
210
+ if (!fetched.ok)
211
+ return fetched;
212
+ const ticket = fetched.ticket;
213
+ const title = `${ticket.key}: ${ticket.title}`;
214
+ const active = activeTestDesignJob(w.id, ticket.tracker, ticket.key);
215
+ if (active)
216
+ return { ok: true, duplicate: true, jobId: active.id, title, ticket };
217
+ const ev = {
218
+ source: ticket.tracker,
219
+ kind: 'chat',
220
+ dedupeKey: `design:${ticket.tracker}:${ticket.key}:${stamp()}`,
221
+ title,
222
+ ticket: { key: ticket.key, id: ticket.id, tracker: ticket.tracker, projectKey: ticket.key.split(/[-#]/)[0] },
223
+ inlineTicket: ticket,
224
+ requestedBy: opts.requestedBy,
225
+ ...(ticket.url ? { url: ticket.url } : {}),
226
+ };
227
+ const jobId = enqueue({ kind: 'test_design', watchId: w.id, dedupeKey: ev.dedupeKey, payload: ev });
228
+ if (!jobId)
229
+ return { ok: false, code: 409, error: 'The test design was not queued.' };
230
+ return { ok: true, duplicate: false, jobId, title, ticket };
231
+ }
232
+ //# sourceMappingURL=ticket-on-demand.js.map