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,623 @@
1
+ // Defects for bugs the dot found (KAT-96). Each bug becomes one `file_defect` action in the dot's
2
+ // tracker (Jira, Linear, or GitHub issues on the repo), sent through the rules gate, so the
3
+ // default "ask" rule puts every draft in the Inbox. A bug is drafted once per PR: a later push finds
4
+ // the earlier draft or the filed issue by its bug key and links that instead of drafting again.
5
+ // Before it drafts, the dot looks for an open issue about the same bug (KAT-121). It then adds the new
6
+ // evidence as a comment on that issue (once per head sha, through the rules gate) and links it.
7
+ import { createHash } from 'node:crypto';
8
+ import { config } from '../config.js';
9
+ import { list } from '../db.js';
10
+ import { gate } from '../agent/rules.js';
11
+ import { issueRef, requiredLabel, trackerDefectLabel, trackerDefectType, trackerRepos } from '../integrations/github-issues.js';
12
+ import { githubFor, githubForIssues, isDefectLabel } from '../integrations/github.js';
13
+ import { jiraFor } from '../integrations/jira.js';
14
+ import { linearFor } from '../integrations/linear.js';
15
+ import { joinTeamDraft, sourcesOf, teamDraftFor } from '../lead-defects.js';
16
+ import { teamIds, teamTracker, trackerOwner } from '../lead.js';
17
+ import { linksFor } from '../links.js';
18
+ import { bugRepoAlts, bugRepoOf, parseRepoId, sameRepo as sameRepoRef } from '../repos.js';
19
+ import { bugSignature, bugSignatureAlts, NEEDS_MANUAL_STEPS_LABEL, prRefIn, READING_LABEL, foldsDefect, renderDefect, } from '../review/render.js';
20
+ import { caseDetail, caseForTest, caseMeta } from './mergeCases.js';
21
+ export const MAX_DEFECTS = 6;
22
+ function inboxUrl() {
23
+ const base = config.publicUrl;
24
+ return base ? `${base.replace(/\/$/, '')}/#/inbox` : undefined;
25
+ }
26
+ /**
27
+ * Where a defect will land, in words for the Inbox card and the PR report: `acme/shop` for a GitHub repo,
28
+ * `Jira SHOP` or `Linear KAT` for the others.
29
+ */
30
+ export function defectWhere(where) {
31
+ return where.tracker === 'github' ? where.project : `${where.tracker === 'jira' ? 'Jira' : 'Linear'} ${where.project}`;
32
+ }
33
+ /**
34
+ * Tracker and project for defects: the dot's tracker when it has one, else the repo's issues. A GitHub tracker that
35
+ * names its repos files in the first of them: a team that tracks bugs in one repo has Issues turned off or shared with
36
+ * other pods in its code repos (KAT-355). A bug found in a repo the tracker itself names stays there, because that repo
37
+ * has Issues on and the dot reads them. A GitHub tracker with no repos of its own tracks the dot's app repos, so a
38
+ * defect goes to the repo the bug was found in.
39
+ */
40
+ export function defectTarget(watch, repo) {
41
+ // A member with a lead and no tracker of its own files into the team's tracker (KAT-405): PR Reviewer and Regression Runner bugs go to
42
+ // katalon-studio/product with Ticket Reviewer's access. A member with its own tracker keeps it, and a dot with no lead files as before.
43
+ if (!watch.tracker) {
44
+ const team = teamTracker(watch.id);
45
+ if (team && team.id !== watch.id)
46
+ return defectTarget(team, repo);
47
+ }
48
+ const t = watch.tracker;
49
+ if (t?.kind === 'jira' && t.projectKeys[0])
50
+ return { tracker: 'jira', project: t.projectKeys[0], target: `jira:${t.projectKeys[0]}` };
51
+ if (t?.kind === 'linear' && t.teamKeys[0])
52
+ return { tracker: 'linear', project: t.teamKeys[0], target: `linear:${t.teamKeys[0]}`, ...(t.projectName ? { projectName: t.projectName } : {}) };
53
+ if (t?.kind === 'github' && t.repos?.some((x) => x.trim())) {
54
+ const repos = trackerRepos(watch);
55
+ const into = (repo && repos.find((r) => sameRepoRef(parseRepoId(r), repo))) || repos[0];
56
+ if (into)
57
+ return { tracker: 'github', project: into, target: `github:${into}` };
58
+ }
59
+ // The repo the bug was found in; a single-repo dot's `repo` when the caller names none.
60
+ const r = repo ?? watch.repo;
61
+ if (r) {
62
+ const full = `${r.owner}/${r.name}`;
63
+ return { tracker: 'github', project: full, target: `github:${full}` };
64
+ }
65
+ // A dot with no app repo but a GitHub tracker files into the first tracker repo.
66
+ const first = trackerRepos(watch)[0];
67
+ return first ? { tracker: 'github', project: first, target: `github:${first}` } : null;
68
+ }
69
+ /**
70
+ * The earlier draft or filed defect for this bug, from approvals and from runs that filed under "act". `sig` (bugSignature)
71
+ * finds it from any run, PR or merge; the bug key alone only finds it within one PR. A superseded or expired draft does
72
+ * not count: nobody decided on it.
73
+ */
74
+ export function priorDefect(watchId, key, sig) {
75
+ // A lead's members share what any of them drafted or filed (KAT-405): pass `teamIds(dot.id)`.
76
+ const ids = Array.isArray(watchId) ? watchId : [watchId];
77
+ // Every shape of the key and signature counts: a dot that gained or lost a repo keeps its defects (KAT-326).
78
+ const keys = (Array.isArray(key) ? key : [key]).map(String);
79
+ const sigs = (Array.isArray(sig) ? sig : sig ? [sig] : []).map(String);
80
+ // A merged draft also answers for the bug keys and signatures of its other sources.
81
+ const sameAction = (a) => a.kind === 'file_defect' && (keys.includes(String(a.meta?.bugKey)) || sigs.includes(String(a.meta?.bugSig)));
82
+ const same = (a) => sameAction(a.action) || (a.action.kind === 'file_defect' && sourcesOf(a).some((s) => keys.includes(s.bugKey) || (!!s.bugSig && sigs.includes(s.bugSig))));
83
+ const approvals = list('approvals', { watchId: ids }, { orderBy: 'createdAt DESC', limit: 500 }).filter(same);
84
+ for (const a of approvals) {
85
+ if (a.status === 'executed')
86
+ return { state: 'filed', url: strOrUndefined(a.action.meta?.filedUrl) };
87
+ if (a.status === 'pending' || a.status === 'approved')
88
+ return { state: 'drafted', url: inboxUrl(), ...whereOf(a.action) };
89
+ // A rejection holds for the PR it was made on. The same bug failing again on a later PR is drafted again (KAT-307). A draft closed by
90
+ // archiving a dot is no rejection: nobody said no to the bug (KAT-405).
91
+ if (a.status === 'rejected') {
92
+ if (a.action.meta?.closedBy === 'archive')
93
+ continue;
94
+ if (keys.includes(String(a.action.meta?.bugKey)) || sourcesOf(a).some((s) => keys.includes(s.bugKey)))
95
+ return { state: 'rejected' };
96
+ continue;
97
+ }
98
+ }
99
+ const runs = list('runs', { watchId: ids }, { orderBy: 'createdAt DESC', limit: 200 });
100
+ for (const r of runs) {
101
+ const hit = r.actions?.find((x) => sameAction(x.action) && x.result === 'executed');
102
+ if (hit)
103
+ return { state: 'filed', url: strOrUndefined(hit.action.meta?.filedUrl) };
104
+ }
105
+ return null;
106
+ }
107
+ const citeOf = (bug) => bug.source === 'review' && bug.ref?.file
108
+ ? { file: bug.ref.file, ...(bug.ref.line ? { line: bug.ref.line, lineEnd: bug.ref.lineEnd ?? bug.ref.line } : {}) }
109
+ : undefined;
110
+ /** The text of lines `from` to `to` of a file, hashed after trimming each line, so a re-indent is not a change. */
111
+ async function hashLines(readFile, c) {
112
+ if (!readFile || !c.line)
113
+ return undefined;
114
+ try {
115
+ const text = await readFile(c.file);
116
+ if (text === null)
117
+ return undefined;
118
+ const lines = text.split('\n').slice(c.line - 1, c.lineEnd ?? c.line);
119
+ return createHash('sha256')
120
+ .update(lines.map((l) => l.trim()).join('\n'))
121
+ .digest('hex')
122
+ .slice(0, 16);
123
+ }
124
+ catch {
125
+ return undefined;
126
+ }
127
+ }
128
+ /** Two cited ranges overlap. A range with no line numbers overlaps any range of the same file. */
129
+ function overlaps(a, b) {
130
+ if (!a.line || !b.line)
131
+ return true;
132
+ return a.line <= (b.lineEnd ?? b.line) && b.line <= (a.lineEnd ?? a.line);
133
+ }
134
+ /**
135
+ * A person rejected a review finding of this PR (any head, so also its merge) that cites the same file and an
136
+ * overlapping range. A finding read from the code is worded again on each run, so neither its key nor its signature
137
+ * matches. The rejection holds until the cited lines change: their text at the rejected head (a hash stored on the
138
+ * draft) is compared with their text at the current head. When either cannot be read, the rejection holds.
139
+ */
140
+ async function rejectedOnSameLines(watchId, bug, prNumber, readFile) {
141
+ const cite = citeOf(bug);
142
+ if (!cite || !prNumber)
143
+ return false;
144
+ const rejected = list('approvals', { watchId, status: 'rejected' }, { orderBy: 'createdAt DESC', limit: 300 }).filter((a) => a.action.kind === 'file_defect' && a.action.meta?.bugSource === 'review' && a.action.meta?.pr === prNumber);
145
+ for (const a of rejected) {
146
+ const was = a.action.meta?.cite;
147
+ if (!was || was.file !== cite.file || !overlaps(was, cite))
148
+ continue;
149
+ if (was.hash) {
150
+ const now = await hashLines(readFile, was);
151
+ if (now && now !== was.hash)
152
+ continue;
153
+ }
154
+ return true;
155
+ }
156
+ return false;
157
+ }
158
+ /** The key of the issue an earlier run filed for this signature, so new evidence goes on it. */
159
+ function filedKeyFor(watchId, sig) {
160
+ const sigs = (Array.isArray(sig) ? sig : [sig]).map(String);
161
+ const hit = (a) => a.kind === 'file_defect' && sigs.includes(String(a.meta?.bugSig)) && typeof a.meta?.filedKey === 'string' && a.meta.filedKey
162
+ ? { key: String(a.meta.filedKey), ...(strOrUndefined(a.meta.filedUrl) ? { url: strOrUndefined(a.meta.filedUrl) } : {}) }
163
+ : null;
164
+ for (const a of list('approvals', { watchId, status: 'executed' }, { orderBy: 'createdAt DESC', limit: 300 })) {
165
+ const k = hit(a.action);
166
+ if (k)
167
+ return k;
168
+ }
169
+ for (const r of list('runs', { watchId }, { orderBy: 'createdAt DESC', limit: 200 }))
170
+ for (const x of r.actions ?? []) {
171
+ const k = x.result === 'executed' ? hit(x.action) : null;
172
+ if (k)
173
+ return k;
174
+ }
175
+ return null;
176
+ }
177
+ function strOrUndefined(v) {
178
+ return typeof v === 'string' && v ? v : undefined;
179
+ }
180
+ /** `{ where }` for a draft's link: the repo or project its meta says it will be filed in, or nothing for an older draft. */
181
+ function whereOf(action) {
182
+ const tracker = action.meta?.tracker;
183
+ const project = strOrUndefined(action.meta?.project);
184
+ if (!project || (tracker !== 'github' && tracker !== 'jira' && tracker !== 'linear'))
185
+ return {};
186
+ return { where: defectWhere({ tracker, project }) };
187
+ }
188
+ /** Below this word-set overlap two titles are not the same bug. */
189
+ export const TITLE_SIMILARITY = 0.6;
190
+ /** Lowercase word set of a title, without the "Bug:" prefix every filed defect starts with. */
191
+ function titleWords(title) {
192
+ return new Set(title
193
+ .toLowerCase()
194
+ .replace(/^\s*bug\s*:/, '')
195
+ .split(/[^a-z0-9]+/)
196
+ .filter(Boolean));
197
+ }
198
+ /** Jaccard similarity of the normalized word sets of two titles, 0 to 1. */
199
+ export function titleSimilarity(a, b) {
200
+ const x = titleWords(a);
201
+ const y = titleWords(b);
202
+ if (!x.size || !y.size)
203
+ return 0;
204
+ let both = 0;
205
+ for (const w of x)
206
+ if (y.has(w))
207
+ both++;
208
+ return both / (x.size + y.size - both);
209
+ }
210
+ function decoded(text) {
211
+ try {
212
+ return decodeURIComponent(text);
213
+ }
214
+ catch {
215
+ return text;
216
+ }
217
+ }
218
+ const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
219
+ /** The issue text mentions this pull request ("PR #4", "pull request #4", or a /pull/4 link). */
220
+ function mentionsPr(text, pr) {
221
+ if (!pr)
222
+ return false;
223
+ // "PR #4", or "PR owner/name#4" in a defect filed in another repo than the PR's.
224
+ return new RegExp(`(?:\\bPR|pull request)\\s*(?:[\\w.-]+/[\\w.-]+)?#${pr}\\b|/pull/${pr}\\b`, 'i').test(text);
225
+ }
226
+ /** Directory names and words that look like `owner/name` but are paths or prose, not repositories. */
227
+ const NOT_AN_OWNER = new Set([
228
+ 'src',
229
+ 'lib',
230
+ 'test',
231
+ 'tests',
232
+ 'spec',
233
+ 'e2e',
234
+ 'docs',
235
+ 'doc',
236
+ 'app',
237
+ 'apps',
238
+ 'packages',
239
+ 'client',
240
+ 'server',
241
+ 'dist',
242
+ 'build',
243
+ 'public',
244
+ 'scripts',
245
+ 'config',
246
+ 'components',
247
+ 'utils',
248
+ 'node_modules',
249
+ 'and',
250
+ 'or',
251
+ 'pass',
252
+ 'input',
253
+ 'output',
254
+ 'read',
255
+ 'write',
256
+ 'yes',
257
+ 'on',
258
+ 'true',
259
+ 'ci',
260
+ 'tcp',
261
+ 'w',
262
+ 'n',
263
+ 'i',
264
+ 'up',
265
+ 'start',
266
+ 'add',
267
+ 'enable',
268
+ 'create',
269
+ 'get',
270
+ 'before',
271
+ 'open',
272
+ 'show',
273
+ 'login',
274
+ 'http',
275
+ 'https',
276
+ 'application',
277
+ 'text',
278
+ 'image',
279
+ 'audio',
280
+ 'video',
281
+ ]);
282
+ const FILE_EXT = /\.(?:[cm]?[jt]sx?|json|md|ya?ml|html?|css|scss|py|rb|go|rs|java|kt|swift|sh|txt|log|png|jpe?g|gif|svg|lock|toml|xml|sql)$/i;
283
+ /**
284
+ * The repositories an issue explicitly names, lowercase `owner/name`: a github.com/owner/name link, or a plain
285
+ * `owner/name` token that is not part of a longer path (`src/cart/discount.ts`), not a file (`docs/README.md`),
286
+ * and not a common directory or slash word (`and/or`).
287
+ */
288
+ export function namedRepos(text) {
289
+ const found = new Set();
290
+ const add = (owner, name) => {
291
+ const n = name.replace(/\.git$/i, '').replace(/\.+$/, '');
292
+ if (owner && n)
293
+ found.add(`${owner}/${n}`.toLowerCase());
294
+ };
295
+ for (const m of text.matchAll(/github\.com\/([A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)\/([\w.-]+)/gi))
296
+ add(m[1], m[2]);
297
+ for (const m of text.matchAll(/(?<![\w./:@-])([A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)\/([\w.-]*[A-Za-z0-9])/g)) {
298
+ const [whole, owner, name] = [m[0], m[1], m[2]];
299
+ if (text[(m.index ?? 0) + whole.length] === '/')
300
+ continue; // part of a longer path
301
+ if (!/[a-z]/i.test(owner) || !/[a-z]/i.test(name))
302
+ continue;
303
+ if (NOT_AN_OWNER.has(owner.toLowerCase()) || FILE_EXT.test(name))
304
+ continue;
305
+ add(owner, name);
306
+ }
307
+ return found;
308
+ }
309
+ /** The code or test the bug points at: file path and, for code, the line. */
310
+ function bugCite(bug) {
311
+ if (bug.test?.file)
312
+ return { file: bug.test.file };
313
+ if (bug.ref?.file && bug.ref.file !== 'PR_BODY')
314
+ return { file: bug.ref.file, ...(bug.ref.line ? { line: bug.ref.line } : {}) };
315
+ return null;
316
+ }
317
+ /** The issue cites `file:line` or `file#Lline` (also the link text `base:line` a filed defect shows). */
318
+ function citesFileLine(text, file, line) {
319
+ const base = file.split('/').pop() ?? file;
320
+ return new RegExp(`(?:${escapeRe(file)}|${escapeRe(base)})(?::|#L)${line}\\b`, 'i').test(text);
321
+ }
322
+ /**
323
+ * The open defect that is the same bug, or null. Pure: the tracker clients only list issues, this one
324
+ * function decides for Linear, Jira, and GitHub. An issue is in scope when it names this PR, names
325
+ * this repo, carries the localdost label, or lives in the repo's own GitHub issues. An issue that explicitly names a
326
+ * different repo (`owner/name` or a github.com link) and not this one is never in scope, whatever its label. In scope, it matches when
327
+ * - its title has a Jaccard word overlap of at least 0.6 with the new title, or
328
+ * - it cites the same file and line as the bug, or
329
+ * - it cites the same file path and names this PR (the line moves between pushes).
330
+ */
331
+ export function pickOpenDefect(bug, rendered, open, o = {}) {
332
+ const cite = bugCite(bug);
333
+ const repoName = o.repo ? `${o.repo.owner}/${o.repo.name}`.toLowerCase() : '';
334
+ let best = null;
335
+ for (const issue of open) {
336
+ const text = decoded(`${issue.title}\n${issue.body}`);
337
+ // Two repos can share one tracker project: an issue that names only another repo is not this PR's.
338
+ if (repoName && !text.toLowerCase().includes(repoName)) {
339
+ const named = namedRepos(text);
340
+ if (named.size && !named.has(repoName))
341
+ continue;
342
+ }
343
+ // The signature names this bug whatever PR or merge filed it.
344
+ if (o.sig && text.includes(o.sig)) {
345
+ if (!best || best.score < 2)
346
+ best = { issue, score: 2 };
347
+ continue;
348
+ }
349
+ const samePr = mentionsPr(text, o.prNumber);
350
+ const sameRepo = o.githubIssues === true || (!!repoName && text.toLowerCase().includes(repoName)) || issue.labels.some(isDefectLabel);
351
+ if (!samePr && !sameRepo)
352
+ continue;
353
+ const sim = titleSimilarity(issue.title, rendered.title);
354
+ const sameLine = !!cite?.line && citesFileLine(text, cite.file, cite.line);
355
+ const sameFileAndPr = !!cite && samePr && text.toLowerCase().includes(cite.file.toLowerCase());
356
+ if (sim < TITLE_SIMILARITY && !sameLine && !sameFileAndPr)
357
+ continue;
358
+ // The closest title wins; a file and line citation counts as a full match.
359
+ const score = Math.max(sim, sameLine ? 1 : 0, sameFileAndPr ? TITLE_SIMILARITY : 0);
360
+ if (!best || score > best.score)
361
+ best = { issue, score };
362
+ }
363
+ return best?.issue ?? null;
364
+ }
365
+ /** The dot's tracker as an OpenDefectSource; null in demo mode. Linear also searches all open issues by term. */
366
+ export function trackerDefectSource(watch, repo) {
367
+ const where = defectTarget(watch, repo);
368
+ if (!where)
369
+ return null;
370
+ if (where.tracker === 'jira') {
371
+ const c = jiraFor(trackerOwner(watch));
372
+ return c.mode === 'demo' ? null : { list: () => c.listOpenDefects(where.project), githubIssues: false };
373
+ }
374
+ if (where.tracker === 'linear') {
375
+ const c = linearFor(trackerOwner(watch));
376
+ if (c.mode === 'demo')
377
+ return null;
378
+ const search = c.searchOpenDefects?.bind(c);
379
+ return {
380
+ list: () => c.listOpenDefects(where.project, where.projectName),
381
+ ...(search ? { search: (term) => search(where.project, term, where.projectName) } : {}),
382
+ githubIssues: false,
383
+ };
384
+ }
385
+ // Duplicates are looked up where the draft will be filed: the repo the change is in, or the tracker repo when the
386
+ // dot files elsewhere (KAT-355). The tracker repo may be none of the dot's own repos.
387
+ const into = parseRepoId(where.project);
388
+ const c = into && !sameRepoRef(into, repo ?? watch.repo) ? githubForIssues(watch, where.project) : githubFor(watch, repo ? { repo } : undefined);
389
+ return c.mode === 'demo' ? null : { list: () => c.listOpenDefects(), githubIssues: true };
390
+ }
391
+ /** Open defects of the dot's tracker project; null in demo mode and on any API error (the caller drafts as before). */
392
+ async function openDefectsFor(watch, repo, source) {
393
+ const src = source === undefined ? trackerDefectSource(watch, repo) : source;
394
+ if (!src)
395
+ return null;
396
+ try {
397
+ return { open: await src.list(), githubIssues: src.githubIssues };
398
+ }
399
+ catch (err) {
400
+ console.warn(`[defects] could not list open defects: ${err.message}`);
401
+ return null;
402
+ }
403
+ }
404
+ /** Tracker search for one bug: its signature, then its title. Issues older than the listed 100 are found this way. */
405
+ async function searchFor(src, bug, sig) {
406
+ if (!src?.search)
407
+ return [];
408
+ const out = new Map();
409
+ for (const term of [sig, bug.title.replace(/["\\]/g, ' ').slice(0, 120)]) {
410
+ try {
411
+ for (const i of await src.search(term))
412
+ out.set(i.key, i);
413
+ }
414
+ catch (err) {
415
+ console.warn(`[defects] tracker search failed: ${err.message}`);
416
+ }
417
+ }
418
+ return [...out.values()];
419
+ }
420
+ /**
421
+ * The single choke point that finds an open issue for a bug about to be drafted, for every tracker.
422
+ * `open` lets a caller that checks several bugs read the tracker once.
423
+ */
424
+ export async function matchOpenDefect(watch, bug, rendered, o = {}, open) {
425
+ const found = open === undefined ? await openDefectsFor(watch, o.repo) : open;
426
+ return found ? pickOpenDefect(bug, rendered, found.open, { ...o, githubIssues: found.githubIssues }) : null;
427
+ }
428
+ /** A person or an earlier run already handled new evidence for this issue at this head (any draft counts, even a rejected one). */
429
+ export function evidenceHandled(watchId, issueKey, head) {
430
+ const same = (a) => a.kind === 'ticket_comment' && a.meta?.defectComment === true && a.meta?.defectIssue === issueKey && (a.meta?.head ?? '') === head;
431
+ const approvals = list('approvals', { watchId }, { orderBy: 'createdAt DESC', limit: 500 });
432
+ if (approvals.some((a) => same(a.action) && ['pending', 'approved', 'executed', 'rejected'].includes(a.status)))
433
+ return true;
434
+ const runs = list('runs', { watchId }, { orderBy: 'createdAt DESC', limit: 200 });
435
+ return runs.some((r) => r.actions?.some((x) => same(x.action) && x.result === 'executed'));
436
+ }
437
+ /** The comment for an existing issue: the new evidence, minus the intro line a fresh ticket opens with. */
438
+ function evidenceComment(rendered, o) {
439
+ // The commit is in the For developers fold below; the line a tester reads names the PR only.
440
+ const intro = `localdost found this bug again${o.prNumber ? ` while testing PR ${prRefIn(o.prNumber, o.repo, o.filedIn)}` : ''}. New evidence:`;
441
+ const rest = rendered.body.split('\n\n').slice(1).join('\n\n').trim();
442
+ return rest ? `${intro}\n\n${rest}` : intro;
443
+ }
444
+ /** The requirement refs the PR links in the rows of the team, lower case: its closing keywords and ticket keys. Reads no network. */
445
+ function prTicketRefs(team, o) {
446
+ if (!o.prNumber || !o.repo)
447
+ return [];
448
+ const pr = issueRef(`${o.repo.owner}/${o.repo.name}`, o.prNumber);
449
+ const out = new Set();
450
+ for (const id of team)
451
+ for (const l of linksFor(pr, id))
452
+ if (l.fromRef === pr && (l.kind === 'closes' || l.kind === 'references'))
453
+ out.add(l.toRef);
454
+ return [...out];
455
+ }
456
+ /** Drafts (or links) one defect per bug and returns the links for the comment. */
457
+ export async function draftDefects(watch, runId, bugs, o) {
458
+ const where = defectTarget(watch, o.repo);
459
+ const links = {};
460
+ if (!where)
461
+ return links;
462
+ const place = defectWhere(where);
463
+ // A defect filed in another repo than the code names that repo and the PR, so the PR timeline links back to it.
464
+ const away = where.tracker === 'github' && !!o.repo && !sameRepoRef(parseRepoId(where.project), o.repo);
465
+ const required = requiredLabel(watch);
466
+ const src = o.source === undefined ? trackerDefectSource(watch, o.repo) : o.source;
467
+ let open;
468
+ for (const bug of bugs.slice(0, MAX_DEFECTS)) {
469
+ const bugRepo = bug.repo ?? bugRepoOf(watch, o.repo);
470
+ const sig = bugSignature({ ...bug, ...(bugRepo ? { repo: bugRepo } : {}) });
471
+ // The other repo shapes of the key and signature (KAT-326): a repo added or removed must not hide an earlier defect.
472
+ const keys = [bug.key, ...(bug.altKeys ?? [])];
473
+ const sigs = [sig, ...bugSignatureAlts(bug, bugRepoAlts(watch, o.repo))];
474
+ const mapped = caseForTest(o.cases, bug.test?.file);
475
+ // The same body the new draft would get, so a comment of new evidence reads like the issue it lands on: the linked case's
476
+ // steps, and the For developers fold only where the tracker shows one (GitHub, Jira), never as raw tags.
477
+ const d = renderDefect(bug, {
478
+ ...o,
479
+ ...(where.tracker === 'github' ? { filedIn: where.project } : {}),
480
+ ...(mapped ? { testCase: caseDetail(watch.id, mapped) } : {}),
481
+ collapse: foldsDefect(where.tracker),
482
+ });
483
+ // A dot in a team shares what its members drafted, rejected and filed (KAT-405); a dot with no lead reads its own rows only.
484
+ const team = teamIds(watch.id);
485
+ // 1. This PR already drafted or filed it: link that.
486
+ const samePr = priorDefect(watch.id, keys);
487
+ if (samePr) {
488
+ links[bug.key] = samePr;
489
+ continue;
490
+ }
491
+ // 2. Another run, PR or merge drafted it, or a person rejected it: no second draft (dogfood ledger).
492
+ const elsewhere = priorDefect(watch.id, keys, sigs);
493
+ if (elsewhere && elsewhere.state !== 'filed') {
494
+ links[bug.key] = elsewhere;
495
+ continue;
496
+ }
497
+ // 2b. Another member of the team has the same bug waiting in its Inbox: this member joins that draft and drafts nothing (KAT-405).
498
+ const testTitle = bug.test?.title ?? bug.title;
499
+ const teamRefs = team.length > 1 ? prTicketRefs(team, o) : [];
500
+ const sibling = team.length > 1 ? teamDraftFor(watch, { sigs: [], bugSigs: sigs, testTitle, relates: teamRefs }) : null;
501
+ if (sibling) {
502
+ joinTeamDraft(sibling, watch, {
503
+ runId,
504
+ bugKey: bug.key,
505
+ bugSig: sig,
506
+ ...(o.prNumber ? { pr: o.prNumber } : {}),
507
+ ...(o.head ? { head: o.head } : {}),
508
+ ...(o.task ? { task: o.task } : {}),
509
+ runLink: o.runUrl ?? `run ${runId}`,
510
+ inboxLink: inboxUrl() ?? '#/inbox',
511
+ });
512
+ links[bug.key] = { state: 'drafted', url: inboxUrl(), where: place };
513
+ continue;
514
+ }
515
+ // A person's no counts for every member: a rejected draft of a sibling, or a merged draft that named this bug among its sources.
516
+ if (team.length > 1) {
517
+ const theirs = priorDefect(team, keys, sigs);
518
+ if (theirs?.state === 'rejected') {
519
+ links[bug.key] = theirs;
520
+ continue;
521
+ }
522
+ }
523
+ // 3. An issue filed earlier for this signature, or an open tracker issue about it, takes the new evidence.
524
+ const filed = filedKeyFor(team, sigs);
525
+ // Read the tracker once per call, and only when a bug has no draft or issue of its own yet.
526
+ if (open === undefined)
527
+ open = await openDefectsFor(watch, o.repo, src);
528
+ const searched = await searchFor(src, bug, sig);
529
+ const pool = open || searched.length ? { open: [...(open?.open ?? []), ...searched], githubIssues: open?.githubIssues ?? src?.githubIssues ?? false } : null;
530
+ const listed = await matchOpenDefect(watch, bug, d, { prNumber: o.prNumber, repo: o.repo, sig }, pool);
531
+ // The tracker lists only open issues, so a filed issue it no longer shows was closed: a regression drafts anew.
532
+ // When the tracker cannot be read, the issue filed for this signature is the best guess.
533
+ const match = listed ?? (filed && !pool ? { key: filed.key, title: d.title, body: '', labels: [], ...(filed.url ? { url: filed.url } : {}) } : null);
534
+ if (match) {
535
+ links[bug.key] = { state: 'filed', ...(match.url ? { url: match.url } : {}) };
536
+ const head = o.head ?? '';
537
+ if (!evidenceHandled(watch.id, match.key, head)) {
538
+ await gate({
539
+ kind: 'ticket_comment',
540
+ target: `${where.tracker}:${match.key}`,
541
+ title: `New evidence for ${match.key}`,
542
+ body: evidenceComment(d, { ...o, ...(where.tracker === 'github' ? { filedIn: where.project } : {}) }),
543
+ meta: {
544
+ tracker: where.tracker,
545
+ key: match.key,
546
+ ...(match.id ? { ticketId: match.id } : {}),
547
+ ...(match.url ? { url: match.url } : {}),
548
+ defectComment: true,
549
+ defectIssue: match.key,
550
+ bugKey: bug.key,
551
+ bugSig: sig,
552
+ head,
553
+ ...(o.prNumber ? { pr: o.prNumber } : {}),
554
+ ...(o.repo ? { repo: `${o.repo.owner}/${o.repo.name}` } : {}),
555
+ },
556
+ }, watch, runId);
557
+ }
558
+ continue;
559
+ }
560
+ // 4. A person rejected a finding of this PR that cites the same lines: the new wording is not a new finding (KAT-312).
561
+ if (await rejectedOnSameLines(watch.id, bug, o.prNumber, o.readFile)) {
562
+ links[bug.key] = { state: 'rejected' };
563
+ continue;
564
+ }
565
+ const cite = citeOf(bug);
566
+ const citeHash = cite ? await hashLines(o.readFile, cite) : undefined;
567
+ const codeRepo = o.repo ? `${o.repo.owner}/${o.repo.name}` : '';
568
+ const relates = away && codeRepo ? [o.prNumber ? `Relates to ${prRefIn(o.prNumber, o.repo, where.project)}` : `Found in ${codeRepo}`] : [];
569
+ const full = renderDefect(bug, {
570
+ ...o,
571
+ ...(where.tracker === 'github' ? { filedIn: where.project } : {}),
572
+ ...(mapped ? { testCase: caseDetail(watch.id, mapped) } : {}),
573
+ relates,
574
+ signature: sig,
575
+ collapse: foldsDefect(where.tracker),
576
+ });
577
+ // A tracker that requires a label classes an untyped issue that carries it as a requirement, so a defect there says
578
+ // it is one: the defect label and type. The required label goes on every defect, so the team's board picks it up;
579
+ // a bug found by reading adds its own.
580
+ const labels = [
581
+ ...(bug.foundByReading ? [READING_LABEL] : []),
582
+ ...(full.needsManualSteps ? [NEEDS_MANUAL_STEPS_LABEL] : []),
583
+ ...(required ? [trackerDefectLabel(watch), required] : []),
584
+ ].filter((l, k, all) => all.findIndex((x) => x.toLowerCase() === l.toLowerCase()) === k);
585
+ const action = {
586
+ kind: 'file_defect',
587
+ target: where.target,
588
+ title: d.title,
589
+ body: full.body,
590
+ meta: {
591
+ tracker: where.tracker,
592
+ project: where.project,
593
+ ...(where.projectName ? { projectName: where.projectName } : {}),
594
+ bugKey: bug.key,
595
+ bugSig: sig,
596
+ bugSource: bug.source,
597
+ // The failing test, so a member of the team that finds the same test with another signature can join this draft (KAT-405).
598
+ testTitle,
599
+ ...(teamRefs.length ? { relates: teamRefs } : {}),
600
+ ...caseMeta(mapped),
601
+ ...(cite ? { cite: { ...cite, ...(citeHash ? { hash: citeHash } : {}) } } : {}),
602
+ ...(o.prNumber ? { pr: o.prNumber } : {}),
603
+ // The PR head the defect was found at: a newer head supersedes the draft (dogfood ledger).
604
+ ...(o.head ? { head: o.head } : {}),
605
+ ...(o.repo ? { repo: `${o.repo.owner}/${o.repo.name}` } : {}),
606
+ severity: bug.severity,
607
+ // A bug found by reading the code is labelled so in the tracker and the Inbox card, with lower confidence.
608
+ ...(bug.foundByReading ? { foundBy: 'reading', confidence: 'lower' } : {}),
609
+ ...(labels.length ? { labels } : {}),
610
+ ...(required ? { issueType: trackerDefectType(watch) } : {}),
611
+ // A person pressed Draft defect (chat triage): the act_when_asked rule counts it as asked.
612
+ ...(o.askedBy ? { askedBy: o.askedBy } : {}),
613
+ },
614
+ };
615
+ const result = await gate(action, watch, runId);
616
+ if (result === 'executed')
617
+ links[bug.key] = { state: 'filed', url: strOrUndefined(action.meta?.filedUrl) };
618
+ else if (result === 'pending_approval' || result === 'handed_off')
619
+ links[bug.key] = { state: 'drafted', url: inboxUrl(), where: place };
620
+ }
621
+ return links;
622
+ }
623
+ //# sourceMappingURL=defects.js.map