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,705 @@
1
+ // GitHub Issues as a tracker (docs/TRACKERS.md section GitHub Issues, design section 4).
2
+ // The normalizer turns `issues` and `issue_comment.created` deliveries, and the poller's rows,
3
+ // into ticket_created and ticket_updated events. Scope (labels, issue types, milestones) is
4
+ // per dot, so the normalizer emits every candidate and watchMatches decides through issueInScope.
5
+ import { createHash } from 'node:crypto';
6
+ import { liveEnv } from '../config.js';
7
+ import { findOne, get, insert, update } from '../db.js';
8
+ import { extractAcceptanceCriteria } from './adf.js';
9
+ import { hasLegacyDefectMarker, hasValidBotMarker, withBotMarker } from './bot-marker.js';
10
+ import { isOwnId } from './own-identity.js';
11
+ import { apiBase, isDefectLabel, githubMode, githubTokenFor, headers, selfLogin } from './github.js';
12
+ import { watchRepos } from '../repos.js';
13
+ import { backfillLimitError } from '../monitor/backfill.js';
14
+ /** Marks the localdost review comment on an issue. A re-review edits that comment in place. */
15
+ export const TICKET_REVIEW_MARKER = '<!-- localdost:ticket-review -->';
16
+ /** A comment that starts a line with this asks for a review now. */
17
+ export const REVIEW_COMMAND = /^\s*\/(?:localdost|qadots)\s+review\b/im;
18
+ /** Used when the dot's tracker sets no labels or types. Issue types win over labels when an issue has one. */
19
+ export const DEFAULT_LABELS = { requirement: ['requirement', 'story', 'feature', 'enhancement'], defect: ['bug', 'defect'], ignore: [] };
20
+ export const DEFAULT_ISSUE_TYPES = { requirement: ['Feature', 'Story', 'Task'], defect: ['Bug'] };
21
+ /** A label name is at most 50 characters on GitHub. */
22
+ export const LABEL_MAX = 50;
23
+ /** Required labels a tracker may list. */
24
+ export const REQUIRE_LABELS_MAX = 20;
25
+ /**
26
+ * Checks `tracker.labels.require` in a dot save: a list of label names. Returns the message to answer, or null.
27
+ * Only a GitHub tracker has the label field; every tracker may carry `backfillLimit`.
28
+ */
29
+ export function trackerScopeError(tracker) {
30
+ if (tracker === undefined || tracker === null)
31
+ return null;
32
+ if (typeof tracker !== 'object' || Array.isArray(tracker))
33
+ return 'tracker must be an object.';
34
+ const t = tracker;
35
+ const limit = backfillLimitError(t.backfillLimit);
36
+ if (limit)
37
+ return limit;
38
+ if (t.kind !== 'github' || t.labels === undefined)
39
+ return null;
40
+ if (t.labels === null || typeof t.labels !== 'object' || Array.isArray(t.labels))
41
+ return 'tracker.labels must be an object.';
42
+ const required = t.labels.require;
43
+ if (required === undefined)
44
+ return null;
45
+ const bad = `tracker.labels.require must be a list of label names (up to ${REQUIRE_LABELS_MAX}, each up to ${LABEL_MAX} characters).`;
46
+ if (!Array.isArray(required) || required.length > REQUIRE_LABELS_MAX)
47
+ return bad;
48
+ for (const l of required)
49
+ if (typeof l !== 'string' || !l.trim() || l.trim().length > LABEL_MAX || /[\r\n]/.test(l))
50
+ return bad;
51
+ return null;
52
+ }
53
+ /** The saved tracker: required labels trimmed and without repeats (any case), and the key dropped when none are left. */
54
+ export function tidyTrackerScope(tracker) {
55
+ const t = tracker;
56
+ if (t?.kind !== 'github' || !t.labels || !Array.isArray(t.labels.require))
57
+ return tracker;
58
+ const seen = new Set();
59
+ const required = t.labels.require.map((l) => l.trim()).filter((l) => l && !seen.has(l.toLowerCase()) && !!seen.add(l.toLowerCase()));
60
+ const labels = { ...t.labels };
61
+ if (required.length)
62
+ labels.require = required;
63
+ else
64
+ delete labels.require;
65
+ const out = { ...t, labels };
66
+ if (!Object.keys(labels).length)
67
+ delete out.labels;
68
+ return out;
69
+ }
70
+ /** The first required label of a GitHub tracker, as written ("pod:agentic"), or undefined when the tracker requires none. */
71
+ export function requiredLabel(w) {
72
+ const t = w.tracker;
73
+ return t?.kind === 'github' ? t.labels?.require?.map((l) => l.trim()).find(Boolean) : undefined;
74
+ }
75
+ /**
76
+ * The scope settings a classifier reads for a dot. A GitHub tracker has its own. A Jira, Linear or tracker-less dot has
77
+ * none and keeps Feature and Story as its requirement types: a Task is a chore there. Only a GitHub tracker takes Task
78
+ * by default (KAT-353).
79
+ */
80
+ export function classifierTracker(w) {
81
+ return w.tracker?.kind === 'github' ? w.tracker : { kind: 'github', issueTypes: { requirement: ['Feature', 'Story'] } };
82
+ }
83
+ /** The first defect label of a GitHub tracker as written (default `bug`). */
84
+ export function trackerDefectLabel(w) {
85
+ const t = w.tracker;
86
+ const first = t?.kind === 'github' ? t.labels?.defect?.find((l) => l.trim()) : undefined;
87
+ return (first ?? DEFAULT_LABELS.defect[0]).trim();
88
+ }
89
+ /** The first defect issue type of a GitHub tracker (default Bug). */
90
+ export function trackerDefectType(w) {
91
+ const t = w.tracker;
92
+ const first = t?.kind === 'github' ? t.issueTypes?.defect?.find((x) => x.trim()) : undefined;
93
+ return (first ?? DEFAULT_ISSUE_TYPES.defect[0]).trim();
94
+ }
95
+ const lc = (s) => String(s ?? '').toLowerCase();
96
+ const lcList = (xs) => (xs ?? []).map((x) => x.trim().toLowerCase()).filter(Boolean);
97
+ export function issueRef(full, n) {
98
+ return `${full.toLowerCase()}#${n}`;
99
+ }
100
+ /** "owner/name#12" to its parts; null for anything else. */
101
+ export function parseIssueRef(ref) {
102
+ const m = /^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)#(\d+)$/.exec(ref.trim());
103
+ if (!m)
104
+ return null;
105
+ return { full: `${m[1]}/${m[2]}`, owner: m[1], name: m[2], number: Number(m[3]) };
106
+ }
107
+ /** First 16 hex chars of sha256 over title and body. Repeated edits to the same text share it. */
108
+ export function bodyHash(title, body) {
109
+ return createHash('sha256')
110
+ .update(`${String(title ?? '')}\n${String(body ?? '')}`)
111
+ .digest('hex')
112
+ .slice(0, 16);
113
+ }
114
+ // Acceptance criteria
115
+ const TASK_ITEM = /^\s*[-*]\s+\[[ xX]\]\s+\S/;
116
+ const FORM_AC_LABEL = /acceptance|criteria|definition of done|done when|expected (behaviou?r|result)|success/i;
117
+ /**
118
+ * Acceptance criteria of an issue body, first match wins: a section under an "Acceptance criteria"
119
+ * heading, the task list items, or the issue form sections (`### <label>`) whose label names criteria.
120
+ */
121
+ export function issueAcceptanceCriteria(body) {
122
+ const fromHeading = extractAcceptanceCriteria(body);
123
+ if (fromHeading)
124
+ return fromHeading;
125
+ const lines = body.split('\n');
126
+ const tasks = lines.filter((l) => TASK_ITEM.test(l)).map((l) => l.trim());
127
+ if (tasks.length)
128
+ return tasks.join('\n');
129
+ const sections = [];
130
+ for (let i = 0; i < lines.length; i++) {
131
+ const h = /^###\s+(.+?)\s*$/.exec(lines[i] ?? '');
132
+ if (!h || !FORM_AC_LABEL.test(h[1] ?? ''))
133
+ continue;
134
+ const out = [];
135
+ for (let j = i + 1; j < lines.length && !/^#{1,3}\s/.test(lines[j] ?? ''); j++)
136
+ out.push(lines[j] ?? '');
137
+ const text = out.join('\n').trim();
138
+ if (text && text !== '_No response_')
139
+ sections.push(text);
140
+ }
141
+ return sections.length ? sections.join('\n\n') : undefined;
142
+ }
143
+ // Ticket mapping
144
+ function repoOf(payload, issue) {
145
+ const r = payload.repository;
146
+ if (r?.full_name)
147
+ return String(r.full_name);
148
+ if (r?.owner && r?.name)
149
+ return `${r.owner.login ?? r.owner.name}/${r.name}`;
150
+ // GET /issues/{n} has repository_url: https://api.github.com/repos/<owner>/<name>
151
+ const m = /\/repos\/([^/]+\/[^/]+)$/.exec(String(issue.repository_url ?? ''));
152
+ return m ? m[1] : '';
153
+ }
154
+ export function issueToTicket(issue, full) {
155
+ const description = String(issue.body ?? '');
156
+ const t = {
157
+ key: `${full}#${issue.number}`,
158
+ id: String(issue.node_id ?? issue.id ?? issue.number),
159
+ tracker: 'github',
160
+ title: String(issue.title ?? ''),
161
+ description,
162
+ repo: full,
163
+ state: issue.state === 'closed' ? 'closed' : 'open',
164
+ };
165
+ const ac = issueAcceptanceCriteria(description);
166
+ if (ac)
167
+ t.acceptanceCriteria = ac;
168
+ if (Array.isArray(issue.labels))
169
+ t.labels = issue.labels.map((l) => String(typeof l === 'string' ? l : l?.name)).filter(Boolean);
170
+ const type = issue.type?.name ?? (typeof issue.type === 'string' ? issue.type : undefined);
171
+ if (type) {
172
+ t.issueType = String(type);
173
+ t.type = String(type);
174
+ }
175
+ if (issue.milestone?.title)
176
+ t.milestone = String(issue.milestone.title);
177
+ if (issue.html_url)
178
+ t.url = String(issue.html_url);
179
+ if (issue.user?.login)
180
+ t.reporter = String(issue.user.login);
181
+ // A card shows an open issue as active, a closed one as done, or as canceled when it was closed as not planned.
182
+ t.status = issue.state === 'closed' ? (issue.state_reason === 'not_planned' ? 'Closed as not planned' : 'Closed') : 'Open';
183
+ t.statusKind = issue.state === 'closed' ? (issue.state_reason === 'not_planned' ? 'canceled' : 'done') : 'active';
184
+ const assignee = issue.assignee?.login ?? (Array.isArray(issue.assignees) ? issue.assignees[0]?.login : undefined);
185
+ if (assignee)
186
+ t.assignee = String(assignee);
187
+ if (issue.updated_at)
188
+ t.updatedAt = String(issue.updated_at);
189
+ return t;
190
+ }
191
+ // Scope
192
+ export function trackerRepos(w) {
193
+ const t = w.tracker;
194
+ if (t?.kind !== 'github')
195
+ return [];
196
+ const repos = lcList(t.repos);
197
+ if (repos.length)
198
+ return [...new Set(repos)];
199
+ // No repos named on the tracker: the dot's app repos (docs/MULTI-REPO.md section 4.1).
200
+ return watchRepos(w)
201
+ .filter((r) => r.role === 'app')
202
+ .map((r) => r.id);
203
+ }
204
+ function scopeLists(t) {
205
+ const labels = t.labels ?? {};
206
+ const types = t.issueTypes ?? {};
207
+ return {
208
+ reqLabels: labels.requirement?.length ? lcList(labels.requirement) : DEFAULT_LABELS.requirement,
209
+ defLabels: labels.defect?.length ? lcList(labels.defect) : DEFAULT_LABELS.defect,
210
+ ignore: lcList(labels.ignore),
211
+ require: lcList(labels.require),
212
+ reqTypes: types.requirement?.length ? lcList(types.requirement) : lcList(DEFAULT_ISSUE_TYPES.requirement),
213
+ defTypes: types.defect?.length ? lcList(types.defect) : lcList(DEFAULT_ISSUE_TYPES.defect),
214
+ };
215
+ }
216
+ /**
217
+ * Requirement, defect, or null (skip). An issue with a type is classed by the type alone, so a type
218
+ * that is neither a requirement nor a defect type is skipped. An issue with no type falls back to its
219
+ * labels. When the tracker requires labels, an issue with none of them is skipped first, whatever its type,
220
+ * and an untyped issue that has one is a requirement unless a defect label, or the `localdost` label of the dot's
221
+ * own defects, says otherwise: the team's label is what marks its issues, and the dot's own defects carry it too.
222
+ */
223
+ export function issueClass(ticket, t) {
224
+ const s = scopeLists(t);
225
+ const labels = lcList(ticket.labels);
226
+ if (s.require.length && !labels.some((l) => s.require.includes(l)))
227
+ return null;
228
+ if (ticket.issueType) {
229
+ const ty = lc(ticket.issueType);
230
+ if (s.reqTypes.includes(ty))
231
+ return 'requirement';
232
+ if (s.defTypes.includes(ty))
233
+ return 'defect';
234
+ return null;
235
+ }
236
+ if (labels.some((l) => s.reqLabels.includes(l)))
237
+ return 'requirement';
238
+ if (labels.some((l) => s.defLabels.includes(l)))
239
+ return 'defect';
240
+ if (!s.require.length)
241
+ return null;
242
+ return labels.some(isDefectLabel) ? 'defect' : 'requirement';
243
+ }
244
+ /** The labels as the issue shows them, for a skip reason: `pod:other, bug`, or "no labels". */
245
+ const shown = (labels) => (labels?.length ? labels.join(', ') : 'no labels');
246
+ /**
247
+ * Why this dot does not review the issue the event names, in plain words, or null when it does. `inScope` tells an
248
+ * issue the dot skips from an in-scope issue whose event starts nothing, so the log says which. Called from
249
+ * issueInScope, and so from watchMatches, for GitHub ticket events.
250
+ */
251
+ export function issueSkip(w, ev) {
252
+ const out = (why) => ({ why, inScope: false });
253
+ const t = w.tracker;
254
+ if (t?.kind !== 'github' || ev.ticket?.tracker !== 'github')
255
+ return out('the dot has no GitHub tracker');
256
+ if (!trackerRepos(w).includes(lc(ev.ticket.projectKey)))
257
+ return out(`${ev.ticket.projectKey} is not one of the tracker repos`);
258
+ const ticket = ev.inlineTicket;
259
+ if (!ticket)
260
+ return out('the event carries no issue');
261
+ if (ticket.state === 'closed')
262
+ return out('the issue is closed');
263
+ const s = scopeLists(t);
264
+ const labels = lcList(ticket.labels);
265
+ const ignored = labels.find((l) => s.ignore.includes(l));
266
+ if (ignored)
267
+ return out(`it has the skip label "${ignored}"`);
268
+ const change = ev.ticket.change;
269
+ // The required label bounds the dot, even for a person who asks by name: the team's Inbox and model budget are theirs.
270
+ if (s.require.length && !labels.some((l) => s.require.includes(l)))
271
+ return out(`it has none of the required labels (${(t.labels?.require ?? []).join(', ')}); it has ${shown(ticket.labels)}`);
272
+ // A person asked by name; an issue that is not ignored and has the required label gets a review, whatever its milestone or class.
273
+ if (change?.field === 'command')
274
+ return null;
275
+ const milestones = lcList(t.milestones);
276
+ if (milestones.length && !milestones.includes(lc(ticket.milestone)))
277
+ return out(ticket.milestone
278
+ ? `milestone "${ticket.milestone}" is not one of ${(t.milestones ?? []).join(', ')}`
279
+ : `it has no milestone (the dot reviews ${(t.milestones ?? []).join(', ')})`);
280
+ if (!issueClass(ticket, t))
281
+ return out(ticket.issueType
282
+ ? `type "${ticket.issueType}" is not a requirement or defect type`
283
+ : `it has no issue type and no requirement or defect label; it has ${shown(ticket.labels)}`);
284
+ // A change counts only when it can bring the issue into scope: a required, requirement or defect label, or a listed type.
285
+ const event = (why) => ({ why, inScope: true });
286
+ if (change?.field === 'label' && ![...s.reqLabels, ...s.defLabels, ...s.require].includes(lc(change.value)))
287
+ return event(`label "${change.value}" does not change the scope`);
288
+ if (change?.field === 'type' && ![...s.reqTypes, ...s.defTypes].includes(lc(change.value)))
289
+ return event(`type "${change.value}" is not a requirement or defect type`);
290
+ if (change?.field === 'milestone' && milestones.length === 0)
291
+ return event('the dot reviews every milestone, so a milestone change adds nothing');
292
+ return null;
293
+ }
294
+ /** Does this dot review the issue the event names? Called from watchMatches for GitHub ticket events. */
295
+ export function issueInScope(w, ev) {
296
+ return issueSkip(w, ev) === null;
297
+ }
298
+ // Normalizer
299
+ /** localdost' own App, or the login set in GITHUB_BOT_LOGIN. */
300
+ function isOwnActor(user, issueOrComment) {
301
+ const appId = Number(liveEnv.GITHUB_APP_ID);
302
+ if (appId && Number(issueOrComment?.performed_via_github_app?.id) === appId)
303
+ return true;
304
+ const bot = lc(liveEnv.GITHUB_BOT_LOGIN);
305
+ return !!bot && lc(user?.login) === bot;
306
+ }
307
+ /**
308
+ * The dot wrote this issue body or comment: its signed marker is in the text AND the author is the dot's
309
+ * App or the user of its token. A marker pasted by anyone else is ignored. A defect issue that an older
310
+ * version filed carries only the unsigned defect marker; it counts the same way, by its author.
311
+ */
312
+ export function isOwnWrite(text, user, issueOrComment) {
313
+ if (!hasValidBotMarker(text) && !hasLegacyDefectMarker(text))
314
+ return false;
315
+ const appId = Number(liveEnv.GITHUB_APP_ID);
316
+ if (appId && Number(issueOrComment?.performed_via_github_app?.id) === appId)
317
+ return true;
318
+ return isOwnId('github', user?.login);
319
+ }
320
+ export function createdKey(full, n) {
321
+ return `github-issue:${issueRef(full, n)}:created`;
322
+ }
323
+ /**
324
+ * `issues` and `issue_comment` deliveries to ticket events. Returns null for pull requests, events
325
+ * that change nothing a review reads, localdost' own issues, and comments without `/localdost review`.
326
+ * The caller checks the commenter's write access before it dispatches a command.
327
+ */
328
+ export function normalizeGithubIssue(eventName, payload) {
329
+ if (!payload || typeof payload !== 'object')
330
+ return null;
331
+ const issue = payload.issue;
332
+ if (!issue?.number || issue.pull_request)
333
+ return null;
334
+ const full = repoOf(payload, issue);
335
+ if (!full)
336
+ return null;
337
+ const ticket = issueToTicket(issue, full);
338
+ if (isOwnWrite(ticket.description, issue.user, issue))
339
+ return null;
340
+ const n = Number(issue.number);
341
+ const hash = bodyHash(issue.title, issue.body);
342
+ const action = String(payload.action ?? '');
343
+ let kind = 'ticket_updated';
344
+ let change;
345
+ let dedupeKey = `github-issue:${issueRef(full, n)}:edited:${hash.slice(0, 8)}`;
346
+ if (eventName === 'issues') {
347
+ switch (action) {
348
+ case 'opened':
349
+ if (isOwnActor(issue.user, issue))
350
+ return null;
351
+ kind = 'ticket_created';
352
+ dedupeKey = createdKey(full, n);
353
+ break;
354
+ case 'edited': {
355
+ const ch = payload.changes ?? {};
356
+ if (!ch.body && !ch.title)
357
+ return null;
358
+ if (isOwnActor(payload.sender, undefined))
359
+ return null;
360
+ change = { field: ch.body ? 'body' : 'title' };
361
+ break;
362
+ }
363
+ case 'labeled':
364
+ if (!payload.label?.name)
365
+ return null;
366
+ change = { field: 'label', value: String(payload.label.name) };
367
+ break;
368
+ case 'typed':
369
+ if (!(issue.type?.name ?? payload.type?.name))
370
+ return null;
371
+ change = { field: 'type', value: String(issue.type?.name ?? payload.type?.name) };
372
+ break;
373
+ case 'milestoned':
374
+ if (!(payload.milestone?.title ?? issue.milestone?.title))
375
+ return null;
376
+ change = { field: 'milestone', value: String(payload.milestone?.title ?? issue.milestone?.title) };
377
+ break;
378
+ default:
379
+ return null;
380
+ }
381
+ }
382
+ else if (eventName === 'issue_comment') {
383
+ const comment = payload.comment;
384
+ if (action !== 'created' || !comment || !REVIEW_COMMAND.test(String(comment.body ?? '')))
385
+ return null;
386
+ if (isOwnWrite(comment.body, comment.user ?? payload.sender, comment))
387
+ return null;
388
+ const sender = payload.sender ?? comment.user ?? {};
389
+ if (sender.type === 'Bot' || /\[bot\]$/.test(String(sender.login ?? '')) || isOwnActor(sender, comment))
390
+ return null;
391
+ change = { field: 'command', value: String(sender.login ?? '') };
392
+ dedupeKey = `github-issue:${issueRef(full, n)}:command:${comment.id ?? Date.now()}`;
393
+ }
394
+ else {
395
+ return null;
396
+ }
397
+ return {
398
+ source: 'github',
399
+ kind,
400
+ dedupeKey,
401
+ title: `${ticket.key}: ${ticket.title}`,
402
+ ...(ticket.url ? { url: ticket.url } : {}),
403
+ repo: { owner: full.split('/')[0], name: full.split('/')[1] },
404
+ ticket: { key: ticket.key, id: ticket.id, tracker: 'github', projectKey: full, bodyHash: hash, ...(change ? { change } : {}) },
405
+ inlineTicket: ticket,
406
+ };
407
+ }
408
+ /**
409
+ * True when this dot already reviewed the same text of the issue. An issue opened with a label fires
410
+ * `opened` and `labeled` together, in either order; this keeps that to one review.
411
+ */
412
+ export function reviewedSameBody(watchId, ev) {
413
+ const t = ev.ticket;
414
+ if (t?.tracker !== 'github' || t.change?.field === 'command' || !t.bodyHash)
415
+ return false;
416
+ if (ev.kind !== 'ticket_updated' && ev.kind !== 'ticket_created')
417
+ return false;
418
+ const p = parseIssueRef(t.key);
419
+ if (!p)
420
+ return false;
421
+ const other = ev.kind === 'ticket_updated' ? createdKey(p.full, p.number) : `github-issue:${issueRef(p.full, p.number)}:edited:${t.bodyHash.slice(0, 8)}`;
422
+ const job = findOne('jobs', { dedupeKey: `${other}:${watchId}:ticket_review` });
423
+ return !!job && job.payload?.ticket?.bodyHash === t.bodyHash;
424
+ }
425
+ export function scopeSig(issue) {
426
+ const labels = Array.isArray(issue.labels) ? issue.labels.map((l) => lc(typeof l === 'string' ? l : l?.name)).sort() : [];
427
+ return JSON.stringify({ labels, type: issue.type?.name ?? null, milestone: issue.milestone?.title ?? null });
428
+ }
429
+ export function issueState(full, n) {
430
+ return get('issue_state', issueRef(full, n));
431
+ }
432
+ /** Upserts the issue's row. Webhooks call it for every issue event, the poller for every row it reads. */
433
+ export function recordIssue(full, issue) {
434
+ const id = issueRef(full, issue.number);
435
+ const row = {
436
+ repoId: full.toLowerCase(),
437
+ number: Number(issue.number),
438
+ title: String(issue.title ?? ''),
439
+ bodyHash: bodyHash(issue.title, issue.body),
440
+ scopeSig: scopeSig(issue),
441
+ state: issue.state === 'closed' ? 'closed' : 'open',
442
+ updatedAt: String(issue.updated_at ?? new Date().toISOString()),
443
+ };
444
+ if (get('issue_state', id))
445
+ update('issue_state', id, row);
446
+ else
447
+ insert('issue_state', { id, ...row });
448
+ return get('issue_state', id);
449
+ }
450
+ /** Keeps issue_state current from a webhook delivery. Pull requests and other events are ignored. */
451
+ export function recordIssueEvent(payload) {
452
+ const issue = payload?.issue;
453
+ if (!issue?.number || issue.pull_request)
454
+ return;
455
+ const full = repoOf(payload, issue);
456
+ if (full)
457
+ recordIssue(full, issue);
458
+ }
459
+ /** The labels localdost manages for the test status write-back. Nothing else is ever removed. */
460
+ export const STATUS_LABELS = ['qa: passing', 'qa: failing'];
461
+ /** An HTTP failure of the issues API, with the status and the response text for callers that branch on it. */
462
+ export class GithubHttpError extends Error {
463
+ status;
464
+ responseText;
465
+ constructor(message, status, responseText) {
466
+ super(message);
467
+ this.status = status;
468
+ this.responseText = responseText;
469
+ }
470
+ }
471
+ /** The number names a pull request, not an issue. */
472
+ export class NotAnIssueError extends Error {
473
+ }
474
+ /** True when a 422 names the `type` field: the repo has no issue types, or not this one. */
475
+ function rejectsType(err) {
476
+ if (!(err instanceof GithubHttpError) || err.status !== 422)
477
+ return false;
478
+ try {
479
+ const parsed = JSON.parse(err.responseText);
480
+ return (parsed.errors ?? []).some((e) => lc(e.field) === 'type');
481
+ }
482
+ catch {
483
+ return false;
484
+ }
485
+ }
486
+ /**
487
+ * True when a failure may be about the labels: a token that cannot set them (403, 404, 410), or a 422 that
488
+ * names the labels field or names no field at all. A 422 that names another field (the title) is not retried.
489
+ */
490
+ function mayBeLabels(err) {
491
+ if (!(err instanceof GithubHttpError))
492
+ return false;
493
+ if ([403, 404, 410].includes(err.status))
494
+ return true;
495
+ if (err.status !== 422)
496
+ return false;
497
+ try {
498
+ const fields = (JSON.parse(err.responseText).errors ?? []).map((e) => lc(e.field)).filter(Boolean);
499
+ return fields.length === 0 || fields.includes('labels');
500
+ }
501
+ catch {
502
+ return true;
503
+ }
504
+ }
505
+ export function issueApi(full, deps = {}) {
506
+ const f = deps.fetch ?? fetch;
507
+ const token = () => (deps.token ?? githubTokenFor)(full);
508
+ /** One request; `link` is the Link header, which names the last page of a list. */
509
+ async function request(method, p, body) {
510
+ const res = await f(`${apiBase()}${p}`, {
511
+ method,
512
+ headers: { ...headers(await token()), ...(body ? { 'Content-Type': 'application/json' } : {}) },
513
+ ...(body ? { body: JSON.stringify(body) } : {}),
514
+ });
515
+ if (!res.ok) {
516
+ const text = await res.text().catch(() => '');
517
+ throw new GithubHttpError(`GitHub ${method} ${p.split('?')[0]} failed: HTTP ${res.status} ${text.slice(0, 300)}`, res.status, text);
518
+ }
519
+ return { data: (res.status === 204 ? undefined : await res.json()), link: res.headers?.get?.('link') ?? null };
520
+ }
521
+ async function call(method, p, body) {
522
+ return (await request(method, p, body)).data;
523
+ }
524
+ /** Number of the open milestone with this title, or undefined. A lookup failure only drops the milestone. */
525
+ async function milestoneNumber(title) {
526
+ try {
527
+ const rows = await call('GET', `/repos/${full}/milestones?state=open&per_page=100`);
528
+ return rows.find((m) => lc(m.title) === lc(title))?.number;
529
+ }
530
+ catch {
531
+ return undefined;
532
+ }
533
+ }
534
+ async function ownComment() {
535
+ if (deps.login || githubMode() === 'pat') {
536
+ const login = deps.login ? await deps.login() : await selfLogin(await token());
537
+ if (login)
538
+ return (c) => lc(c.user?.login) === lc(login);
539
+ }
540
+ const appId = Number(liveEnv.GITHUB_APP_ID);
541
+ // Comments an App installation writes always carry performed_via_github_app; another bot's comment does not match.
542
+ return (c) => c.user?.type === 'Bot' && (!appId || Number(c.performed_via_github_app?.id) === appId);
543
+ }
544
+ return {
545
+ async getIssue(n) {
546
+ const issue = await call('GET', `/repos/${full}/issues/${n}`);
547
+ if (issue.pull_request)
548
+ throw new NotAnIssueError(`${full}#${n} is a pull request, not an issue`);
549
+ return issueToTicket(issue, full);
550
+ },
551
+ async createIssue(draft) {
552
+ // Learn who the dot writes as before the issue exists, so its webhook is recognized as the dot's own.
553
+ if (githubMode() === 'pat')
554
+ await selfLogin(await token());
555
+ const body = { title: draft.title, body: withBotMarker(draft.body) };
556
+ if (draft.labels?.length)
557
+ body.labels = draft.labels;
558
+ if (draft.issueType)
559
+ body.type = draft.issueType;
560
+ if (draft.milestone) {
561
+ const number = await milestoneNumber(draft.milestone);
562
+ if (number)
563
+ body.milestone = number;
564
+ }
565
+ // Each failed attempt drops the one field the repo refused, so the loop ends after at most two retries.
566
+ let issue;
567
+ for (;;) {
568
+ try {
569
+ issue = await call('POST', `/repos/${full}/issues`, body);
570
+ break;
571
+ }
572
+ catch (err) {
573
+ // A repo without org issue types answers 422 on the type field. Labels still carry the class.
574
+ if (body.type && rejectsType(err)) {
575
+ delete body.type;
576
+ continue;
577
+ }
578
+ // A token that may not set labels (or a repo that refuses them) gets the issue without them.
579
+ if (body.labels && mayBeLabels(err)) {
580
+ console.warn(`[github] could not set labels on the new issue: ${err.message}`);
581
+ delete body.labels;
582
+ continue;
583
+ }
584
+ throw err;
585
+ }
586
+ }
587
+ return { number: Number(issue.number), url: String(issue.html_url ?? ''), key: `${full}#${issue.number}` };
588
+ },
589
+ async findOpenByMarker(marker, needle) {
590
+ const q = `repo:${full} is:issue is:open in:body ${needle}`;
591
+ const res = await call('GET', `/search/issues?q=${encodeURIComponent(q)}&per_page=20`);
592
+ const hit = (res.items ?? []).find((i) => !i.pull_request && String(i.body ?? '').includes(marker));
593
+ return hit ? { number: Number(hit.number), url: String(hit.html_url ?? '') } : null;
594
+ },
595
+ async addComment(n, markdown) {
596
+ await call('POST', `/repos/${full}/issues/${n}/comments`, { body: withBotMarker(markdown) });
597
+ },
598
+ async setState(n, state, reason) {
599
+ await call('PATCH', `/repos/${full}/issues/${n}`, {
600
+ state,
601
+ ...(state === 'closed' && reason ? { state_reason: reason } : state === 'open' ? { state_reason: 'reopened' } : {}),
602
+ });
603
+ },
604
+ async setStatusLabel(n, label) {
605
+ if (!STATUS_LABELS.includes(label))
606
+ throw new Error(`not a status label: ${label}`);
607
+ const have = await call('GET', `/repos/${full}/issues/${n}/labels?per_page=100`);
608
+ for (const other of STATUS_LABELS.filter((l) => l !== label)) {
609
+ if (have.some((l) => lc(l.name) === other))
610
+ await call('DELETE', `/repos/${full}/issues/${n}/labels/${encodeURIComponent(other)}`);
611
+ }
612
+ await call('POST', `/repos/${full}/issues/${n}/labels`, { labels: [label] });
613
+ },
614
+ async upsertReviewComment(n, markdown) {
615
+ const comments = [];
616
+ for (let page = 1; page <= 10; page++) {
617
+ const batch = await call('GET', `/repos/${full}/issues/${n}/comments?per_page=100&page=${page}`);
618
+ comments.push(...batch);
619
+ if (batch.length < 100)
620
+ break;
621
+ }
622
+ const mine = await ownComment();
623
+ const existing = comments.find((c) => String(c.body ?? '').includes(TICKET_REVIEW_MARKER) && mine(c));
624
+ const body = withBotMarker(markdown.includes(TICKET_REVIEW_MARKER) ? markdown : `${TICKET_REVIEW_MARKER}\n${markdown}`);
625
+ if (existing)
626
+ await call('PATCH', `/repos/${full}/issues/comments/${existing.id}`, { body });
627
+ else
628
+ await call('POST', `/repos/${full}/issues/${n}/comments`, { body });
629
+ },
630
+ async timeline(n) {
631
+ const out = [];
632
+ for (let page = 1; page <= 5; page++) {
633
+ const batch = await call('GET', `/repos/${full}/issues/${n}/timeline?per_page=100&page=${page}`);
634
+ out.push(...batch);
635
+ if (batch.length < 100)
636
+ break;
637
+ }
638
+ return out;
639
+ },
640
+ async listComments(n, max = 100) {
641
+ const path = (page) => `/repos/${full}/issues/${n}/comments?per_page=100&page=${page}`;
642
+ const first = await request('GET', path(1));
643
+ const last = Number(/[?&]page=(\d+)[^>]*>;\s*rel="last"/.exec(first.link ?? '')?.[1]) || 1;
644
+ // Rows come oldest first, so the newest are on the last page: read from there back until `max` rows are in hand.
645
+ const batches = [];
646
+ let have = 0;
647
+ let lastLen = 0;
648
+ for (let page = last; page >= 1 && have < max; page--) {
649
+ const batch = page === 1 ? first.data : await call('GET', path(page));
650
+ if (page === last)
651
+ lastLen = batch.length;
652
+ batches.unshift(batch);
653
+ have += batch.length;
654
+ }
655
+ return { rows: batches.flat().slice(-max).reverse(), total: (last - 1) * 100 + lastLen };
656
+ },
657
+ async getParent(n) {
658
+ try {
659
+ return await call('GET', `/repos/${full}/issues/${n}/parent`);
660
+ }
661
+ catch (err) {
662
+ if (err instanceof GithubHttpError && err.status === 404)
663
+ return null;
664
+ throw err;
665
+ }
666
+ },
667
+ async listSubIssues(n, max = 30) {
668
+ try {
669
+ return await call('GET', `/repos/${full}/issues/${n}/sub_issues?per_page=${Math.min(100, max)}`);
670
+ }
671
+ catch (err) {
672
+ if (err instanceof GithubHttpError && err.status === 404)
673
+ return [];
674
+ throw err;
675
+ }
676
+ },
677
+ async writePermission(login) {
678
+ if (!login)
679
+ return false;
680
+ try {
681
+ const res = await call('GET', `/repos/${full}/collaborators/${encodeURIComponent(login)}/permission`);
682
+ return ['admin', 'maintain', 'write'].includes(String(res.permission ?? ''));
683
+ }
684
+ catch (err) {
685
+ return /HTTP 404/.test(String(err)) ? false : null;
686
+ }
687
+ },
688
+ async graphql(query, variables) {
689
+ const base = apiBase();
690
+ const url = base.endsWith('/api/v3') ? `${base.replace(/\/v3$/, '')}/graphql` : `${base}/graphql`;
691
+ const res = await f(url, {
692
+ method: 'POST',
693
+ headers: { ...headers(await token()), 'Content-Type': 'application/json' },
694
+ body: JSON.stringify({ query, variables }),
695
+ });
696
+ if (!res.ok)
697
+ throw new Error(`GitHub GraphQL failed: HTTP ${res.status}`);
698
+ const body = (await res.json());
699
+ if (body.errors?.length)
700
+ throw new Error(`GitHub GraphQL error: ${body.errors.map((e) => e.message).join('; ')}`);
701
+ return body.data;
702
+ },
703
+ };
704
+ }
705
+ //# sourceMappingURL=github-issues.js.map