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,249 @@
1
+ // ticket_review: score the ticket, search code by keywords, review it like QA in refinement.
2
+ import { getLlmFor } from '../agent/llm.js';
3
+ import { runStage } from '../stages/index.js';
4
+ import { listMemory } from '../agent/memory.js';
5
+ import { gate } from '../agent/rules.js';
6
+ import { addStep, finishRun, setDesigned, setImpact, setTicketFacts, setVerdict, startRun } from '../agent/runs.js';
7
+ import { githubFor, githubMode } from '../integrations/github.js';
8
+ import { issueApi, parseIssueRef } from '../integrations/github-issues.js';
9
+ import { recordIssueTimeline } from '../links.js';
10
+ import { jiraFor } from '../integrations/jira.js';
11
+ import { linearFor } from '../integrations/linear.js';
12
+ import { registerHandler } from '../queue.js';
13
+ import { backfillLimitOf } from '../monitor/backfill.js';
14
+ import { eventOf, guarded, loadWatch, renderTicketComment, noteModelFallback } from './common.js';
15
+ import { watchRepos } from '../repos.js';
16
+ import { designTestCases, designedDetail } from './testDesign.js';
17
+ import { checkExistingTests, recordImpactSteps } from './impact.js';
18
+ import { contextNote, contextStepDetail, hasContext, readTicketContext, scrubDiscussionEcho } from './ticketContext.js';
19
+ import { lastReview, settleAnswered } from './answers.js';
20
+ export const SCORE_FLOOR = 30;
21
+ const STOP = new Set([
22
+ 'the',
23
+ 'and',
24
+ 'for',
25
+ 'with',
26
+ 'from',
27
+ 'that',
28
+ 'this',
29
+ 'when',
30
+ 'should',
31
+ 'into',
32
+ 'onto',
33
+ 'top',
34
+ 'add',
35
+ 'apply',
36
+ 'make',
37
+ 'allow',
38
+ 'user',
39
+ 'users',
40
+ 'able',
41
+ 'can',
42
+ 'new',
43
+ 'use',
44
+ ]);
45
+ export function keywords(t, max = 3) {
46
+ const words = `${t.title} ${t.labels?.join(' ') ?? ''}`
47
+ .toLowerCase()
48
+ .split(/[^a-z0-9]+/)
49
+ .filter((w) => w.length > 3 && !STOP.has(w));
50
+ return [...new Set(words)].slice(0, max);
51
+ }
52
+ async function fetchTicket(watch, key, id, tracker) {
53
+ if (tracker === 'github') {
54
+ const ref = parseIssueRef(key);
55
+ if (!ref)
56
+ throw new Error(`not a GitHub issue key: ${key}`);
57
+ return issueApi(ref.full).getIssue(ref.number);
58
+ }
59
+ return tracker === 'linear' ? linearFor(watch).getIssue(id || key) : jiraFor(watch).getIssue(key);
60
+ }
61
+ registerHandler('ticket_review', async (job) => {
62
+ const watch = loadWatch(job.watchId);
63
+ if (watch.paused)
64
+ return;
65
+ const ev = eventOf(job);
66
+ // A backfilled review that waited in the queue while the backfill was turned off (limit 0) is dropped, so it spends no model call.
67
+ if (ev.backfill === true && !ev.requestedBy && backfillLimitOf(watch) === 0)
68
+ return;
69
+ const run = startRun(watch.id, 'ticket_review', ev);
70
+ await guarded(run.id, async () => {
71
+ const ref = ev.ticket;
72
+ const ticket = ev.inlineTicket ?? (ref ? await fetchTicket(watch, ref.key, ref.id, ref.tracker) : undefined);
73
+ if (!ticket)
74
+ throw new Error('event has no ticket reference');
75
+ addStep(run.id, 'Read the ticket', `${ticket.key}: ${ticket.title}`);
76
+ setTicketFacts(run.id, { hasAcceptanceCriteria: Boolean(ticket.acceptanceCriteria?.trim()) });
77
+ if (ev.ticket?.change?.field === 'command')
78
+ addStep(run.id, 'Review requested', `/localdost review by ${ev.ticket.change.value || 'a maintainer'}`, 'info');
79
+ // KAT-393: a person answered under the ticket. This review is the second look: it says which questions of the last one are answered now.
80
+ const answered = ev.ticket?.change?.field === 'answer' ? ev.answers : undefined;
81
+ if (answered && ticket.state === 'closed') {
82
+ addStep(run.id, 'The ticket is closed', `${ticket.key} was closed before this review started, so it is not reviewed again.`, 'info');
83
+ setVerdict(run.id, {
84
+ outcome: 'info',
85
+ headline: `${ticket.key} was closed, so it is not reviewed again`,
86
+ summary: `${ticket.key} was closed after someone answered under it, so localdost did not review it again.`,
87
+ risk: 'low',
88
+ findings: [],
89
+ openQuestions: [],
90
+ testIdeas: [],
91
+ testsAtRisk: [],
92
+ confidence: 0.9,
93
+ });
94
+ finishRun(run.id, 'done', null);
95
+ return;
96
+ }
97
+ const before = answered ? lastReview(watch.id, ticket.key, run.id) : undefined;
98
+ const asked = before?.verdict?.openQuestions ?? [];
99
+ if (answered)
100
+ addStep(run.id, 'Someone answered', `${answered.by.join(', ')} wrote under ${ticket.key} after the last review, which left ${asked.length === 1 ? '1 question' : `${asked.length} questions`} open. This review checks which are answered now.`, 'info');
101
+ const issue = ticket.tracker === 'github' ? parseIssueRef(ticket.key) : null;
102
+ if (issue && githubMode() !== 'demo') {
103
+ // Timeline links (cross-references, sub-issues, blocking) feed traceability; a failure only warns.
104
+ try {
105
+ const n = await recordIssueTimeline(watch, issue.full, issue.number);
106
+ if (n)
107
+ addStep(run.id, 'Linked issues and PRs', `${n} new link${n === 1 ? '' : 's'} from the timeline`);
108
+ }
109
+ catch (err) {
110
+ addStep(run.id, 'Timeline read failed', String(err), 'warn');
111
+ }
112
+ }
113
+ const llm = getLlmFor(watch, runStage(run));
114
+ const score = await llm.score(ticket);
115
+ addStep(run.id, 'Actionability score', `${score}/100`, score < SCORE_FLOOR ? 'warn' : 'ok');
116
+ // A person who asks for the review gets one, thin or not; the review then names what is missing (KAT-98). So does a person who answers.
117
+ if (score < SCORE_FLOOR && (ev.requestedBy || answered))
118
+ addStep(run.id, 'Reviewing anyway', ev.requestedBy ? 'A person asked for this review.' : 'A person answered, so the ticket may be ready now.');
119
+ if (score < SCORE_FLOOR && !ev.requestedBy && !answered) {
120
+ setVerdict(run.id, {
121
+ outcome: 'info',
122
+ headline: `${ticket.key} is too thin to review yet (${score}/100); it goes in the daily digest`,
123
+ summary: `${ticket.key} has too little detail for a QA review. It will appear in the digest so someone can flesh it out.`,
124
+ risk: 'low',
125
+ findings: [],
126
+ openQuestions: ['What behaviour should change, and how will we know it works?'],
127
+ testIdeas: [],
128
+ testsAtRisk: [],
129
+ confidence: 0.6,
130
+ });
131
+ // A ticket review says nothing about the shop's health, so it leaves the dot's status alone (KAT-74).
132
+ finishRun(run.id, 'done', null);
133
+ return;
134
+ }
135
+ // Comments, parent, sub-issues and the stored links of a GitHub issue go to the review (KAT-389). Best effort.
136
+ // It runs after the thin-ticket check, which ignores it, so a ticket that stops there makes no GitHub read for it.
137
+ let context = null;
138
+ if (issue && githubMode() !== 'demo') {
139
+ try {
140
+ // The author of the ticket and the people the poll checked for write access may answer, whatever their role in the repo.
141
+ context = await readTicketContext(watch, ticket, {}, answered ? [ticket.reporter ?? '', ...answered.by].filter(Boolean) : []);
142
+ }
143
+ catch (err) {
144
+ addStep(run.id, 'Discussion read failed', String(err), 'warn');
145
+ }
146
+ if (context)
147
+ addStep(run.id, 'Read the discussion', contextStepDetail(context), context.unread.length ? 'warn' : 'info');
148
+ }
149
+ let codeHits = [];
150
+ const words = keywords(ticket);
151
+ const appRepos = watchRepos(watch).filter((r) => r.role === 'app');
152
+ if (appRepos.length && words.length) {
153
+ try {
154
+ // Every app repo of the dot: a ticket can touch any of them. Paths carry the repo when there are several.
155
+ const several = appRepos.length > 1;
156
+ const perRepo = await Promise.all(appRepos.map(async (r) => {
157
+ const gh = githubFor(watch, { repo: r });
158
+ const hits = (await Promise.all(words.map((w) => gh.searchCode(w).catch(() => [])))).flat();
159
+ return several ? hits.map((h) => ({ ...h, path: `${r.owner}/${r.name}:${h.path}` })) : hits;
160
+ }));
161
+ const seen = new Set();
162
+ codeHits = perRepo
163
+ .flat()
164
+ .filter((h) => !seen.has(h.path) && seen.add(h.path))
165
+ .slice(0, 15);
166
+ addStep(run.id, 'Searched the code', `${words.join(', ')}: ${codeHits.length} files`);
167
+ }
168
+ catch (err) {
169
+ addStep(run.id, 'Code search failed', String(err), 'warn');
170
+ }
171
+ }
172
+ const analysis = noteModelFallback(run.id, await llm.analyze({
173
+ task: 'ticket_review',
174
+ watch,
175
+ event: ev,
176
+ ticket,
177
+ codeHits,
178
+ memory: listMemory(watch.id),
179
+ ...(hasContext(context) ? { context } : {}),
180
+ ...(answered && before && asked.length ? { rereview: { questions: asked, answerers: answered.by, since: before.createdAt } } : {}),
181
+ }));
182
+ // A copy of a comment never lands in the posted review: a short quote stays, a pasted comment is cut.
183
+ const scrubbed = scrubDiscussionEcho(analysis, context, ticket);
184
+ // The answers the review reports are checked here: they must name a question of the last review and a writer the review may trust.
185
+ const trusted = new Set([ticket.reporter ?? '', ...(answered?.by ?? []), ...(context?.comments.filter((c) => !c.outsider).map((c) => c.author) ?? [])]
186
+ .filter(Boolean)
187
+ .map((l) => l.toLowerCase()));
188
+ const verdict = answered && asked.length ? settleAnswered(scrubbed, asked, trusted) : scrubbed;
189
+ if (answered && asked.length)
190
+ addStep(run.id, verdict.answeredQuestions?.length ? 'Questions answered' : 'No question answered yet', verdict.answeredQuestions?.length
191
+ ? `${verdict.answeredQuestions.length} of ${asked.length} questions of the last review are answered now.`
192
+ : `None of the ${asked.length} questions of the last review is answered by the new comments.`, verdict.answeredQuestions?.length ? 'ok' : 'info');
193
+ setVerdict(run.id, verdict);
194
+ addStep(run.id, 'Review written', verdict.headline, verdict.outcome === 'needs_attention' ? 'warn' : 'ok');
195
+ // Impact on existing tests (KAT-304): which cases and specs of the dot this ticket changes, from any ticket. It runs
196
+ // before the comment so the comment can list the specs to update. Best effort: a failure leaves a warning step.
197
+ let impact = null;
198
+ try {
199
+ addStep(run.id, 'Checking existing tests', 'The dot is looking for tests of any ticket that this ticket changes.');
200
+ impact = await checkExistingTests(watch, ticket, run.id);
201
+ }
202
+ catch (err) {
203
+ addStep(run.id, 'Existing tests check failed', String(err?.message ?? err).slice(0, 200), 'warn');
204
+ }
205
+ if (impact) {
206
+ setImpact(run.id, impact.summary);
207
+ recordImpactSteps(run.id, impact);
208
+ }
209
+ await gate({
210
+ kind: 'ticket_comment',
211
+ target: `${ticket.tracker}:${ticket.key}`,
212
+ title: `QA review for ${ticket.key}`,
213
+ body: renderTicketComment(verdict, run.id, impact?.items, {
214
+ key: ticket.key,
215
+ tracker: ticket.tracker,
216
+ ...(ticket.reporter ? { reporter: ticket.reporter } : {}),
217
+ }, contextNote(context)),
218
+ meta: {
219
+ key: ticket.key,
220
+ ticketId: ticket.id,
221
+ tracker: ticket.tracker,
222
+ url: ticket.url,
223
+ ticketReview: true,
224
+ ...(issue ? { repo: issue.full, issue: issue.number } : {}),
225
+ },
226
+ }, watch, run.id);
227
+ // Test designer (KAT-164): draft manual cases from this review's own analysis, one model call. It runs
228
+ // after the comment draft, so a slow model never holds the review back.
229
+ // Best effort: a failure here leaves a warning step and never blocks the review comment below.
230
+ let designed;
231
+ addStep(run.id, 'Designing test cases', 'The comment draft is ready. The dot is drafting manual test cases from this review.');
232
+ try {
233
+ designed = await designTestCases(watch, ticket, verdict);
234
+ }
235
+ catch (err) {
236
+ designed = null;
237
+ addStep(run.id, 'Test design failed', `Could not save designed test cases: ${String(err?.message ?? err).slice(0, 200)}`, 'warn');
238
+ }
239
+ if (designed) {
240
+ setDesigned(run.id, designed);
241
+ if (designed.error)
242
+ addStep(run.id, 'Test design failed', designed.error, 'warn');
243
+ else
244
+ addStep(run.id, 'Designed test cases', designedDetail(designed), 'ok');
245
+ }
246
+ finishRun(run.id, 'done', null);
247
+ });
248
+ });
249
+ //# sourceMappingURL=ticketReview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketReview.js","sourceRoot":"","sources":["../../src/flows/ticketReview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ // issue_comment.edited intake: a tester ticks items in the sticky comment's "What to test"
2
+ // list, and the ticks become manual results on the run (docs/PR-REVIEW-QA.md section 5.1).
3
+ // Edits by bots (the App itself included) and by users without write access are ignored.
4
+ import { list } from '../db.js';
5
+ import { addStep, setVerdict } from '../agent/runs.js';
6
+ import { githubFor } from '../integrations/github.js';
7
+ import { checklistId, commentHead, tickedIds } from '../review/render.js';
8
+ import { findRepo, primaryRepo, repoId } from '../repos.js';
9
+ export const WRITE_ASSOCIATIONS = ['OWNER', 'MEMBER', 'COLLABORATOR'];
10
+ /** Applies the ticks of an edited sticky comment to the reviewed run at the comment's head. */
11
+ export async function applyChecklistEdit(edit) {
12
+ if (edit.senderIsBot)
13
+ return { applied: false, reason: 'edit made by a bot' };
14
+ const watches = list('watches').filter((w) => !w.archived && findRepo(w, edit.repo)?.role === 'app');
15
+ if (!watches.length)
16
+ return { applied: false, reason: 'no dot watches this repo' };
17
+ const head = commentHead(edit.body);
18
+ const ticked = tickedIds(edit.body);
19
+ for (const watch of watches) {
20
+ // A two-repo dot can hold the same PR number, head and item ids in both repos: only the review whose
21
+ // trigger repo is the edited comment's repo takes the ticks (KAT-107). A run stored before triggers
22
+ // carried a repo belongs to the dot's first app repo.
23
+ const editRepo = repoId(edit.repo.owner, edit.repo.name);
24
+ const firstApp = primaryRepo(watch)?.id;
25
+ const run = list('runs', { watchId: watch.id, kind: 'pr_check' }, { orderBy: 'createdAt DESC', limit: 200 }).find((r) => {
26
+ if (r.trigger?.pr?.number !== edit.pr || !r.verdict?.qa || (head && !r.verdict.qa.head.startsWith(head)))
27
+ return false;
28
+ const t = r.trigger.repo;
29
+ return (t ? repoId(t.owner, t.name) : firstApp) === editRepo;
30
+ });
31
+ if (!run?.verdict?.qa)
32
+ continue;
33
+ // Permission: the GitHub permission API for the sender. The payload association describes the author of the
34
+ // sticky comment (the App or the PAT owner), not the editor, so it is only a fallback in demo mode, where there
35
+ // is no API to ask. A live client that cannot answer fails closed (KAT-63).
36
+ const gh = githubFor(watch, { repo: edit.repo });
37
+ let allowed = await gh.writePermission(edit.sender).catch(() => null);
38
+ if (allowed === null) {
39
+ if (gh.mode !== 'demo') {
40
+ addStep(run.id, 'Ignored checklist edit', `Could not confirm that ${edit.sender || 'the editor'} has write access to ${edit.repo.owner}/${edit.repo.name}.`, 'warn');
41
+ return { applied: false, reason: 'write access could not be checked', runId: run.id };
42
+ }
43
+ allowed = WRITE_ASSOCIATIONS.includes(edit.association);
44
+ }
45
+ if (!allowed) {
46
+ addStep(run.id, 'Ignored checklist edit', `${edit.sender || 'Someone'} has no write access to ${edit.repo.owner}/${edit.repo.name}.`, 'warn');
47
+ return { applied: false, reason: 'editor has no write access', runId: run.id };
48
+ }
49
+ const qa = run.verdict.qa;
50
+ let changed = 0;
51
+ const whatToTest = qa.whatToTest.map((t) => {
52
+ const on = ticked.has(checklistId(t));
53
+ if (on && t.resultSource !== 'ci' && !(t.result === 'passed' && t.resultSource === 'manual')) {
54
+ changed++;
55
+ return { ...t, result: 'passed', resultSource: 'manual' };
56
+ }
57
+ if (!on && t.resultSource === 'manual') {
58
+ changed++;
59
+ const { result: _r, resultSource: _s, ...rest } = t;
60
+ return rest;
61
+ }
62
+ return t;
63
+ });
64
+ if (!changed)
65
+ return { applied: false, reason: 'no checklist change', runId: run.id, ticked: ticked.size };
66
+ setVerdict(run.id, { ...run.verdict, qa: { ...qa, whatToTest } });
67
+ const done = whatToTest.filter((t) => t.resultSource === 'manual').length;
68
+ addStep(run.id, 'Checklist updated on the PR', `${edit.sender || 'A tester'} marked ${done} of ${whatToTest.length} items tested.`, 'ok');
69
+ return { applied: true, reason: 'ticks saved', runId: run.id, ticked: done };
70
+ }
71
+ return { applied: false, reason: 'no reviewed run for this comment' };
72
+ }
73
+ //# sourceMappingURL=ticks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticks.js","sourceRoot":"","sources":["../../src/flows/ticks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ // Operator and edge routes (docs/tinybee/06-infra-ops.md): the staging cleanup deletes test tenants and
2
+ // their tunnels, the tunnel count guards the Cloudflare budget, and the edge Worker asks which tenant a
3
+ // slug belongs to. Admin routes need HIVE_ADMIN_TOKEN; without it they do not exist (404).
4
+ import { timingSafeEqual } from 'node:crypto';
5
+ import { hiveConfig, hiveLog } from './config.js';
6
+ import { hiveDb } from './db.js';
7
+ import { relayMetrics } from './relay.js';
8
+ import { pushMetrics } from './push.js';
9
+ import { storeManifestDoc } from './updates.js';
10
+ import { UPDATE_CHANNELS } from '../tinybee/update-manifest.js';
11
+ import { HiveError } from './errors.js';
12
+ import { bearerOf } from './session.js';
13
+ import { tenantBySlug, normalizeSlug } from './tenants.js';
14
+ import { tunnelProvider } from './tunnel/provider.js';
15
+ export const TUNNEL_WARN_AT = 40;
16
+ function requireAdmin(req) {
17
+ const want = hiveConfig.adminToken;
18
+ if (!want)
19
+ throw new HiveError(404, 'not_found', 'Not found.');
20
+ const got = bearerOf(req) ?? '';
21
+ const a = Buffer.from(got);
22
+ const b = Buffer.from(want);
23
+ if (a.length !== b.length || !timingSafeEqual(a, b))
24
+ throw new HiveError(401, 'admin_token', 'This route needs the Hive admin token.');
25
+ }
26
+ /**
27
+ * Deletes every tenant whose slug starts with `prefix` (at least four characters, so `t` cannot wipe a stage),
28
+ * revoking its tunnel first. The owning user goes too when nothing else is left of them. Dry runs list only.
29
+ */
30
+ export async function cleanupTenants(prefix, opts = {}) {
31
+ const p = String(prefix ?? '')
32
+ .trim()
33
+ .toLowerCase();
34
+ if (p.length < 4 || !/^[a-z0-9][a-z0-9-]*$/.test(p))
35
+ throw new HiveError(400, 'bad_prefix', 'The prefix must be at least four slug characters.');
36
+ const db = hiveDb();
37
+ const max = opts.max ?? 200;
38
+ const rows = db
39
+ .prepare(`SELECT id, slug, userId FROM tenants WHERE slug LIKE ? ESCAPE '\\' ORDER BY createdAt LIMIT ?`)
40
+ .all(`${p.replace(/[%_\\]/g, '\\$&')}%`, max);
41
+ const report = { prefix: p, tenants: rows.map((r) => r.slug), bees: 0, tunnelsRevoked: 0, tunnelErrors: [], users: 0 };
42
+ if (opts.dryRun)
43
+ return report;
44
+ const provider = tunnelProvider();
45
+ for (const t of rows) {
46
+ const bees = db.prepare('SELECT COUNT(*) AS n FROM bees WHERE tenantId = ?').get(t.id);
47
+ try {
48
+ await provider.revoke({ id: t.id, slug: t.slug });
49
+ report.tunnelsRevoked += 1;
50
+ }
51
+ catch (err) {
52
+ report.tunnelErrors.push({ slug: t.slug, error: err instanceof Error ? err.message : String(err) });
53
+ hiveLog.warn(`cleanup: tunnel for ${t.slug} not revoked: ${err instanceof Error ? err.message : err}`);
54
+ continue; // keep the tenant so the next run retries the tunnel
55
+ }
56
+ db.exec('BEGIN');
57
+ try {
58
+ db.prepare('DELETE FROM pair_nonces WHERE tenantId = ?').run(t.id);
59
+ db.prepare('DELETE FROM install_codes WHERE tenantId = ?').run(t.id);
60
+ db.prepare('DELETE FROM bees WHERE tenantId = ?').run(t.id);
61
+ db.prepare('DELETE FROM tenants WHERE id = ?').run(t.id);
62
+ db.prepare('DELETE FROM refresh_tokens WHERE userId = ?').run(t.userId);
63
+ db.prepare('DELETE FROM users WHERE id = ? AND NOT EXISTS (SELECT 1 FROM tenants WHERE userId = ?)').run(t.userId, t.userId);
64
+ db.exec('COMMIT');
65
+ }
66
+ catch (err) {
67
+ db.exec('ROLLBACK');
68
+ throw err;
69
+ }
70
+ report.bees += bees.n;
71
+ report.users += 1;
72
+ }
73
+ return report;
74
+ }
75
+ export async function tunnelReport() {
76
+ const provider = tunnelProvider();
77
+ const count = provider.count ? await provider.count() : null;
78
+ const row = hiveDb().prepare("SELECT COUNT(DISTINCT tenantId) AS n FROM bees WHERE status IN ('provisioning','online')").get();
79
+ return {
80
+ provider: provider.name,
81
+ count,
82
+ cap: hiveConfig.tunnelCap,
83
+ warnAt: TUNNEL_WARN_AT,
84
+ tenantsWithBees: row.n,
85
+ ok: count === null || count <= TUNNEL_WARN_AT,
86
+ };
87
+ }
88
+ export async function adminRoutes(app) {
89
+ app.delete('/admin/tenants', async (req) => {
90
+ requireAdmin(req);
91
+ const q = req.query;
92
+ return cleanupTenants(q.prefix ?? '', { dryRun: q.dryRun === '1' || q.dryRun === 'true' });
93
+ });
94
+ // Counts only (docs 06 section 7): tenants per plan and status, relay calls and tokens in the last day.
95
+ app.get('/admin/metrics', async (req, reply) => {
96
+ requireAdmin(req);
97
+ return reply.header('cache-control', 'no-store').send({ ...relayMetrics(), push: pushMetrics() });
98
+ });
99
+ // A release publishes the signed Bee manifest for a channel (scripts/tinybee-sign-manifest.mjs makes it).
100
+ app.put('/admin/updates/bee/:channel', async (req, reply) => {
101
+ requireAdmin(req);
102
+ const channel = req.params.channel;
103
+ if (!UPDATE_CHANNELS.includes(channel))
104
+ throw new HiveError(404, 'no_manifest', 'No such update channel.');
105
+ return reply.code(201).send(storeManifestDoc(channel, req.body));
106
+ });
107
+ app.get('/admin/tunnels', async (req, reply) => {
108
+ requireAdmin(req);
109
+ const r = await tunnelReport();
110
+ return reply.header('cache-control', 'no-store').send(r);
111
+ });
112
+ // The edge Worker's lookup: slug -> tenant id, so a session for one tenant cannot open another's hostname.
113
+ // Public data (the slug is in the hostname), cached a minute at the edge; the Worker keeps its own KV copy.
114
+ app.get('/edge/tenants/:slug', async (req, reply) => {
115
+ const slug = normalizeSlug(req.params.slug);
116
+ const t = tenantBySlug(slug);
117
+ if (!t)
118
+ throw new HiveError(404, 'tenant_not_found', 'No account has this address.');
119
+ return reply.header('cache-control', 'public, max-age=60').send({ tenantId: t.id, slug: t.slug, status: t.status });
120
+ });
121
+ }
122
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/hive/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ // Sign-up and sign-in (FR-H1): an email one-time code, or a Google ID token, becomes a user row, a
2
+ // one-hour session JWT and a seven-day refresh token. Codes are stored hashed, expire after ten
3
+ // minutes, allow five tries, and an address can ask for five codes per quarter hour.
4
+ import { createHash, randomBytes, randomInt, timingSafeEqual } from 'node:crypto';
5
+ import { hiveDb, newId, nowIso } from './db.js';
6
+ import { HiveError } from './errors.js';
7
+ import { mailer } from './mail.js';
8
+ import { ACCESS_TOKEN_TTL_SEC, signSession } from './jwt.js';
9
+ import { hiveConfig } from './config.js';
10
+ import { ensureTenant, tenantOfUser, tenantView } from './tenants.js';
11
+ export const OTP_TTL_SEC = 10 * 60;
12
+ export const OTP_MAX_ATTEMPTS = 5;
13
+ export const OTP_RATE_LIMIT = { count: 5, windowSec: 15 * 60 };
14
+ export const REFRESH_TTL_SEC = 7 * 24 * 60 * 60;
15
+ const sha = (v) => createHash('sha256').update(v).digest('hex');
16
+ /** Lower-cased, trimmed, and checked for the one shape every mail sender accepts. */
17
+ export function normalizeEmail(raw) {
18
+ const email = typeof raw === 'string' ? raw.trim().toLowerCase() : '';
19
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(email) || email.length > 254)
20
+ throw new HiveError(400, 'invalid_email', 'Enter a valid email address.');
21
+ return email;
22
+ }
23
+ export const userView = (u) => ({ id: u.id, email: u.email, name: u.name, createdAt: u.createdAt });
24
+ export function userById(id) {
25
+ return hiveDb().prepare('SELECT * FROM users WHERE id = ?').get(id);
26
+ }
27
+ function userByEmail(email) {
28
+ return hiveDb().prepare('SELECT * FROM users WHERE email = ?').get(email);
29
+ }
30
+ function upsertUser(email, patch = {}) {
31
+ const d = hiveDb();
32
+ const now = nowIso();
33
+ const have = userByEmail(email);
34
+ if (have) {
35
+ d.prepare('UPDATE users SET lastSignInAt = ?, name = COALESCE(?, name), googleSub = COALESCE(?, googleSub) WHERE id = ?').run(now, patch.name ?? null, patch.googleSub ?? null, have.id);
36
+ }
37
+ else {
38
+ d.prepare('INSERT INTO users (id, email, name, googleSub, createdAt, lastSignInAt) VALUES (?, ?, ?, ?, ?, ?)').run(newId('usr'), email, patch.name ?? null, patch.googleSub ?? null, now, now);
39
+ }
40
+ return userByEmail(email);
41
+ }
42
+ /** Step 1 of email sign-in. Returns when the code is on its way; the code itself is only in the mail (or the local log). */
43
+ export async function startOtp(rawEmail, now = Date.now()) {
44
+ const email = normalizeEmail(rawEmail);
45
+ const d = hiveDb();
46
+ const since = now - OTP_RATE_LIMIT.windowSec * 1000;
47
+ const recent = d.prepare('SELECT COUNT(*) AS n FROM otps WHERE email = ? AND createdAt > ?').get(email, since);
48
+ if (recent.n >= OTP_RATE_LIMIT.count)
49
+ throw new HiveError(429, 'otp_rate_limited', 'Too many codes were sent to this address. Wait 15 minutes, then try again.');
50
+ const code = String(randomInt(0, 1_000_000)).padStart(6, '0');
51
+ // One live code per address: a new request replaces the old code.
52
+ d.prepare('UPDATE otps SET usedAt = ? WHERE email = ? AND usedAt IS NULL').run(now, email);
53
+ d.prepare('INSERT INTO otps (id, email, codeHash, expiresAt, attempts, createdAt) VALUES (?, ?, ?, ?, 0, ?)').run(newId('otp'), email, sha(code), now + OTP_TTL_SEC * 1000, now);
54
+ await mailer().sendOtp({ to: email, code, expiresInMin: OTP_TTL_SEC / 60 });
55
+ // Local development has no mail: the code rides along so the PWA flow works on one laptop. Never on staging or prod.
56
+ return { email, expiresInSec: OTP_TTL_SEC, ...(hiveConfig.env === 'local' || hiveConfig.env === undefined ? { devCode: code } : {}) };
57
+ }
58
+ /** Step 2: the code becomes a session. A wrong code counts a try; the fifth wrong try burns the code. */
59
+ export function verifyOtp(rawEmail, rawCode, now = Date.now()) {
60
+ const email = normalizeEmail(rawEmail);
61
+ const code = typeof rawCode === 'string' ? rawCode.replace(/\s+/g, '') : '';
62
+ if (!/^\d{6}$/.test(code))
63
+ throw new HiveError(400, 'otp_invalid', 'Enter the 6-digit code from the email.');
64
+ const d = hiveDb();
65
+ const row = d.prepare('SELECT id, codeHash, expiresAt, attempts FROM otps WHERE email = ? AND usedAt IS NULL ORDER BY createdAt DESC LIMIT 1').get(email);
66
+ if (!row)
67
+ throw new HiveError(400, 'otp_invalid', 'That code is wrong or has expired. Ask for a new one.');
68
+ if (row.expiresAt <= now) {
69
+ d.prepare('UPDATE otps SET usedAt = ? WHERE id = ?').run(now, row.id);
70
+ throw new HiveError(400, 'otp_expired', 'That code has expired. Ask for a new one.');
71
+ }
72
+ const a = Buffer.from(sha(code));
73
+ const b = Buffer.from(row.codeHash);
74
+ if (a.length !== b.length || !timingSafeEqual(a, b)) {
75
+ const attempts = row.attempts + 1;
76
+ d.prepare('UPDATE otps SET attempts = ?, usedAt = CASE WHEN ? >= ? THEN ? ELSE NULL END WHERE id = ?').run(attempts, attempts, OTP_MAX_ATTEMPTS, now, row.id);
77
+ if (attempts >= OTP_MAX_ATTEMPTS)
78
+ throw new HiveError(400, 'otp_invalid', 'Too many wrong tries. Ask for a new code.');
79
+ throw new HiveError(400, 'otp_invalid', `That code is wrong. ${OTP_MAX_ATTEMPTS - attempts} tries left.`);
80
+ }
81
+ d.prepare('UPDATE otps SET usedAt = ? WHERE id = ?').run(now, row.id);
82
+ return issueSession(withTenant(upsertUser(email)), now);
83
+ }
84
+ /** A verified Google identity becomes the same session an email code does. */
85
+ export function signInWithGoogle(identity, now = Date.now()) {
86
+ if (!identity.emailVerified)
87
+ throw new HiveError(400, 'google_email_unverified', 'This Google account has no verified email address.');
88
+ const email = normalizeEmail(identity.email);
89
+ return issueSession(withTenant(upsertUser(email, { name: identity.name ?? null, googleSub: identity.sub })), now);
90
+ }
91
+ /** Phase 8: a sign-in makes the tenant (address from the email) when the person has none. A refresh never does. */
92
+ function withTenant(user) {
93
+ ensureTenant(user.id, user.email);
94
+ return user;
95
+ }
96
+ export function issueSession(user, now = Date.now()) {
97
+ const tenant = tenantOfUser(user.id);
98
+ const accessToken = signSession({ sub: user.id, email: user.email, tenant_id: tenant?.id ?? null, slug: tenant?.slug ?? null, scopes: ['tenant:owner'] }, { now });
99
+ const refreshToken = `tbr.${randomBytes(32).toString('base64url')}`;
100
+ hiveDb()
101
+ .prepare('INSERT INTO refresh_tokens (id, userId, tokenHash, expiresAt, createdAt) VALUES (?, ?, ?, ?, ?)')
102
+ .run(newId('rt'), user.id, sha(refreshToken), now + REFRESH_TTL_SEC * 1000, now);
103
+ return { accessToken, refreshToken, expiresIn: ACCESS_TOKEN_TTL_SEC, user: userView(user), tenant: tenant ? tenantView(tenant) : null };
104
+ }
105
+ /** Trades a refresh token for a new pair. The old one is revoked: a token used twice means it leaked. */
106
+ export function refreshSession(rawToken, now = Date.now()) {
107
+ const token = typeof rawToken === 'string' ? rawToken.trim() : '';
108
+ if (!token)
109
+ throw new HiveError(400, 'refresh_invalid', 'The refresh token is missing.');
110
+ const d = hiveDb();
111
+ const row = d.prepare('SELECT id, userId, expiresAt, revokedAt FROM refresh_tokens WHERE tokenHash = ?').get(sha(token));
112
+ if (!row || row.revokedAt !== null || row.expiresAt <= now) {
113
+ // A revoked token used again: sign out every session of that user.
114
+ if (row && row.revokedAt !== null)
115
+ d.prepare('UPDATE refresh_tokens SET revokedAt = ? WHERE userId = ? AND revokedAt IS NULL').run(now, row.userId);
116
+ throw new HiveError(401, 'refresh_invalid', 'Sign in again.');
117
+ }
118
+ d.prepare('UPDATE refresh_tokens SET revokedAt = ? WHERE id = ?').run(now, row.id);
119
+ const user = userById(row.userId);
120
+ if (!user)
121
+ throw new HiveError(401, 'refresh_invalid', 'Sign in again.');
122
+ return issueSession(user, now);
123
+ }
124
+ export function signOut(rawToken, now = Date.now()) {
125
+ const token = typeof rawToken === 'string' ? rawToken.trim() : '';
126
+ if (!token)
127
+ return;
128
+ hiveDb().prepare('UPDATE refresh_tokens SET revokedAt = ? WHERE tokenHash = ? AND revokedAt IS NULL').run(now, sha(token));
129
+ }
130
+ //# sourceMappingURL=auth.js.map