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
package/docs/DEPLOY.md ADDED
@@ -0,0 +1,577 @@
1
+ # Deploy localdost
2
+
3
+ localdost is one Node process and one SQLite file. A host needs three things: a folder that survives restarts for `LOCALDOST_DATA_DIR`, a `LOCALDOST_TOKEN` for the API, and an HTTPS URL for phone push and webhooks. Pick the host by where your tests must run. Set up [backups](#back-up-and-restore) before the first real use, and read [Upgrade](#upgrade) before you move to a new tag.
4
+
5
+ | Host | Good for | Test runs |
6
+ |---|---|---|
7
+ | [Railway](#railway) | Always on, no machine of yours | Yes, the default image has browsers, see [Railway limits](#railway-limits) |
8
+ | [Docker Compose](#docker-compose) | A spare server or VM you own | Yes, with the `runner` image target |
9
+ | [Your machine plus cloudflared](#your-machine-plus-cloudflared) | Fastest start, tests run in your checkout | Yes |
10
+
11
+ ## Settings every host needs
12
+
13
+ | Variable | Value |
14
+ |---|---|
15
+ | `LOCALDOST_TOKEN` | Required on any host other than your own laptop. Without it the server listens on 127.0.0.1 only, and with `HOST=0.0.0.0`, as the Docker image sets, it refuses to start. Generate it with `openssl rand -hex 24` |
16
+ | `LOCALDOST_DATA_DIR` | A persistent folder. `/data` in the Docker image |
17
+ | `LOCALDOST_PUBLIC_URL` | The HTTPS origin, for links in PR comments and for push |
18
+ | `LOCALDOST_POLL` | `1` polls GitHub and Linear, so no webhook setup is needed |
19
+ | `GITHUB_WEBHOOK_SECRET`, `JIRA_WEBHOOK_SECRET`, `LINEAR_WEBHOOK_SECRET` | One per webhook source you use. A source whose secret is unset gets a 503 and queues nothing |
20
+ | `LOCALDOST_LLM`, `ANTHROPIC_API_KEY` | `anthropic` and an API key on a server. A Claude CLI login lives on one machine, so `claude-cli` fits only your own machine |
21
+ | `GITHUB_TOKEN` | From `gh auth token`, or a fine-grained PAT. For a GitHub App, set `GITHUB_APP_ID` and `GITHUB_PRIVATE_KEY` instead, see [GITHUB.md](GITHUB.md) |
22
+ | `LINEAR_API_KEY`, or `JIRA_BASE_URL` with `JIRA_EMAIL` and `JIRA_API_TOKEN` | The tracker the dot watches, see [TRACKERS.md](TRACKERS.md). Jira has no poller, so it needs a public URL for its webhook |
23
+
24
+ `LOCALDOST_TOKEN` and `LOCALDOST_DATA_DIR` must come from the environment. Once the server runs, you can connect the model, GitHub, the tracker, Slack, voice, and the public URL from the Setup page in the app instead of the variables above. Saved values live encrypted in `LOCALDOST_DATA_DIR`, so that folder must survive restarts. Every setting is listed in [SETUP.md](SETUP.md). Send a secret to a host from stdin or from a command. Never type it as a literal on the command line, and never paste it into a chat. Each recipe below shows how.
25
+
26
+ ## Railway
27
+
28
+ The service, its volume, and its non-secret variables come from `.railway/railway.ts` (Railway Infrastructure as Code). Run these commands in the localdost checkout. They need Railway CLI 5.42.1 or newer. `railway login` opens a browser, so a person must do that step.
29
+
30
+ ```bash
31
+ cd ~/localdost
32
+ railway login
33
+ # The TinyBee staging lives in the existing project `localdost`; a fresh install makes its own.
34
+ railway link # or: railway init --name localdost
35
+
36
+ # Preview, then create the service, the 5 GB volume at /data, and the non-secret variables
37
+ railway config plan
38
+ railway config apply --yes
39
+
40
+ # Secrets: from stdin, so the value never shows in the shell history or the chat
41
+ openssl rand -hex 24 | railway variable set LOCALDOST_TOKEN --stdin --skip-deploys --service localdost
42
+ gh auth token | railway variable set GITHUB_TOKEN --stdin --skip-deploys --service localdost
43
+ printenv ANTHROPIC_API_KEY | railway variable set ANTHROPIC_API_KEY --stdin --skip-deploys --service localdost
44
+ printenv LINEAR_API_KEY | railway variable set LINEAR_API_KEY --stdin --skip-deploys --service localdost
45
+
46
+ railway up --detach --service localdost
47
+ railway domain --port 4319 --service localdost
48
+ ```
49
+
50
+ `railway domain` prints the URL, for example `https://localdost-production.up.railway.app`. Add it to the `env` block of `.railway/railway.ts` as `LOCALDOST_PUBLIC_URL`, run `railway config apply --yes` again (variables set only with the CLI and not declared in the file are removed by apply), then create the dot on the server. `railway run` passes the Railway variables, `LOCALDOST_TOKEN` included, to the local command and prints none of them:
51
+
52
+ ```bash
53
+ railway run --service localdost node bin/localdost.js init --yes --dir ~/code/shop-web --server https://localdost-production.up.railway.app
54
+ railway run --service localdost node bin/localdost.js doctor --dir ~/code/shop-web
55
+ ```
56
+
57
+ To open the app on your phone you need the token value once. `railway variable list --kv --service localdost` prints it in your own terminal. Do not paste it into a chat.
58
+
59
+ Set only the secrets you use. For Jira instead of Linear, add `JIRA_BASE_URL`, `JIRA_EMAIL`, and `JIRA_API_TOKEN` to the `env` block of the file with `preserve()` and set them with `railway variable set` the same way.
60
+
61
+ ### .railway/railway.ts
62
+
63
+ The file declares two services from the same image: `localdost` (the server and the PWA) and `hive` (the TinyBee control plane, docs/tinybee). `LOCALDOST_ROLE=hive` in the `hive` service makes `scripts/docker-entrypoint.sh` start `node dist/hive/index.js` instead of the server; nothing else differs between the two containers.
64
+
65
+ The file declares the project `localdost` with one service `localdost`, one replica, the start command `node dist/index.js`, a health check on `/` with a 60 second timeout, a volume `localdost-data` mounted at `/data`, and the deploy guards described under [Deploy guards](#deploy-guards). It sets `HOST`, `PORT`, `LOCALDOST_DATA_DIR`, `LOCALDOST_POLL`, `LOCALDOST_LLM`, and `RAILWAY_RUN_UID`. The four secrets are declared with `preserve()`, which keeps the value you set with `railway variable set`, so the file holds no secret. It sets no `source`: `railway up` uploads the folder, or you link a GitHub repo to the service.
66
+
67
+ #### Deploy guards
68
+
69
+ The `deploy` block and the service settings carry these guards:
70
+
71
+ | Setting | Value | What it does |
72
+ |---|---|---|
73
+ | `requiredMountPath` | `/data` | A deploy fails when the volume is not mounted at `/data`, so the database and artifacts never land on the container disk and vanish on the next deploy |
74
+ | `healthcheck`, `healthcheckTimeout` | `/`, 60 seconds | A new deploy takes over only after `/` answers within 60 seconds |
75
+ | `restartPolicyType`, `restartPolicyMaxRetries` | `ON_FAILURE`, 5 | A crashed server restarts up to 5 times, then stays stopped so the failure is visible |
76
+ | `drainingSeconds` | 10 | The old instance has 10 seconds after SIGTERM to finish its SQLite writes |
77
+ | `replicas` | 1 | SQLite allows one writer |
78
+
79
+ Keep them when you edit the file. They replace the same settings that the deprecated `railway.json` held.
80
+
81
+ #### Non-root user
82
+
83
+ The `runner` image runs as the user `localdost` (uid 10001), which owns `/app` and `/data`. The Playwright browsers in `/ms-playwright` are readable by every user. Docker and Docker Compose start the container as `localdost`.
84
+
85
+ Railway mounts volumes as root, and `RAILWAY_RUN_UID=0` makes it start the container as root so `/data` is reachable. The entrypoint (`scripts/docker-entrypoint.sh`) then gives `/data` to `localdost` and switches to that user with `setpriv` before the server starts. The server, the git checkouts, and the test runs all execute as `localdost`, never as root. In a shell on the service, `ps -o user= -C node` prints `localdost`.
86
+
87
+ The file has no build target. Railway builds the root `Dockerfile` and takes its last stage, which is `runner` (the Playwright image with browsers). Keep `runner` last in the `Dockerfile`; a test checks it. Edit `.railway/railway.ts`, run `railway config plan`, then `railway config apply`. The `railway` package in `devDependencies` only typechecks the file (`npm run typecheck`). The production image does not install it.
88
+
89
+ Railway deprecated Config as Code (`railway.json`) and stops reading it on 2026-12-01. New services ignore it, which is why this repo no longer has one.
90
+
91
+ ### Railway limits
92
+
93
+ - Test runs work. The default image is the `runner` target with Chromium, Firefox, and WebKit. The first run of each cloned repo installs its dependencies (`npm ci`, falling back to `npm install`), later runs with the same lockfile restore them from the cache in `/data`. The image has the browsers for Playwright 1.63; a repo that pins another Playwright version needs `npx playwright install chromium` in its `runner.setup`. Set `runner.setup` on the dot to replace that install, see [SANDBOX.md](SANDBOX.md#setup-steps). There is no Docker daemon, so the `docker` runner mode is not available.
94
+ - Chromium needs memory. Give the service at least 2 GB of RAM, and size the volume (5 GB by default) for the database, artifacts, and the dependency cache. A volume can grow but not shrink.
95
+ - SQLite needs exactly one replica. Keep `replicas` at 1.
96
+ - With a volume, each redeploy stops the old instance before the new one starts. Expect a few seconds of downtime per deploy.
97
+
98
+ ## Docker Compose
99
+
100
+ `compose.yml` starts the app on port 4319 with a named volume `localdost-data` for `/data`. Keep the token in `.env` next to `compose.yml` (gitignored), so you can read it again later:
101
+
102
+ ```bash
103
+ cd ~/localdost
104
+ printf 'LOCALDOST_TOKEN=%s\n' "$(openssl rand -hex 24)" >> .env
105
+ docker compose up -d --build
106
+ docker compose logs -f app
107
+ ```
108
+
109
+ Put the other settings from the table above in the same `.env`. Docker Compose reads it, and `.dockerignore` keeps it out of the image.
110
+
111
+ Test runs need the `runner` target, which has the Playwright browsers. Add `compose.override.yml`:
112
+
113
+ ```yaml
114
+ services:
115
+ app:
116
+ build:
117
+ target: runner
118
+ image: localdost:runner
119
+ ```
120
+
121
+ Create the dot from your machine with the token in your shell:
122
+
123
+ ```bash
124
+ export LOCALDOST_TOKEN="$(grep '^LOCALDOST_TOKEN=' ~/localdost/.env | cut -d= -f2)"
125
+ localdost init --yes --server http://your-server:4319
126
+ ```
127
+
128
+ Back up the volume as described in [Backups on Docker Compose](#backups-on-docker-compose). A `tar` of the volume while the app runs can miss writes that sit in the `-wal` file.
129
+
130
+ For HTTPS, the `tunnel` profile in `compose.yml` runs cloudflared next to the app. Create a tunnel in the Cloudflare dashboard that points to `http://app:4319`, put `CLOUDFLARE_TUNNEL_TOKEN` and `LOCALDOST_PUBLIC_URL` in `.env`, then run `docker compose --profile tunnel up -d`.
131
+
132
+ ## Your machine plus cloudflared
133
+
134
+ The server runs from the repo the dot watches, so the dot runs tests in your checkout with your browsers.
135
+
136
+ ```bash
137
+ cd ~/code/shop-web
138
+ localdost init
139
+ localdost doctor
140
+ localdost start
141
+ ```
142
+
143
+ Before you open the server to the internet, give it a token. On macOS, keep the token in the Keychain and reference it from `.env.localdost`:
144
+
145
+ ```bash
146
+ security add-generic-password -a localdost -s LOCALDOST_TOKEN -w "$(openssl rand -hex 24)"
147
+ ```
148
+
149
+ ```bash
150
+ # .env.localdost
151
+ LOCALDOST_TOKEN=${cmd:security find-generic-password -a localdost -s LOCALDOST_TOKEN -w}
152
+ ```
153
+
154
+ On Linux, `pass` works the same way: `LOCALDOST_TOKEN=${cmd:pass show localdost/token}`. A `${cmd:...}` reference runs only a read-only command (`gh auth token`, `op read`, `security find-generic-password`, or `pass show`), and never through a shell.
155
+
156
+ A quick tunnel needs no Cloudflare account. Its URL changes on every start. With `cloudflared` installed, the Public URL row in Setup starts one with **Quick tunnel**. To start it yourself:
157
+
158
+ ```bash
159
+ cloudflared tunnel --url http://localhost:4319
160
+ ```
161
+
162
+ For a URL that stays the same, use a named tunnel on a domain in your Cloudflare account:
163
+
164
+ ```bash
165
+ cloudflared tunnel login
166
+ cloudflared tunnel create localdost
167
+ cloudflared tunnel route dns localdost qa.example.com
168
+ cloudflared tunnel run --url http://localhost:4319 localdost
169
+ ```
170
+
171
+ Then enter `https://qa.example.com` in Setup with **My own address** on the Public URL row, or set `LOCALDOST_PUBLIC_URL=https://qa.example.com` in `.env.localdost` and restart `localdost start`. The server stays on 127.0.0.1. cloudflared reaches it there, and only the tunnel is public.
172
+
173
+ ## Check a deploy
174
+
175
+ `localdost doctor --server <url>` asks the server for `/api/setup` and lists the dots on it. It exits 1 when the server, the model, GitHub, the tracker, or the dot is not ready, and prints a fix command for each line. Two other checks answer one question each: `localdost doctor --restore-check <folder>` says whether a backup can be restored, and `localdost doctor --idle` says whether a run or job is active. Both are in the sections below.
176
+
177
+ ## Back up and restore
178
+
179
+ localdost keeps its state in one folder, `LOCALDOST_DATA_DIR` (`/data` in the Docker image). Back it up every day and before each upgrade. Check each backup with `localdost doctor --restore-check`. Try one restore before you need it. The host recipes at the end of this section cover [Docker Compose](#backups-on-docker-compose), [Node with a start script](#backups-on-node-with-a-start-script), [Railway](#backups-on-railway), and [Kubernetes](#backups-on-kubernetes).
180
+
181
+ ### What to copy
182
+
183
+ | In the data folder | What it holds | Copy it? |
184
+ |---|---|---|
185
+ | `localdost.db` | The database: dots, runs, drafts, approvals, paired devices, and the settings saved in Setup. It runs in WAL mode, so its newest writes sit in `localdost.db-wal` and `localdost.db-shm` beside it | Always, with the SQLite backup command below. A file copy can miss those writes |
186
+ | `secret.key` | The key that encrypts the tokens saved in Setup. It also signs the hidden marker in every comment the dot posts | Always, from the same moment as the database |
187
+ | `vapid.json` | The push keys of this server | Always. Without it, each phone turns notifications on again |
188
+ | `artifacts/` | Screenshots, traces, and reports of past runs | When old run pages must keep their evidence. It can be large |
189
+ | `eval-candidates/` | Review cases saved for the eval set | When you use them |
190
+ | `mirrors/`, `checkouts/`, `worktrees/`, `runner-cache/`, `repo-cache/`, `graph-cache/` | Git mirrors, checkouts, and caches. localdost rebuilds them | No |
191
+
192
+ Two things live outside the data folder. When `LOCALDOST_DB` is set, the database is the file it names, so back up that file. The settings you give the server as variables sit in the host's own store, outside the data folder: `LOCALDOST_TOKEN`, `GITHUB_TOKEN`, `ANTHROPIC_API_KEY`, the webhook secrets, and the secret variable of each MCP connection (a connection stores only its name). That store is the `.env` next to `compose.yml`, `.env.localdost`, the Railway variables, or a Kubernetes Secret. Keep those values in your secret manager.
193
+
194
+ ### A backup without secret.key
195
+
196
+ Setup encrypts every token it saves, and `secret.key` holds the key. A backup without that file restores the database, but every saved token reads as not set. A dot that relies on saved tokens cannot reach GitHub, the tracker, or the model until you enter them again in Setup.
197
+
198
+ The same key signs the hidden marker in every comment and issue the dot posts. A restore without it makes a new key, so the markers in the dot's earlier comments no longer verify, and the dot reads its own earlier comments as written by a person, see [TRACKERS.md](TRACKERS.md). This holds when every token is a variable on the host and Setup saved none. `localdost doctor --restore-check` fails for such a backup.
199
+
200
+ When you set `LOCALDOST_SECRET_KEY` on the host, the server makes no `secret.key` file. Keep that value in your secret manager with the other variables. Export the same value in the shell that runs `--restore-check`, and the check uses it in place of the file. Set it before you save the first token, because a value saved under one key cannot be read with another.
201
+
202
+ A backup that holds both the database and `secret.key` lets anyone who opens it read every saved token. Keep backups where only the admins can read them.
203
+
204
+ ### Take a copy while the server runs
205
+
206
+ SQLite copies a live database in one consistent step, and the server keeps running. Node 24 has this built in. The images have no `sqlite3` command, so the recipes use Node:
207
+
208
+ The recipes below set `db` to the database file the server uses: the file `LOCALDOST_DB` names when it is set, else `localdost.db` in `LOCALDOST_DATA_DIR`. Use the same two variables as the server, or the backup copies another file.
209
+
210
+ ```bash
211
+ db="${LOCALDOST_DB:-$LOCALDOST_DATA_DIR/localdost.db}"
212
+ SNAP='const s=require("node:sqlite");const d=new s.DatabaseSync(process.argv[1],{readOnly:true});s.backup(d,process.argv[2]).then(()=>d.close())'
213
+ node -e "$SNAP" "$db" ~/localdost-backups/now/localdost.db
214
+ ```
215
+
216
+ Where the `sqlite3` command exists, `sqlite3 "$db" ".backup '$HOME/localdost-backups/now/localdost.db'"` does the same. If you can stop the server for a minute, copying the whole folder while it is stopped also works.
217
+
218
+ Do not copy `localdost.db` with `cp`, `tar`, or a volume copy while the server runs. The file alone lacks the writes that sit in `localdost.db-wal`. `--restore-check` reports a copy that shows no tables at all, and a copy that has a `-wal` file beside it. It cannot report a copy that only lacks the newest writes. That copy can pass every check and still miss the last hours of work, so take every copy with the backup command above.
219
+
220
+ ### How often
221
+
222
+ Back up every day and before every upgrade. A restore loses everything after its backup: runs, drafts, approvals, and decisions. Keep the last 7 daily copies, and keep the copy taken before the last upgrade. Run the backup from cron, launchd, or whatever scheduler your host has.
223
+
224
+ ### Check a backup
225
+
226
+ Run this on the backup folder after each backup:
227
+
228
+ ```bash
229
+ localdost doctor --restore-check ~/localdost-backups/2026-10-14-0300
230
+ ```
231
+
232
+ ```text
233
+ ok Backup folder /home/me/localdost-backups/2026-10-14-0300
234
+ ok Database opens read-only in a temp copy and passes its self-check
235
+ ok Schema matches localdost 0.10.0 (34 tables)
236
+ ok Saved tokens secret.key decrypts all 4 saved values
237
+ ok Push keys vapid.json found
238
+
239
+ This backup can be restored.
240
+ ```
241
+
242
+ The check copies `localdost.db` (and its `-wal` and `-shm` files, when the backup has them) to a temp folder and opens the copy read-only, so the backup is never changed. It prints no token, key, or saved value. The exit code is 0 when no line says `FAIL`, and 1 otherwise. A `warn` line does not change the exit code.
243
+
244
+ | Line | What it tests |
245
+ |---|---|
246
+ | Database | The file opens and passes SQLite's quick self-check. A warning follows when the backup holds a `-wal` file, because then the database was copied as a plain file. It cannot see that a plain copy lacks the newest writes |
247
+ | Schema | Every table and column is one this version creates, the tables that the start migrates and the ones their modules create on first use (report pages, saved Setup values, MCP connections, poll cursors). An older backup passes, and the line says what the next start adds. A backup from a newer version fails on the first table or column this version does not know: restore it with that tag or a newer one |
248
+ | Saved tokens | `secret.key` from the backup decrypts the saved values. It fails when the key is missing, also when the backup holds no saved tokens, because the same key signs the marker in every comment the dot posts. It fails when the key decrypts none of the values, and when it decrypts only some of them, since the rest would be lost. It warns when the key is there and the backup holds no saved tokens, because there is nothing to test it against. When the backup has no `secret.key`, the check uses `LOCALDOST_SECRET_KEY` from your shell |
249
+ | Push keys | `vapid.json` is in the backup. A warning says each phone must turn notifications on again |
250
+
251
+ Run it from a checkout of the version you plan to restore into. `localdost` is the command that `npm link` makes, see the README. Without it, use `node bin/localdost.js`. The Docker image has no `bin` folder, so inside a container use `node /app/dist/cli/index.js doctor --restore-check <folder>`. The check needs room in the temp folder for one copy of `localdost.db`.
252
+
253
+ ### Restore
254
+
255
+ 1. Run `localdost doctor --restore-check` on the backup folder.
256
+ 2. Stop the server. No process may have the database open.
257
+ 3. Copy the current database file, its `-wal` and `-shm` files, `secret.key`, and `vapid.json` somewhere safe. The database file is the one the server uses: `LOCALDOST_DB` when set, else `localdost.db` in the data folder. Copy the ones that exist. You may need them if the backup is wrong.
258
+ 4. Delete the `-wal` and `-shm` files that sit beside the database. An old `-wal` file beside a restored database can corrupt it.
259
+ 5. Put the database at the path the server uses, and `secret.key` and `vapid.json` from the backup in the data folder, the ones the backup holds. Add `artifacts/` if you backed it up. A host that sets `LOCALDOST_SECRET_KEY` has no `secret.key`, and a host that sets the `VAPID_*` variables has no `vapid.json`. Skip a file that is not in the backup.
260
+ 6. Give the files to the user that runs the server, and keep `secret.key` at mode 600.
261
+ 7. Start the server. Read the version at `/api/health`, then open Setup. A saved token that shows as not set means the key is wrong.
262
+
263
+ The recipes below do steps 3 to 6 in that order. Each one saves the current files first, copies only the files the backup holds, and removes no file until the safety copy is made. Set `out` in each one to the backup folder that passed the check.
264
+
265
+ The restored database knows nothing after the backup. The dot can review a PR again when that PR changes, and comments it already posted stay on GitHub. A backup older than an hour counts as a gap, and polling catches up as described in [Poll mode](SETUP.md#poll-mode). GitHub does not resend webhook events that a stopped server missed, unless you redeliver them in the webhook settings.
266
+
267
+ ### Backups on Docker Compose
268
+
269
+ The data folder is the volume `localdost_localdost-data`, mounted at `/data` in the `app` service. The `db` line asks the container for the database path the server uses, which is `/data/localdost.db` unless the service sets `LOCALDOST_DB`. Copy that database, `secret.key`, and `vapid.json`. A backup without `secret.key` cannot decrypt the saved tokens. Run this once a day from the folder that holds `compose.yml`:
270
+
271
+ ```bash
272
+ out=~/localdost-backups/$(date +%F-%H%M) && mkdir -p "$out" && chmod 700 "$out"
273
+ SNAP='const s=require("node:sqlite");const d=new s.DatabaseSync(process.argv[1],{readOnly:true});s.backup(d,process.argv[2]).then(()=>d.close())'
274
+ db=$(docker compose exec -T app sh -c 'echo "${LOCALDOST_DB:-$LOCALDOST_DATA_DIR/localdost.db}"')
275
+ docker compose exec -T app node -e "$SNAP" "$db" /data/backup.tmp.db
276
+ docker compose cp app:/data/backup.tmp.db "$out/localdost.db"
277
+ docker compose exec -T app rm /data/backup.tmp.db
278
+ docker compose cp app:/data/secret.key "$out/secret.key"
279
+ docker compose cp app:/data/vapid.json "$out/vapid.json"
280
+ docker compose cp app:/data/artifacts "$out/artifacts" # optional, and can be large
281
+ node bin/localdost.js doctor --restore-check "$out"
282
+ ```
283
+
284
+ To restore, stop the app, put the files in the volume with a throwaway container, and start the app. Read the database path from the running app first, as in the backup. It must lie in the volume. The container first copies the current files to `$before` on the host. It stops before it removes anything when that copy fails. Then it copies each file the backup holds and gives it the owner of `/data` itself: user `node` in the `app` image and user `localdost` in the `runner` image. A file that the backup lacks stays as it is in the volume.
285
+
286
+ ```bash
287
+ out=~/localdost-backups/2026-10-14-0300 # the backup folder that passed the check
288
+ before=~/localdost-backups/before-restore-$(date +%F-%H%M) && mkdir -p "$before" && chmod 700 "$before"
289
+ db=$(docker compose exec -T app sh -c 'echo "${LOCALDOST_DB:-$LOCALDOST_DATA_DIR/localdost.db}"')
290
+ docker compose stop app
291
+ docker run --rm -e DB="$db" -v localdost_localdost-data:/data -v "$out":/backup:ro -v "$before":/before alpine sh -ec '
292
+ for s in "" -wal -shm; do
293
+ if [ -f "$DB$s" ]; then cp -p "$DB$s" "/before/localdost.db$s"; fi
294
+ done
295
+ for f in secret.key vapid.json; do
296
+ if [ -f /data/$f ]; then cp -p /data/$f /before/; fi
297
+ done
298
+ rm -f "$DB" "$DB-wal" "$DB-shm"
299
+ if [ -f /backup/localdost.db ]; then
300
+ cp /backup/localdost.db "$DB"
301
+ chown "$(stat -c %u:%g /data)" "$DB"
302
+ fi
303
+ for f in secret.key vapid.json; do
304
+ if [ -f /backup/$f ]; then
305
+ cp /backup/$f /data/$f
306
+ chown "$(stat -c %u:%g /data)" /data/$f
307
+ fi
308
+ done
309
+ if [ -f /data/secret.key ]; then chmod 600 /data/secret.key; fi'
310
+ docker compose start app
311
+ ```
312
+
313
+ ### Backups on Node with a start script
314
+
315
+ This host runs `node dist/index.js`, or `localdost start`, from a checkout under a script of your own that sets the environment. For example `start.sh`. The repo does not ship that script. Set `LOCALDOST_DATA_DIR` in it, and `LOCALDOST_DB` when it sets that too, and export the same values in the shell that runs the backup. Copy the database, `secret.key`, and `vapid.json`. A backup without `secret.key` cannot decrypt the saved tokens. Put these lines in a script and run it daily:
316
+
317
+ ```bash
318
+ out=~/localdost-backups/$(date +%F-%H%M) && mkdir -p "$out" && chmod 700 "$out"
319
+ SNAP='const s=require("node:sqlite");const d=new s.DatabaseSync(process.argv[1],{readOnly:true});s.backup(d,process.argv[2]).then(()=>d.close())'
320
+ db="${LOCALDOST_DB:-$LOCALDOST_DATA_DIR/localdost.db}"
321
+ node -e "$SNAP" "$db" "$out/localdost.db"
322
+ cp "$LOCALDOST_DATA_DIR/secret.key" "$LOCALDOST_DATA_DIR/vapid.json" "$out/"
323
+ cd ~/localdost && node bin/localdost.js doctor --restore-check "$out"
324
+ ```
325
+
326
+ To restore, stop the server the way your start script does, then:
327
+
328
+ ```bash
329
+ out=~/localdost-backups/2026-10-14-0300 # the backup folder that passed the check
330
+ before=~/localdost-backups/before-restore-$(date +%F-%H%M) && mkdir -p "$before" && chmod 700 "$before"
331
+ db="${LOCALDOST_DB:-$LOCALDOST_DATA_DIR/localdost.db}"
332
+ for s in "" -wal -shm; do
333
+ if [ -f "$db$s" ]; then cp -p "$db$s" "$before/localdost.db$s"; fi
334
+ done
335
+ for f in secret.key vapid.json; do
336
+ if [ -f "$LOCALDOST_DATA_DIR/$f" ]; then cp -p "$LOCALDOST_DATA_DIR/$f" "$before/"; fi
337
+ done
338
+ rm -f "$db-wal" "$db-shm"
339
+ if [ -f "$out/localdost.db" ]; then cp "$out/localdost.db" "$db"; fi
340
+ for f in secret.key vapid.json; do
341
+ if [ -f "$out/$f" ]; then cp "$out/$f" "$LOCALDOST_DATA_DIR/"; fi
342
+ done
343
+ if [ -f "$LOCALDOST_DATA_DIR/secret.key" ]; then chmod 600 "$LOCALDOST_DATA_DIR/secret.key"; fi
344
+ ```
345
+
346
+ Run the commands as the user that owns the data folder, so the copied files keep that owner. The current files are in `$before`. Then start the server with `start.sh`.
347
+
348
+ ### Backups on Railway
349
+
350
+ The data folder is the volume `localdost-data`, mounted at `/data`. The database is `/data/localdost.db` unless you set `LOCALDOST_DB` on the service, and then it is the file that variable names, which must lie in the volume. Copy the database, `secret.key`, and `vapid.json`. A backup without `secret.key` cannot decrypt the saved tokens. The other secrets are Railway variables: keep their values in your secret manager. `railway variable list --kv --service localdost` prints them in your own terminal, and you never paste the output into a chat.
351
+
352
+ The snapshot runs inside the service, and `railway volume files` brings the files to your machine. Open a shell on the running service, paste the next three lines, then type `exit`. The `db` line takes `LOCALDOST_DB` from the service. Run `echo "$db"` to read it. When you set `LOCALDOST_DB` and it prints the default, the shell did not carry the variable, so set `db` to that path by hand:
353
+
354
+ ```bash
355
+ railway ssh --service localdost
356
+ db="${LOCALDOST_DB:-/data/localdost.db}"
357
+ SNAP='const s=require("node:sqlite");const d=new s.DatabaseSync(process.argv[1],{readOnly:true});s.backup(d,process.argv[2]).then(()=>d.close())'
358
+ node -e "$SNAP" "$db" /data/backup.tmp.db
359
+ exit
360
+ ```
361
+
362
+ ```bash
363
+ out=~/localdost-backups/$(date +%F-%H%M) && mkdir -p "$out" && chmod 700 "$out"
364
+ railway volume files --volume localdost-data download /backup.tmp.db "$out/localdost.db"
365
+ railway volume files --volume localdost-data download /secret.key "$out/secret.key"
366
+ railway volume files --volume localdost-data download /vapid.json "$out/vapid.json"
367
+ railway ssh --service localdost -- rm /data/backup.tmp.db
368
+ node bin/localdost.js doctor --restore-check "$out"
369
+ ```
370
+
371
+ To restore, remove the running deployment and download the current files to `$before`. `db` is the path the server uses, as in the backup, and `dbv` is the same path inside the volume:
372
+
373
+ ```bash
374
+ out=~/localdost-backups/2026-10-14-0300 # the backup folder that passed the check
375
+ before=~/localdost-backups/before-restore-$(date +%F-%H%M) && mkdir -p "$before" && chmod 700 "$before"
376
+ db=/data/localdost.db # or the file LOCALDOST_DB names, when you set that on the service. It lies inside /data
377
+ dbv=${db#/data}
378
+ railway down --service localdost --yes
379
+ for s in "" -wal -shm; do
380
+ railway volume files --volume localdost-data download "$dbv$s" "$before/localdost.db$s"
381
+ done
382
+ for f in secret.key vapid.json; do
383
+ railway volume files --volume localdost-data download "/$f" "$before/$f"
384
+ done
385
+ ls -l "$before"
386
+ ```
387
+
388
+ A download line prints an error when its file is not on the volume. That is normal for the `-wal` and `-shm` files of the database after a clean stop, and for `secret.key` and `vapid.json` when the host sets them as variables. Go on only when `$before` holds `localdost.db`. Then replace the files on the volume and deploy again from the tag you run:
389
+
390
+ ```bash
391
+ railway volume files --volume localdost-data delete "$dbv-wal" --yes
392
+ railway volume files --volume localdost-data delete "$dbv-shm" --yes
393
+ if [ -f "$out/localdost.db" ]; then railway volume files --volume localdost-data upload "$out/localdost.db" "$dbv" --overwrite; fi
394
+ for f in secret.key vapid.json; do
395
+ if [ -f "$out/$f" ]; then railway volume files --volume localdost-data upload "$out/$f" "/$f" --overwrite; fi
396
+ done
397
+ railway up --detach --service localdost
398
+ ```
399
+
400
+ The entrypoint gives `/data` to `localdost` only when the folder itself belongs to someone else. If the server then fails with `attempt to write a readonly database` or `unable to open database file`, the uploaded files belong to another user. Run `railway ssh --service localdost -- chown -R localdost:localdost /data`, then `railway restart --service localdost --yes`. A delete line prints an error when its `-wal` or `-shm` file is already gone. Ignore that error.
401
+
402
+ ### Backups on Kubernetes
403
+
404
+ This repo ships no manifests. The steps assume one Deployment `localdost` with a single replica and the strategy `Recreate`, a PersistentVolumeClaim `localdost-data` mounted at `/data`, the label `app=localdost`, a container named `localdost`, and the namespace `localdost`. SQLite allows one writer, so the Deployment must never run two pods on the volume. The database is `/data/localdost.db` unless the Deployment sets `LOCALDOST_DB`, and then it is the file that variable names, which must lie on the claim. Copy the database, `secret.key`, and `vapid.json`. A backup without `secret.key` cannot decrypt the saved tokens. Keep the other secrets in the Kubernetes Secret that the Deployment reads, and keep a copy of that Secret in your secret manager.
405
+
406
+ ```bash
407
+ out=~/localdost-backups/$(date +%F-%H%M) && mkdir -p "$out" && chmod 700 "$out"
408
+ pod=$(kubectl -n localdost get pod -l app=localdost -o jsonpath='{.items[0].metadata.name}')
409
+ SNAP='const s=require("node:sqlite");const d=new s.DatabaseSync(process.argv[1],{readOnly:true});s.backup(d,process.argv[2]).then(()=>d.close())'
410
+ db=$(kubectl -n localdost exec "$pod" -- sh -c 'echo "${LOCALDOST_DB:-$LOCALDOST_DATA_DIR/localdost.db}"')
411
+ kubectl -n localdost exec "$pod" -- node -e "$SNAP" "$db" /data/backup.tmp.db
412
+ kubectl -n localdost cp "$pod":/data/backup.tmp.db "$out/localdost.db"
413
+ kubectl -n localdost exec "$pod" -- rm /data/backup.tmp.db
414
+ kubectl -n localdost cp "$pod":/data/secret.key "$out/secret.key"
415
+ kubectl -n localdost cp "$pod":/data/vapid.json "$out/vapid.json"
416
+ node bin/localdost.js doctor --restore-check "$out"
417
+ ```
418
+
419
+ A volume snapshot of the claim makes a good second copy. It does not replace this one, because it carries no check of the schema or the key.
420
+
421
+ To restore, scale the Deployment to zero and start a helper pod that mounts the claim. Use the image of the Deployment, so the pod has `tar`. Use the same `runAsUser` and `fsGroup`, so the files get the right owner:
422
+
423
+ ```yaml
424
+ apiVersion: v1
425
+ kind: Pod
426
+ metadata:
427
+ name: localdost-restore
428
+ namespace: localdost
429
+ spec:
430
+ restartPolicy: Never
431
+ securityContext:
432
+ runAsUser: 10001
433
+ fsGroup: 10001
434
+ containers:
435
+ - name: shell
436
+ image: <the image of the Deployment>
437
+ command: ['sleep', '3600']
438
+ volumeMounts:
439
+ - name: data
440
+ mountPath: /data
441
+ volumes:
442
+ - name: data
443
+ persistentVolumeClaim:
444
+ claimName: localdost-data
445
+ ```
446
+
447
+ Read the database path from the running pod, as in the backup. Then scale down, start the pod, and copy the current files to `$before` on your machine:
448
+
449
+ ```bash
450
+ out=~/localdost-backups/2026-10-14-0300 # the backup folder that passed the check
451
+ before=~/localdost-backups/before-restore-$(date +%F-%H%M) && mkdir -p "$before" && chmod 700 "$before"
452
+ pod=$(kubectl -n localdost get pod -l app=localdost -o jsonpath='{.items[0].metadata.name}')
453
+ db=$(kubectl -n localdost exec "$pod" -- sh -c 'echo "${LOCALDOST_DB:-$LOCALDOST_DATA_DIR/localdost.db}"')
454
+ kubectl -n localdost scale deploy/localdost --replicas=0
455
+ kubectl -n localdost apply -f restore-pod.yaml
456
+ kubectl -n localdost wait --for=condition=Ready pod/localdost-restore
457
+ for s in "" -wal -shm; do
458
+ if kubectl -n localdost exec localdost-restore -- test -f "$db$s"; then kubectl -n localdost cp "localdost-restore:$db$s" "$before/localdost.db$s"; fi
459
+ done
460
+ for f in secret.key vapid.json; do
461
+ if kubectl -n localdost exec localdost-restore -- test -f "/data/$f"; then kubectl -n localdost cp "localdost-restore:/data/$f" "$before/$f"; fi
462
+ done
463
+ ls -l "$before"
464
+ ```
465
+
466
+ The listing shows what the pod held. Go on only when `$before` holds `localdost.db`. Then replace the files and scale up. The copy lines run only for a file the backup holds:
467
+
468
+ ```bash
469
+ kubectl -n localdost exec localdost-restore -- rm -f "$db" "$db-wal" "$db-shm"
470
+ if [ -f "$out/localdost.db" ]; then kubectl -n localdost cp "$out/localdost.db" "localdost-restore:$db"; fi
471
+ for f in secret.key vapid.json; do
472
+ if [ -f "$out/$f" ]; then kubectl -n localdost cp "$out/$f" "localdost-restore:/data/$f"; fi
473
+ done
474
+ kubectl -n localdost exec localdost-restore -- sh -c 'if [ -f /data/secret.key ]; then chmod 600 /data/secret.key; fi'
475
+ kubectl -n localdost delete pod localdost-restore
476
+ kubectl -n localdost scale deploy/localdost --replicas=1
477
+ ```
478
+
479
+ ## Upgrade
480
+
481
+ An upgrade is a new tag, a rebuild, and a restart. The steps are the same on every host, and only the commands differ. A restart interrupts every running run, so wait until nothing runs.
482
+
483
+ 1. Pick a tag. Run `git fetch --tags` in the localdost checkout, then `git tag --list 'v*' --sort=-v:refname | head -5`. The version you run now is `version` in the answer of `GET /api/health`.
484
+ 2. Read `CHANGELOG.md` in the repo for every version from yours up to the new tag. A minor version (0.x.0) adds features or breaks something. A patch version (0.x.y) only fixes bugs. Read Changed and Security first.
485
+ 3. Wait until no run or job is active, see below.
486
+ 4. Back up the data folder and check the backup, see [Back up and restore](#back-up-and-restore). This backup is what you restore on a rollback.
487
+ 5. Switch to the tag, build, and restart, with the commands for your host below.
488
+ 6. Check the result, see below.
489
+
490
+ ### Wait until idle
491
+
492
+ `localdost doctor --idle` exits 0 when no run and no job is active, 1 when one is, and 2 when it cannot read the database. It reads the database the server uses read-only, and it prints one line each for runs and jobs. It finds that file the way the server does: `LOCALDOST_DB` when set, else `localdost.db` in `LOCALDOST_DATA_DIR`, each from your shell first and then from `.env.localdost` in `--dir` (default: the current folder). A `${cmd:...}` reference in that file is never run, so export the value in your shell instead. Run it as the user that runs the server. A run that is going, a job that is going, and a job that is ready to start all count. A job scheduled for later (a debounce wait, a retry back-off) keeps its row and starts after the restart, so it does not count.
493
+
494
+ While the disk is low or a write failed, localdost holds back new test runs, and the jobs that wait for them count as waiting to start until space returns. Free disk space and the count drops. A restart does not interrupt a job that only waits, so you can also restart anyway.
495
+
496
+ | Host | Command |
497
+ |---|---|
498
+ | Docker Compose | `docker compose exec -T app node dist/cli/index.js doctor --idle` |
499
+ | Node with a start script | `localdost doctor --idle`, with `LOCALDOST_DATA_DIR` and `LOCALDOST_DB` exported as in your start script, or run from the folder of `.env.localdost` |
500
+ | Railway | `railway ssh --service localdost -- env LOCALDOST_DATA_DIR=/data node /app/dist/cli/index.js doctor --idle` |
501
+ | Kubernetes | `kubectl -n localdost exec deploy/localdost -- env LOCALDOST_DATA_DIR=/data node /app/dist/cli/index.js doctor --idle` |
502
+
503
+ ```text
504
+ ok Database /data/localdost.db
505
+ FAIL Runs 1 running
506
+ fix: wait and run this again. A restart now interrupts a running run, and its run page offers Retry
507
+ ok Jobs none running or waiting to start
508
+
509
+ Not idle. See the lines above, wait, then run this again.
510
+ ```
511
+
512
+ On a Node host you can wait in a loop:
513
+
514
+ ```bash
515
+ until localdost doctor --idle; [ $? -ne 1 ]; do sleep 30; done
516
+ ```
517
+
518
+ The loop prints each answer. It waits while the exit code is 1, and it stops on 0 (idle) and on 2 (it cannot tell, so read the line it printed). A wrong `LOCALDOST_DATA_DIR` or a wrong user gives 2. The answer is true at one moment, and a webhook can start a job a second later. If a restart cuts a run off, it stays in the feed as Interrupted with a Retry button, and a queued job waits for the new process. If the server is stopped and the check still finds a running run, a crash left it behind, and the next start marks it interrupted.
519
+
520
+ ### Switch to the new tag
521
+
522
+ ```bash
523
+ cd ~/localdost
524
+ git fetch --tags && git checkout v0.11.0 # the tag you picked
525
+ ```
526
+
527
+ Then, for your host:
528
+
529
+ ```bash
530
+ # Docker Compose: rebuilds the image and recreates the container
531
+ docker compose up -d --build
532
+
533
+ # Node with a start script: stop the server first, so the build does not replace files that a running server reads
534
+ npm ci && npm run build
535
+ bash ./start.sh
536
+
537
+ # Railway: uploads this folder and deploys it
538
+ railway up --detach --service localdost
539
+
540
+ # Kubernetes: build and push the image of the tag, then set it. The Recreate strategy stops the old pod first
541
+ docker build --target runner -t <registry>/localdost:v0.11.0 . && docker push <registry>/localdost:v0.11.0
542
+ kubectl -n localdost set image deploy/localdost localdost=<registry>/localdost:v0.11.0
543
+ kubectl -n localdost rollout status deploy/localdost
544
+ ```
545
+
546
+ ### What runs at start
547
+
548
+ Every start applies these steps in this order. Each one is safe to run again.
549
+
550
+ | Step | What it does |
551
+ |---|---|
552
+ | Schema update | Creates missing tables, adds missing columns, and creates missing indexes, in one transaction. It never drops a table or a column. On a full disk it rolls back whole, and the server starts on the old tables |
553
+ | Repo sets | Moves a dot with one repo to the repo-set form and adds its repos to the workspace |
554
+ | Stage settings | Fills the stage settings a dot lacks, and sets the one-time offer of new stages. It never changes a choice you made |
555
+ | Test runs | Gives results from before test runs existed their automated test runs |
556
+ | Default engine | Picks the workspace test engine when none is chosen |
557
+ | Sweeps | Removes PR checkouts, test worktrees, and mirror metadata that a crash left behind |
558
+ | Interrupted work | Marks every run and job that the old process left running as interrupted, just before the queue opens. A run gets a Retry button |
559
+
560
+ The CHANGELOG names any release that adds a step to this list.
561
+
562
+ ### Check the upgrade
563
+
564
+ - `GET /api/health` shows the new `version` and `commit`: `curl -s -H "authorization: Bearer $LOCALDOST_TOKEN" https://localdost.example.com/api/health`.
565
+ - The log has `boot ready: queue open`, and `recovered N interrupted job(s)` when the restart cut runs off.
566
+ - The Setup page shows every service you use as ready, and no saved token asks to be entered again.
567
+
568
+ A restart that takes under an hour needs nothing more: polling continues from its stored cursor. After a longer gap, polling takes the open PRs and the issues that changed during it, at most 5 per dot, and each such run starts with a "Caught up after a gap" step, see [Poll mode](SETUP.md#poll-mode). GitHub does not resend webhook events that a stopped server missed, unless you redeliver them in the webhook settings.
569
+
570
+ ### Roll back
571
+
572
+ 1. Stop the server.
573
+ 2. Check out the previous tag and build it again, or set the previous image.
574
+ 3. Restore the backup taken before the upgrade, see [Restore](#restore).
575
+ 4. Start the server and read `version` at `/api/health`.
576
+
577
+ Restoring the database is the safe rollback. An upgrade only adds tables and columns, so an older version can often open a newer database. Do not rely on it, because the start steps above also fill in dot settings. A rollback loses what happened after the backup, and the paragraph under [Restore](#restore) tells what that means.