lastlight 0.1.15 → 0.2.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 (478) hide show
  1. package/README.md +265 -118
  2. package/agent-context/rules.md +62 -9
  3. package/agent-context/security.md +69 -0
  4. package/config/default.yaml +89 -0
  5. package/deploy/.env.production.example +20 -2
  6. package/deploy/entrypoint.sh +16 -17
  7. package/deploy/native/README.md +160 -0
  8. package/deploy/native/install.sh +110 -0
  9. package/deploy/native/lastlight.env.example +95 -0
  10. package/deploy/native/lastlight.service +50 -0
  11. package/deploy/sandbox-entrypoint.sh +59 -42
  12. package/dist/admin/auth.d.ts +1 -1
  13. package/dist/admin/auth.js +3 -1
  14. package/dist/admin/auth.js.map +1 -1
  15. package/dist/admin/chat-session-reader.d.ts +11 -14
  16. package/dist/admin/chat-session-reader.js +27 -51
  17. package/dist/admin/chat-session-reader.js.map +1 -1
  18. package/dist/admin/docker.d.ts +37 -0
  19. package/dist/admin/docker.js +86 -1
  20. package/dist/admin/docker.js.map +1 -1
  21. package/dist/admin/index.js +38 -3
  22. package/dist/admin/index.js.map +1 -1
  23. package/dist/admin/log-search.test.d.ts +1 -0
  24. package/dist/admin/log-search.test.js +78 -0
  25. package/dist/admin/log-search.test.js.map +1 -0
  26. package/dist/admin/routes.d.ts +52 -3
  27. package/dist/admin/routes.js +780 -63
  28. package/dist/admin/routes.js.map +1 -1
  29. package/dist/admin/routes.test.js +680 -14
  30. package/dist/admin/routes.test.js.map +1 -1
  31. package/dist/admin/server-logs.test.d.ts +1 -0
  32. package/dist/admin/server-logs.test.js +58 -0
  33. package/dist/admin/server-logs.test.js.map +1 -0
  34. package/dist/admin/sessions.d.ts +26 -39
  35. package/dist/admin/sessions.js +86 -310
  36. package/dist/admin/sessions.js.map +1 -1
  37. package/dist/admin/sessions.test.d.ts +1 -0
  38. package/dist/admin/sessions.test.js +78 -0
  39. package/dist/admin/sessions.test.js.map +1 -0
  40. package/dist/admin/version.d.ts +15 -0
  41. package/dist/admin/version.js +73 -0
  42. package/dist/admin/version.js.map +1 -0
  43. package/dist/admin/version.test.d.ts +1 -0
  44. package/dist/admin/version.test.js +71 -0
  45. package/dist/admin/version.test.js.map +1 -0
  46. package/dist/cli-config.d.ts +55 -0
  47. package/dist/cli-config.js +119 -0
  48. package/dist/cli-config.js.map +1 -0
  49. package/dist/cli-config.test.d.ts +1 -0
  50. package/dist/cli-config.test.js +92 -0
  51. package/dist/cli-config.test.js.map +1 -0
  52. package/dist/cli-format.d.ts +19 -0
  53. package/dist/cli-format.js +107 -0
  54. package/dist/cli-format.js.map +1 -0
  55. package/dist/cli-server.d.ts +73 -0
  56. package/dist/cli-server.js +347 -0
  57. package/dist/cli-server.js.map +1 -0
  58. package/dist/cli-server.test.d.ts +1 -0
  59. package/dist/cli-server.test.js +38 -0
  60. package/dist/cli-server.test.js.map +1 -0
  61. package/dist/cli-timeline.d.ts +35 -0
  62. package/dist/cli-timeline.js +373 -0
  63. package/dist/cli-timeline.js.map +1 -0
  64. package/dist/cli-timeline.test.d.ts +1 -0
  65. package/dist/cli-timeline.test.js +104 -0
  66. package/dist/cli-timeline.test.js.map +1 -0
  67. package/dist/cli.d.ts +0 -19
  68. package/dist/cli.js +910 -194
  69. package/dist/cli.js.map +1 -1
  70. package/dist/config-overlay.test.d.ts +1 -0
  71. package/dist/config-overlay.test.js +112 -0
  72. package/dist/config-overlay.test.js.map +1 -0
  73. package/dist/config-resolve.d.ts +28 -0
  74. package/dist/config-resolve.js +47 -0
  75. package/dist/config-resolve.js.map +1 -0
  76. package/dist/config-resolve.test.d.ts +1 -0
  77. package/dist/config-resolve.test.js +68 -0
  78. package/dist/config-resolve.test.js.map +1 -0
  79. package/dist/config.d.ts +62 -49
  80. package/dist/config.js +452 -76
  81. package/dist/config.js.map +1 -1
  82. package/dist/config.test.js +201 -32
  83. package/dist/config.test.js.map +1 -1
  84. package/dist/connectors/github-webhook.js +83 -5
  85. package/dist/connectors/github-webhook.js.map +1 -1
  86. package/dist/connectors/github-webhook.test.d.ts +1 -0
  87. package/dist/connectors/github-webhook.test.js +156 -0
  88. package/dist/connectors/github-webhook.test.js.map +1 -0
  89. package/dist/connectors/messaging/session-manager.d.ts +18 -0
  90. package/dist/connectors/messaging/session-manager.js +83 -2
  91. package/dist/connectors/messaging/session-manager.js.map +1 -1
  92. package/dist/connectors/messaging/session-manager.test.d.ts +1 -0
  93. package/dist/connectors/messaging/session-manager.test.js +144 -0
  94. package/dist/connectors/messaging/session-manager.test.js.map +1 -0
  95. package/dist/connectors/slack/connector.d.ts +9 -0
  96. package/dist/connectors/slack/connector.js +15 -0
  97. package/dist/connectors/slack/connector.js.map +1 -1
  98. package/dist/connectors/slack/mrkdwn.js +81 -0
  99. package/dist/connectors/slack/mrkdwn.js.map +1 -1
  100. package/dist/connectors/slack/mrkdwn.test.js +49 -0
  101. package/dist/connectors/slack/mrkdwn.test.js.map +1 -1
  102. package/dist/connectors/types.d.ts +1 -1
  103. package/dist/cron/fanout.d.ts +33 -0
  104. package/dist/cron/fanout.js +55 -0
  105. package/dist/cron/fanout.js.map +1 -0
  106. package/dist/cron/fanout.test.d.ts +1 -0
  107. package/dist/cron/fanout.test.js +73 -0
  108. package/dist/cron/fanout.test.js.map +1 -0
  109. package/dist/cron/jobs.d.ts +5 -0
  110. package/dist/cron/jobs.js +10 -3
  111. package/dist/cron/jobs.js.map +1 -1
  112. package/dist/cron/scheduler.d.ts +12 -0
  113. package/dist/cron/scheduler.js +27 -1
  114. package/dist/cron/scheduler.js.map +1 -1
  115. package/dist/engine/agent-executor.d.ts +158 -0
  116. package/dist/engine/agent-executor.js +1140 -0
  117. package/dist/engine/agent-executor.js.map +1 -0
  118. package/dist/engine/agent-executor.test.d.ts +1 -0
  119. package/dist/engine/agent-executor.test.js +395 -0
  120. package/dist/engine/agent-executor.test.js.map +1 -0
  121. package/dist/engine/chat-runner.d.ts +123 -0
  122. package/dist/engine/chat-runner.js +379 -0
  123. package/dist/engine/chat-runner.js.map +1 -0
  124. package/dist/engine/chat-runner.test.d.ts +1 -0
  125. package/dist/engine/chat-runner.test.js +104 -0
  126. package/dist/engine/chat-runner.test.js.map +1 -0
  127. package/dist/engine/chat-skills.d.ts +45 -0
  128. package/dist/engine/chat-skills.js +184 -0
  129. package/dist/engine/chat-skills.js.map +1 -0
  130. package/dist/engine/chat-skills.test.d.ts +1 -0
  131. package/dist/engine/chat-skills.test.js +20 -0
  132. package/dist/engine/chat-skills.test.js.map +1 -0
  133. package/dist/engine/chat.d.ts +20 -23
  134. package/dist/engine/chat.js +251 -155
  135. package/dist/engine/chat.js.map +1 -1
  136. package/dist/engine/chat.test.d.ts +1 -0
  137. package/dist/engine/chat.test.js +42 -0
  138. package/dist/engine/chat.test.js.map +1 -0
  139. package/dist/engine/classifier.d.ts +35 -2
  140. package/dist/engine/classifier.js +170 -31
  141. package/dist/engine/classifier.js.map +1 -1
  142. package/dist/engine/classifier.test.d.ts +1 -0
  143. package/dist/engine/classifier.test.js +115 -0
  144. package/dist/engine/classifier.test.js.map +1 -0
  145. package/dist/engine/dispatcher.d.ts +60 -0
  146. package/dist/engine/dispatcher.js +601 -0
  147. package/dist/engine/dispatcher.js.map +1 -0
  148. package/dist/engine/dispatcher.test.d.ts +1 -0
  149. package/dist/engine/dispatcher.test.js +511 -0
  150. package/dist/engine/dispatcher.test.js.map +1 -0
  151. package/dist/engine/event-shim.d.ts +117 -0
  152. package/dist/engine/event-shim.js +435 -0
  153. package/dist/engine/event-shim.js.map +1 -0
  154. package/dist/engine/event-shim.test.d.ts +1 -0
  155. package/dist/engine/event-shim.test.js +194 -0
  156. package/dist/engine/event-shim.test.js.map +1 -0
  157. package/dist/engine/git-auth.d.ts +13 -17
  158. package/dist/engine/git-auth.js +99 -42
  159. package/dist/engine/git-auth.js.map +1 -1
  160. package/dist/engine/git-auth.test.d.ts +1 -0
  161. package/dist/engine/git-auth.test.js +117 -0
  162. package/dist/engine/git-auth.test.js.map +1 -0
  163. package/dist/engine/github-app-client.d.ts +7 -0
  164. package/dist/engine/github-app-client.js +16 -0
  165. package/dist/engine/github-app-client.js.map +1 -0
  166. package/dist/engine/github-app-client.test.d.ts +1 -0
  167. package/dist/engine/github-app-client.test.js +44 -0
  168. package/dist/engine/github-app-client.test.js.map +1 -0
  169. package/dist/engine/github-tools.d.ts +12 -0
  170. package/dist/engine/github-tools.js +261 -0
  171. package/dist/engine/github-tools.js.map +1 -0
  172. package/dist/engine/github.d.ts +1027 -43
  173. package/dist/engine/github.js +153 -14
  174. package/dist/engine/github.js.map +1 -1
  175. package/dist/engine/llm.d.ts +47 -0
  176. package/dist/engine/llm.js +221 -0
  177. package/dist/engine/llm.js.map +1 -0
  178. package/dist/engine/llm.test.d.ts +1 -0
  179. package/dist/engine/llm.test.js +189 -0
  180. package/dist/engine/llm.test.js.map +1 -0
  181. package/dist/engine/profiles.d.ts +249 -0
  182. package/dist/engine/profiles.js +42 -0
  183. package/dist/engine/profiles.js.map +1 -0
  184. package/dist/engine/router.d.ts +12 -6
  185. package/dist/engine/router.js +339 -81
  186. package/dist/engine/router.js.map +1 -1
  187. package/dist/engine/router.test.js +428 -78
  188. package/dist/engine/router.test.js.map +1 -1
  189. package/dist/engine/screen.d.ts +41 -0
  190. package/dist/engine/screen.js +93 -0
  191. package/dist/engine/screen.js.map +1 -0
  192. package/dist/engine/screen.test.d.ts +1 -0
  193. package/dist/engine/screen.test.js +82 -0
  194. package/dist/engine/screen.test.js.map +1 -0
  195. package/dist/index.js +377 -432
  196. package/dist/index.js.map +1 -1
  197. package/dist/managed-repos.d.ts +7 -9
  198. package/dist/managed-repos.js +12 -15
  199. package/dist/managed-repos.js.map +1 -1
  200. package/dist/managed-repos.test.js +24 -19
  201. package/dist/managed-repos.test.js.map +1 -1
  202. package/dist/notify/index.d.ts +15 -0
  203. package/dist/notify/index.js +6 -0
  204. package/dist/notify/index.js.map +1 -0
  205. package/dist/notify/model.d.ts +57 -0
  206. package/dist/notify/model.js +89 -0
  207. package/dist/notify/model.js.map +1 -0
  208. package/dist/notify/model.test.d.ts +1 -0
  209. package/dist/notify/model.test.js +109 -0
  210. package/dist/notify/model.test.js.map +1 -0
  211. package/dist/notify/notifier.d.ts +17 -0
  212. package/dist/notify/notifier.js +87 -0
  213. package/dist/notify/notifier.js.map +1 -0
  214. package/dist/notify/notifier.test.d.ts +1 -0
  215. package/dist/notify/notifier.test.js +100 -0
  216. package/dist/notify/notifier.test.js.map +1 -0
  217. package/dist/notify/render.d.ts +21 -0
  218. package/dist/notify/render.js +59 -0
  219. package/dist/notify/render.js.map +1 -0
  220. package/dist/notify/render.test.d.ts +1 -0
  221. package/dist/notify/render.test.js +65 -0
  222. package/dist/notify/render.test.js.map +1 -0
  223. package/dist/notify/transports/github.d.ts +26 -0
  224. package/dist/notify/transports/github.js +26 -0
  225. package/dist/notify/transports/github.js.map +1 -0
  226. package/dist/notify/transports/slack.d.ts +26 -0
  227. package/dist/notify/transports/slack.js +28 -0
  228. package/dist/notify/transports/slack.js.map +1 -0
  229. package/dist/notify/transports.test.d.ts +1 -0
  230. package/dist/notify/transports.test.js +71 -0
  231. package/dist/notify/transports.test.js.map +1 -0
  232. package/dist/notify/types.d.ts +95 -0
  233. package/dist/notify/types.js +16 -0
  234. package/dist/notify/types.js.map +1 -0
  235. package/dist/sandbox/docker-compose.test.d.ts +1 -0
  236. package/dist/sandbox/docker-compose.test.js +128 -0
  237. package/dist/sandbox/docker-compose.test.js.map +1 -0
  238. package/dist/sandbox/docker.d.ts +97 -9
  239. package/dist/sandbox/docker.js +192 -41
  240. package/dist/sandbox/docker.js.map +1 -1
  241. package/dist/sandbox/docker.test.d.ts +1 -0
  242. package/dist/sandbox/docker.test.js +137 -0
  243. package/dist/sandbox/docker.test.js.map +1 -0
  244. package/dist/sandbox/egress-allowlist.d.ts +69 -0
  245. package/dist/sandbox/egress-allowlist.js +164 -0
  246. package/dist/sandbox/egress-allowlist.js.map +1 -0
  247. package/dist/sandbox/egress-allowlist.test.d.ts +1 -0
  248. package/dist/sandbox/egress-allowlist.test.js +65 -0
  249. package/dist/sandbox/egress-allowlist.test.js.map +1 -0
  250. package/dist/sandbox/egress-firewall-config.d.ts +127 -0
  251. package/dist/sandbox/egress-firewall-config.js +434 -0
  252. package/dist/sandbox/egress-firewall-config.js.map +1 -0
  253. package/dist/sandbox/egress-firewall-config.test.d.ts +1 -0
  254. package/dist/sandbox/egress-firewall-config.test.js +244 -0
  255. package/dist/sandbox/egress-firewall-config.test.js.map +1 -0
  256. package/dist/sandbox/images.d.ts +23 -0
  257. package/dist/sandbox/images.js +55 -0
  258. package/dist/sandbox/images.js.map +1 -0
  259. package/dist/sandbox/index.d.ts +82 -3
  260. package/dist/sandbox/index.js +223 -93
  261. package/dist/sandbox/index.js.map +1 -1
  262. package/dist/sandbox/index.test.d.ts +1 -0
  263. package/dist/sandbox/index.test.js +157 -0
  264. package/dist/sandbox/index.test.js.map +1 -0
  265. package/dist/session-log.d.ts +63 -0
  266. package/dist/session-log.js +290 -0
  267. package/dist/session-log.js.map +1 -0
  268. package/dist/session-log.test.d.ts +1 -0
  269. package/dist/session-log.test.js +85 -0
  270. package/dist/session-log.test.js.map +1 -0
  271. package/dist/setup.d.ts +30 -1
  272. package/dist/setup.js +241 -25
  273. package/dist/setup.js.map +1 -1
  274. package/dist/setup.test.js +138 -6
  275. package/dist/setup.test.js.map +1 -1
  276. package/dist/state/approval-store.d.ts +86 -0
  277. package/dist/state/approval-store.js +140 -0
  278. package/dist/state/approval-store.js.map +1 -0
  279. package/dist/state/build-assets.d.ts +50 -0
  280. package/dist/state/build-assets.js +154 -0
  281. package/dist/state/build-assets.js.map +1 -0
  282. package/dist/state/build-assets.test.d.ts +1 -0
  283. package/dist/state/build-assets.test.js +106 -0
  284. package/dist/state/build-assets.test.js.map +1 -0
  285. package/dist/state/db.d.ts +65 -333
  286. package/dist/state/db.js +112 -835
  287. package/dist/state/db.js.map +1 -1
  288. package/dist/state/db.test.js +127 -91
  289. package/dist/state/db.test.js.map +1 -1
  290. package/dist/state/execution-store.d.ts +257 -0
  291. package/dist/state/execution-store.js +527 -0
  292. package/dist/state/execution-store.js.map +1 -0
  293. package/dist/state/migrate.d.ts +15 -0
  294. package/dist/state/migrate.js +175 -0
  295. package/dist/state/migrate.js.map +1 -0
  296. package/dist/state/workflow-run-store.d.ts +195 -0
  297. package/dist/state/workflow-run-store.js +363 -0
  298. package/dist/state/workflow-run-store.js.map +1 -0
  299. package/dist/state/workflow-run-store.test.d.ts +1 -0
  300. package/dist/state/workflow-run-store.test.js +264 -0
  301. package/dist/state/workflow-run-store.test.js.map +1 -0
  302. package/dist/telemetry/index.d.ts +38 -0
  303. package/dist/telemetry/index.js +253 -0
  304. package/dist/telemetry/index.js.map +1 -0
  305. package/dist/telemetry/index.test.d.ts +1 -0
  306. package/dist/telemetry/index.test.js +73 -0
  307. package/dist/telemetry/index.test.js.map +1 -0
  308. package/dist/telemetry/pi-events.d.ts +12 -0
  309. package/dist/telemetry/pi-events.js +134 -0
  310. package/dist/telemetry/pi-events.js.map +1 -0
  311. package/dist/telemetry/pi-events.test.d.ts +1 -0
  312. package/dist/telemetry/pi-events.test.js +69 -0
  313. package/dist/telemetry/pi-events.test.js.map +1 -0
  314. package/dist/workflows/dag.d.ts +13 -1
  315. package/dist/workflows/dag.js +7 -3
  316. package/dist/workflows/dag.js.map +1 -1
  317. package/dist/workflows/dag.test.js +22 -0
  318. package/dist/workflows/dag.test.js.map +1 -1
  319. package/dist/workflows/golden-build.test.d.ts +1 -0
  320. package/dist/workflows/golden-build.test.js +45 -0
  321. package/dist/workflows/golden-build.test.js.map +1 -0
  322. package/dist/workflows/loader-overlay.test.d.ts +1 -0
  323. package/dist/workflows/loader-overlay.test.js +101 -0
  324. package/dist/workflows/loader-overlay.test.js.map +1 -0
  325. package/dist/workflows/loader.d.ts +36 -11
  326. package/dist/workflows/loader.js +311 -87
  327. package/dist/workflows/loader.js.map +1 -1
  328. package/dist/workflows/loader.test.js +114 -10
  329. package/dist/workflows/loader.test.js.map +1 -1
  330. package/dist/workflows/loop-eval.js +2 -0
  331. package/dist/workflows/loop-eval.js.map +1 -1
  332. package/dist/workflows/loop-eval.test.js +14 -0
  333. package/dist/workflows/loop-eval.test.js.map +1 -1
  334. package/dist/workflows/phase-executor.d.ts +145 -0
  335. package/dist/workflows/phase-executor.js +691 -0
  336. package/dist/workflows/phase-executor.js.map +1 -0
  337. package/dist/workflows/phase-executor.test.d.ts +1 -0
  338. package/dist/workflows/phase-executor.test.js +434 -0
  339. package/dist/workflows/phase-executor.test.js.map +1 -0
  340. package/dist/workflows/phase-ref.d.ts +44 -0
  341. package/dist/workflows/phase-ref.js +78 -0
  342. package/dist/workflows/phase-ref.js.map +1 -0
  343. package/dist/workflows/phase-ref.test.d.ts +1 -0
  344. package/dist/workflows/phase-ref.test.js +24 -0
  345. package/dist/workflows/phase-ref.test.js.map +1 -0
  346. package/dist/workflows/resume.d.ts +5 -11
  347. package/dist/workflows/resume.js +88 -7
  348. package/dist/workflows/resume.js.map +1 -1
  349. package/dist/workflows/runner.d.ts +34 -27
  350. package/dist/workflows/runner.js +252 -930
  351. package/dist/workflows/runner.js.map +1 -1
  352. package/dist/workflows/runner.test.js +346 -35
  353. package/dist/workflows/runner.test.js.map +1 -1
  354. package/dist/workflows/schema.d.ts +52 -10
  355. package/dist/workflows/schema.js +147 -7
  356. package/dist/workflows/schema.js.map +1 -1
  357. package/dist/workflows/simple.d.ts +67 -3
  358. package/dist/workflows/simple.js +248 -87
  359. package/dist/workflows/simple.js.map +1 -1
  360. package/dist/workflows/simple.test.d.ts +1 -0
  361. package/dist/workflows/simple.test.js +107 -0
  362. package/dist/workflows/simple.test.js.map +1 -0
  363. package/dist/workflows/templates.d.ts +29 -0
  364. package/dist/workflows/templates.js +42 -4
  365. package/dist/workflows/templates.js.map +1 -1
  366. package/dist/workflows/templates.test.js +103 -0
  367. package/dist/workflows/templates.test.js.map +1 -1
  368. package/dist/workflows/triggers.d.ts +21 -0
  369. package/dist/workflows/triggers.js +44 -0
  370. package/dist/workflows/triggers.js.map +1 -0
  371. package/dist/workflows/verdict.d.ts +19 -0
  372. package/dist/workflows/verdict.js +30 -0
  373. package/dist/workflows/verdict.js.map +1 -0
  374. package/dist/workflows/verdict.test.d.ts +1 -0
  375. package/dist/workflows/verdict.test.js +44 -0
  376. package/dist/workflows/verdict.test.js.map +1 -0
  377. package/dist/worktree/manager.d.ts +1 -1
  378. package/dist/worktree/manager.js +14 -14
  379. package/dist/worktree/manager.js.map +1 -1
  380. package/dist/worktree/manager.test.d.ts +1 -0
  381. package/dist/worktree/manager.test.js +87 -0
  382. package/dist/worktree/manager.test.js.map +1 -0
  383. package/docker-compose.yml +206 -5
  384. package/package.json +19 -9
  385. package/sandbox.Dockerfile +97 -18
  386. package/skills/README.md +40 -0
  387. package/skills/browser-qa/SKILL.md +193 -0
  388. package/skills/browser-qa/scripts/agent-browser.mjs +380 -0
  389. package/skills/building/SKILL.md +95 -0
  390. package/skills/chat/SKILL.md +30 -11
  391. package/skills/code-review/SKILL.md +59 -0
  392. package/skills/debug-production/SKILL.md +108 -0
  393. package/skills/demo/SKILL.md +194 -0
  394. package/skills/demo/scripts/compose-demo.sh +205 -0
  395. package/skills/issue-answer/SKILL.md +90 -0
  396. package/skills/issue-comment/SKILL.md +38 -24
  397. package/skills/issue-triage/SKILL.md +103 -37
  398. package/skills/issue-triage/references/AGENT-BRIEF.md +61 -0
  399. package/skills/pr-comment/SKILL.md +64 -0
  400. package/skills/pr-review/SKILL.md +65 -49
  401. package/skills/qa-test/SKILL.md +97 -0
  402. package/skills/repo-health/SKILL.md +48 -45
  403. package/skills/security-feedback/SKILL.md +173 -0
  404. package/skills/security-feedback/references/templates.md +77 -0
  405. package/skills/security-review/SKILL.md +213 -0
  406. package/skills/security-review/references/issue-format.md +302 -0
  407. package/skills/verify/SKILL.md +118 -0
  408. package/workflows/answer.yaml +37 -0
  409. package/workflows/build.yaml +32 -22
  410. package/workflows/cron-security.yaml +6 -0
  411. package/workflows/demo.yaml +55 -0
  412. package/workflows/explore.yaml +9 -0
  413. package/workflows/pr-comment.yaml +16 -0
  414. package/workflows/pr-fix.yaml +3 -0
  415. package/workflows/pr-review.yaml +4 -1
  416. package/workflows/prompts/answer.md +67 -0
  417. package/workflows/prompts/architect.md +24 -7
  418. package/workflows/prompts/demo.md +100 -0
  419. package/workflows/prompts/executor.md +29 -20
  420. package/workflows/prompts/explore-ask.md +51 -22
  421. package/workflows/prompts/explore-publish.md +2 -2
  422. package/workflows/prompts/explore-read.md +24 -10
  423. package/workflows/prompts/explore-synthesize.md +15 -8
  424. package/workflows/prompts/fix.md +9 -10
  425. package/workflows/prompts/guardrails.md +26 -8
  426. package/workflows/prompts/pr-fix.md +6 -7
  427. package/workflows/prompts/pr.md +11 -10
  428. package/workflows/prompts/qa-browser.md +95 -0
  429. package/workflows/prompts/qa-synth.md +44 -0
  430. package/workflows/prompts/qa-test.md +60 -0
  431. package/workflows/prompts/re-reviewer.md +8 -9
  432. package/workflows/prompts/reviewer.md +10 -9
  433. package/workflows/prompts/verify-browser.md +93 -0
  434. package/workflows/prompts/verify-synth.md +44 -0
  435. package/workflows/prompts/verify.md +63 -0
  436. package/workflows/qa-test.yaml +87 -0
  437. package/workflows/security-feedback.yaml +25 -0
  438. package/workflows/security-review.yaml +29 -0
  439. package/workflows/verify.yaml +85 -0
  440. package/deploy/mcp-config.tmpl.json +0 -14
  441. package/dist/cron/rate-limits.d.ts +0 -26
  442. package/dist/cron/rate-limits.js +0 -193
  443. package/dist/cron/rate-limits.js.map +0 -1
  444. package/dist/engine/executor.d.ts +0 -75
  445. package/dist/engine/executor.js +0 -292
  446. package/dist/engine/executor.js.map +0 -1
  447. package/mcp-github-app/package.json +0 -18
  448. package/mcp-github-app/src/auth.js +0 -66
  449. package/mcp-github-app/src/github.js +0 -371
  450. package/mcp-github-app/src/index.js +0 -534
  451. package/skills/devops/webhook-subscriptions/SKILL.md +0 -180
  452. package/skills/github/DESCRIPTION.md +0 -3
  453. package/skills/github/codebase-inspection/SKILL.md +0 -115
  454. package/skills/github/github-auth/SKILL.md +0 -54
  455. package/skills/github/github-auth/scripts/gh-env.sh +0 -66
  456. package/skills/github/github-code-review/SKILL.md +0 -480
  457. package/skills/github/github-code-review/references/review-output-template.md +0 -74
  458. package/skills/github/github-issues/SKILL.md +0 -369
  459. package/skills/github/github-issues/templates/bug-report.md +0 -35
  460. package/skills/github/github-issues/templates/feature-request.md +0 -31
  461. package/skills/github/github-pr-workflow/SKILL.md +0 -395
  462. package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +0 -183
  463. package/skills/github/github-pr-workflow/references/conventional-commits.md +0 -71
  464. package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +0 -35
  465. package/skills/github/github-pr-workflow/templates/pr-body-feature.md +0 -33
  466. package/skills/github/github-repo-management/SKILL.md +0 -515
  467. package/skills/github/github-repo-management/references/github-api-cheatsheet.md +0 -161
  468. package/skills/github-orchestrator/SKILL.md +0 -103
  469. package/skills/mcp/DESCRIPTION.md +0 -3
  470. package/skills/mcp/mcporter/SKILL.md +0 -122
  471. package/skills/mcp/native-mcp/SKILL.md +0 -356
  472. package/skills/software-development/architect/SKILL.md +0 -154
  473. package/skills/software-development/assure-guardrails/SKILL.md +0 -239
  474. package/skills/software-development/plan/SKILL.md +0 -64
  475. package/skills/software-development/requesting-code-review/SKILL.md +0 -291
  476. package/skills/software-development/subagent-driven-development/SKILL.md +0 -433
  477. package/skills/software-development/systematic-debugging/SKILL.md +0 -366
  478. package/skills/software-development/test-driven-development/SKILL.md +0 -342
@@ -0,0 +1,527 @@
1
+ import { randomUUID } from "crypto";
2
+ /**
3
+ * Owns every read/write against the `executions` table — the harness's
4
+ * append-only ledger of agent runs. The dashboard derives phase status from
5
+ * this table (primary source, ahead of the `phase_history` fallback), and the
6
+ * runner's resume path skips already-completed phases via {@link shouldRunPhase}.
7
+ *
8
+ * Carved out of the old `StateDb` god-class (issue #97). Constructed from the
9
+ * single shared `Database` so it sits in the same connection / transaction
10
+ * scope as the other stores.
11
+ */
12
+ export class ExecutionStore {
13
+ db;
14
+ constructor(db) {
15
+ this.db = db;
16
+ }
17
+ recordStart(record) {
18
+ this.db.prepare(`
19
+ INSERT INTO executions (id, trigger_type, trigger_id, skill, repo, issue_number, started_at, workflow_run_id)
20
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
21
+ `).run(record.id, record.triggerType, record.triggerId, record.skill, record.repo, record.issueNumber, record.startedAt, record.workflowRunId ?? null);
22
+ }
23
+ /**
24
+ * Mid-run update: persist the agent session id as soon as the executor sees
25
+ * the stream-json `system/init` line. Lets the dashboard surface the live
26
+ * session log for an in-flight phase, not just for completed ones.
27
+ */
28
+ recordSessionId(id, sessionId) {
29
+ this.db.prepare(`UPDATE executions SET session_id = ? WHERE id = ?`).run(sessionId, id);
30
+ }
31
+ /**
32
+ * Persist the final assistant text for a loop-iteration execution.
33
+ * Used by the runner when a scratch slot would otherwise inline the
34
+ * full LLM output into `workflow_runs.scratch` — the scratch entry
35
+ * stores `lastOutputExecutionId` and resolves the text through
36
+ * `getExecutionOutput` on read.
37
+ */
38
+ recordOutputText(id, output) {
39
+ this.db.prepare(`UPDATE executions SET output_text = ? WHERE id = ?`).run(output, id);
40
+ }
41
+ /** Read the persisted output text for an execution, or null if none. */
42
+ getExecutionOutput(id) {
43
+ const row = this.db
44
+ .prepare(`SELECT output_text FROM executions WHERE id = ?`)
45
+ .get(id);
46
+ return row?.output_text ?? null;
47
+ }
48
+ /**
49
+ * Most recent finished execution's `output_text` for a phase (`skill`), or
50
+ * null. Used by the reviewer loop on resume to re-derive a completed review's
51
+ * verdict from its persisted output (a dedup-`done` review must not be
52
+ * assumed APPROVED — it may have requested changes).
53
+ */
54
+ getPhaseOutput(skill, triggerId, workflowRunId) {
55
+ const [scopeClause, scopeParam] = workflowRunId
56
+ ? ["workflow_run_id = ?", workflowRunId]
57
+ : ["trigger_id = ?", triggerId];
58
+ const row = this.db.prepare(`
59
+ SELECT output_text FROM executions
60
+ WHERE skill = ? AND ${scopeClause} AND output_text IS NOT NULL
61
+ ORDER BY finished_at DESC
62
+ LIMIT 1
63
+ `).get(skill, scopeParam);
64
+ return row?.output_text ?? null;
65
+ }
66
+ recordFinish(id, result) {
67
+ this.db.prepare(`
68
+ UPDATE executions
69
+ SET finished_at = ?,
70
+ success = ?,
71
+ error = ?,
72
+ turns = ?,
73
+ duration_ms = ?,
74
+ session_id = COALESCE(?, session_id),
75
+ cost_usd = COALESCE(?, cost_usd),
76
+ input_tokens = COALESCE(?, input_tokens),
77
+ cache_creation_input_tokens = COALESCE(?, cache_creation_input_tokens),
78
+ cache_read_input_tokens = COALESCE(?, cache_read_input_tokens),
79
+ output_tokens = COALESCE(?, output_tokens),
80
+ api_duration_ms = COALESCE(?, api_duration_ms),
81
+ stop_reason = COALESCE(?, stop_reason),
82
+ extension_status = COALESCE(?, extension_status),
83
+ skills_status = COALESCE(?, skills_status)
84
+ WHERE id = ?
85
+ `).run(new Date().toISOString(), result.success ? 1 : 0, result.error, result.turns, result.durationMs, result.sessionId ?? null, result.costUsd ?? null, result.inputTokens ?? null, result.cacheCreationInputTokens ?? null, result.cacheReadInputTokens ?? null, result.outputTokens ?? null, result.apiDurationMs ?? null, result.stopReason ?? null, result.extensionStatus ?? null, result.skillsStatus ?? null, id);
86
+ }
87
+ /**
88
+ * Record a phase that the scheduler skipped because its trigger rule was
89
+ * not satisfied (a failed/skipped upstream cascaded down a chain). The
90
+ * executions ledger is the single source of truth the dashboard derives
91
+ * phase status from, so skips are written here too — as a finished,
92
+ * non-successful row (`success = 0`, `stop_reason = 'skipped'`). Because it
93
+ * is not `success = 1`, `shouldRunPhase` re-evaluates it on resume (the node
94
+ * will simply be re-skipped if the upstream is still failed).
95
+ */
96
+ recordSkippedPhase(skill, triggerId, workflowRunId, repo) {
97
+ const now = new Date().toISOString();
98
+ const m = triggerId.match(/#(\d+)$/);
99
+ const issueNumber = m ? Number(m[1]) : null;
100
+ this.db.prepare(`
101
+ INSERT INTO executions
102
+ (id, trigger_type, trigger_id, skill, repo, issue_number, started_at, finished_at, success, error, stop_reason, workflow_run_id)
103
+ VALUES (?, 'webhook', ?, ?, ?, ?, ?, ?, 0, 'skipped: trigger rule not satisfied', 'skipped', ?)
104
+ `).run(randomUUID(), triggerId, skill, repo ?? null, issueNumber, now, now, workflowRunId ?? null);
105
+ }
106
+ /**
107
+ * List chat threads aggregated from the executions table.
108
+ *
109
+ * Each row collapses every execution sharing a `trigger_id` (the messaging
110
+ * session id) into one summary so the dashboard's chat-sessions tab can
111
+ * show one card per Slack thread, not one per turn. Joined with
112
+ * `messaging_sessions` for the agent SDK session id (used to resolve to
113
+ * the on-disk jsonl when streaming messages) and with `messaging_messages`
114
+ * for the most recent assistant text (preview snippet).
115
+ */
116
+ listChatThreads(limit) {
117
+ const rows = this.db.prepare(`
118
+ SELECT
119
+ e.trigger_id AS triggerId,
120
+ ms.agent_session_id AS agentSessionId,
121
+ ms.platform AS platform,
122
+ MIN(e.started_at) AS firstStartedAt,
123
+ MAX(COALESCE(e.finished_at, e.started_at)) AS lastActivityAt,
124
+ COUNT(*) AS turnCount,
125
+ SUM(COALESCE(e.cost_usd, 0)) AS totalCost,
126
+ SUM(COALESCE(e.input_tokens, 0)) AS inputTokens,
127
+ SUM(COALESCE(e.output_tokens, 0)) AS outputTokens,
128
+ SUM(COALESCE(e.cache_read_input_tokens, 0)) AS cacheReadTokens,
129
+ (
130
+ SELECT mm.content
131
+ FROM messaging_messages mm
132
+ WHERE mm.session_id = e.trigger_id AND mm.role = 'assistant'
133
+ ORDER BY mm.timestamp DESC
134
+ LIMIT 1
135
+ ) AS lastAssistantContent
136
+ FROM executions e
137
+ LEFT JOIN messaging_sessions ms ON ms.id = e.trigger_id
138
+ WHERE e.skill = 'chat'
139
+ GROUP BY e.trigger_id
140
+ ORDER BY lastActivityAt DESC
141
+ LIMIT ?
142
+ `).all(limit);
143
+ return rows;
144
+ }
145
+ /** Look up a single chat thread by its messaging session id (= trigger_id). */
146
+ getChatThread(triggerId) {
147
+ const row = this.db.prepare(`
148
+ SELECT
149
+ e.trigger_id AS triggerId,
150
+ ms.agent_session_id AS agentSessionId,
151
+ ms.platform AS platform,
152
+ MIN(e.started_at) AS firstStartedAt,
153
+ MAX(COALESCE(e.finished_at, e.started_at)) AS lastActivityAt,
154
+ COUNT(*) AS turnCount,
155
+ SUM(COALESCE(e.cost_usd, 0)) AS totalCost,
156
+ SUM(COALESCE(e.input_tokens, 0)) AS inputTokens,
157
+ SUM(COALESCE(e.output_tokens, 0)) AS outputTokens,
158
+ SUM(COALESCE(e.cache_read_input_tokens, 0)) AS cacheReadTokens,
159
+ (
160
+ SELECT mm.content
161
+ FROM messaging_messages mm
162
+ WHERE mm.session_id = e.trigger_id AND mm.role = 'assistant'
163
+ ORDER BY mm.timestamp DESC
164
+ LIMIT 1
165
+ ) AS lastAssistantContent
166
+ FROM executions e
167
+ LEFT JOIN messaging_sessions ms ON ms.id = e.trigger_id
168
+ WHERE e.skill = 'chat' AND e.trigger_id = ?
169
+ GROUP BY e.trigger_id
170
+ `).get(triggerId);
171
+ return row ?? null;
172
+ }
173
+ /** Check if a skill is currently running for a given trigger */
174
+ isRunning(skill, triggerId) {
175
+ const row = this.db.prepare(`
176
+ SELECT 1 FROM executions
177
+ WHERE skill = ? AND trigger_id = ? AND finished_at IS NULL
178
+ LIMIT 1
179
+ `).get(skill, triggerId);
180
+ return !!row;
181
+ }
182
+ /** Check if a skill has already completed successfully for a given trigger */
183
+ isCompleted(skill, triggerId) {
184
+ const row = this.db.prepare(`
185
+ SELECT 1 FROM executions
186
+ WHERE skill = ? AND trigger_id = ? AND success = 1
187
+ LIMIT 1
188
+ `).get(skill, triggerId);
189
+ return !!row;
190
+ }
191
+ /**
192
+ * Check if a phase should run: not currently running AND not already
193
+ * succeeded. When `workflowRunId` is provided, scopes the check to that
194
+ * specific run — a fresh re-trigger (new workflow_run_id) will see no
195
+ * matching rows and correctly return "run" even if a prior completed run
196
+ * for the same trigger exists. Omit `workflowRunId` for legacy callers
197
+ * (e.g. chat/status-report dedup) that want the old trigger-wide scope.
198
+ */
199
+ shouldRunPhase(skill, triggerId, workflowRunId) {
200
+ const [scopeClause, scopeParam] = workflowRunId
201
+ ? ["workflow_run_id = ?", workflowRunId]
202
+ : ["trigger_id = ?", triggerId];
203
+ const running = this.db.prepare(`
204
+ SELECT 1 FROM executions
205
+ WHERE skill = ? AND ${scopeClause} AND finished_at IS NULL
206
+ LIMIT 1
207
+ `).get(skill, scopeParam);
208
+ if (running)
209
+ return "running";
210
+ const done = this.db.prepare(`
211
+ SELECT 1 FROM executions
212
+ WHERE skill = ? AND ${scopeClause} AND success = 1
213
+ LIMIT 1
214
+ `).get(skill, scopeParam);
215
+ if (done)
216
+ return "done";
217
+ return "run";
218
+ }
219
+ /** Mark all stale "running" executions for a skill/trigger as failed.
220
+ * Called when we detect no matching Docker container is alive. */
221
+ markStaleAsFailed(skill, triggerId, workflowRunId) {
222
+ const [scopeClause, scopeParam] = workflowRunId
223
+ ? ["workflow_run_id = ?", workflowRunId]
224
+ : ["trigger_id = ?", triggerId];
225
+ const result = this.db.prepare(`
226
+ UPDATE executions
227
+ SET finished_at = ?, success = 0, error = 'stale: container no longer running'
228
+ WHERE skill = ? AND ${scopeClause} AND finished_at IS NULL
229
+ `).run(new Date().toISOString(), skill, scopeParam);
230
+ return result.changes;
231
+ }
232
+ /**
233
+ * Mark every unfinished execution row for a trigger as failed, regardless
234
+ * of skill. Used by the boot-time recovery sweep to clear out phases that
235
+ * were running when the harness crashed/restarted, so the runner's dedup
236
+ * logic doesn't think they're still in flight.
237
+ */
238
+ markAllStaleForTrigger(triggerId, reason) {
239
+ const result = this.db.prepare(`
240
+ UPDATE executions
241
+ SET finished_at = ?, success = 0, error = ?
242
+ WHERE trigger_id = ? AND finished_at IS NULL
243
+ `).run(new Date().toISOString(), reason, triggerId);
244
+ return result.changes;
245
+ }
246
+ /**
247
+ * Mark the most recent execution for a skill/trigger as failed.
248
+ * Used when the agent SDK reported success but the orchestrator decided
249
+ * the business outcome was a failure (e.g. guardrails BLOCKED, reviewer
250
+ * REQUEST_CHANGES). Without this, runPhase would skip the phase on the
251
+ * next run because the DB still says success=1.
252
+ */
253
+ markLatestAsFailed(skill, triggerId, reason, workflowRunId) {
254
+ const [scopeClause, scopeParam] = workflowRunId
255
+ ? ["workflow_run_id = ?", workflowRunId]
256
+ : ["trigger_id = ?", triggerId];
257
+ const result = this.db.prepare(`
258
+ UPDATE executions
259
+ SET success = 0, error = ?
260
+ WHERE id = (
261
+ SELECT id FROM executions
262
+ WHERE skill = ? AND ${scopeClause}
263
+ ORDER BY started_at DESC
264
+ LIMIT 1
265
+ )
266
+ `).run(reason, skill, scopeParam);
267
+ return result.changes;
268
+ }
269
+ /** Get recent executions for a skill */
270
+ recentExecutions(skill, limit = 10) {
271
+ return this.db.prepare(`
272
+ SELECT * FROM executions
273
+ WHERE skill = ?
274
+ ORDER BY started_at DESC
275
+ LIMIT ?
276
+ `).all(skill, limit);
277
+ }
278
+ /** Count consecutive failures for a skill (for cron failure tracking) */
279
+ consecutiveFailures(skill) {
280
+ const rows = this.db.prepare(`
281
+ SELECT success FROM executions
282
+ WHERE skill = ? AND finished_at IS NOT NULL
283
+ ORDER BY started_at DESC
284
+ LIMIT 10
285
+ `).all(skill);
286
+ let count = 0;
287
+ for (const row of rows) {
288
+ if (row.success === 0)
289
+ count++;
290
+ else
291
+ break;
292
+ }
293
+ return count;
294
+ }
295
+ /** Get all executions with pagination */
296
+ allExecutions(limit = 100, offset = 0) {
297
+ return this.db.prepare(`
298
+ SELECT * FROM executions
299
+ ORDER BY started_at DESC
300
+ LIMIT ? OFFSET ?
301
+ `).all(limit, offset);
302
+ }
303
+ /**
304
+ * Free-text search across the `executions` ledger — matches `error`, `skill`,
305
+ * or `repo` against a substring (case-insensitive via SQLite's LIKE). Used by
306
+ * the `/admin/api/log-search` endpoint and the `lastlight logs search` CLI to
307
+ * find failing/relevant phases without SSHing to the box. Parameterized; the
308
+ * pattern is escaped so user input can't smuggle LIKE wildcards.
309
+ */
310
+ searchErrors(query, limit = 50) {
311
+ const escaped = query.replace(/[\\%_]/g, (ch) => `\\${ch}`);
312
+ const pattern = `%${escaped}%`;
313
+ const rows = this.db.prepare(`
314
+ SELECT
315
+ id,
316
+ skill,
317
+ repo,
318
+ error,
319
+ success,
320
+ started_at AS startedAt,
321
+ finished_at AS finishedAt,
322
+ session_id AS sessionId,
323
+ workflow_run_id AS workflowRunId,
324
+ trigger_id AS triggerId
325
+ FROM executions
326
+ WHERE error LIKE ? ESCAPE '\\'
327
+ OR skill LIKE ? ESCAPE '\\'
328
+ OR repo LIKE ? ESCAPE '\\'
329
+ ORDER BY started_at DESC
330
+ LIMIT ?
331
+ `).all(pattern, pattern, pattern, limit);
332
+ return rows.map((r) => ({
333
+ id: r.id,
334
+ skill: r.skill,
335
+ repo: r.repo ?? undefined,
336
+ error: r.error ?? undefined,
337
+ success: r.success === null || r.success === undefined ? undefined : Boolean(r.success),
338
+ startedAt: r.startedAt,
339
+ finishedAt: r.finishedAt ?? undefined,
340
+ sessionId: r.sessionId ?? undefined,
341
+ workflowRunId: r.workflowRunId ?? undefined,
342
+ triggerId: r.triggerId,
343
+ }));
344
+ }
345
+ /**
346
+ * Get every execution recorded for a workflow run, with camelCase fields
347
+ * ready for the dashboard. Ordered by start time ascending so phases
348
+ * display in the order they ran. Scopes to a specific `workflow_run_id`
349
+ * when provided (preferred — isolates fresh re-triggers from prior runs);
350
+ * falls back to the legacy trigger-wide scope for rows written before the
351
+ * workflow_run_id column existed.
352
+ */
353
+ getExecutionsForWorkflowRun(workflowRunId, triggerId, workflowName) {
354
+ const skillPattern = workflowName ? `${workflowName}:%` : "%:%";
355
+ const rows = this.db.prepare(`
356
+ SELECT
357
+ id,
358
+ trigger_type AS triggerType,
359
+ trigger_id AS triggerId,
360
+ skill,
361
+ repo,
362
+ issue_number AS issueNumber,
363
+ started_at AS startedAt,
364
+ finished_at AS finishedAt,
365
+ success,
366
+ error,
367
+ turns,
368
+ duration_ms AS durationMs,
369
+ session_id AS sessionId,
370
+ cost_usd AS costUsd,
371
+ input_tokens AS inputTokens,
372
+ cache_creation_input_tokens AS cacheCreationInputTokens,
373
+ cache_read_input_tokens AS cacheReadInputTokens,
374
+ output_tokens AS outputTokens,
375
+ api_duration_ms AS apiDurationMs,
376
+ stop_reason AS stopReason,
377
+ extension_status AS extensionStatus,
378
+ skills_status AS skillsStatus,
379
+ workflow_run_id AS workflowRunId
380
+ FROM executions
381
+ WHERE (workflow_run_id = ? OR (workflow_run_id IS NULL AND trigger_id = ?))
382
+ AND skill LIKE ?
383
+ ORDER BY started_at ASC
384
+ `).all(workflowRunId, triggerId, skillPattern);
385
+ return rows.map((r) => ({
386
+ id: r.id,
387
+ triggerType: r.triggerType,
388
+ triggerId: r.triggerId,
389
+ skill: r.skill,
390
+ repo: r.repo ?? undefined,
391
+ issueNumber: r.issueNumber ?? undefined,
392
+ startedAt: r.startedAt,
393
+ finishedAt: r.finishedAt ?? undefined,
394
+ success: r.success === null || r.success === undefined ? undefined : Boolean(r.success),
395
+ error: r.error ?? undefined,
396
+ turns: r.turns ?? undefined,
397
+ durationMs: r.durationMs ?? undefined,
398
+ sessionId: r.sessionId ?? undefined,
399
+ costUsd: r.costUsd ?? undefined,
400
+ inputTokens: r.inputTokens ?? undefined,
401
+ cacheCreationInputTokens: r.cacheCreationInputTokens ?? undefined,
402
+ cacheReadInputTokens: r.cacheReadInputTokens ?? undefined,
403
+ outputTokens: r.outputTokens ?? undefined,
404
+ apiDurationMs: r.apiDurationMs ?? undefined,
405
+ stopReason: r.stopReason ?? undefined,
406
+ extensionStatus: r.extensionStatus ?? undefined,
407
+ skillsStatus: r.skillsStatus ?? undefined,
408
+ workflowRunId: r.workflowRunId ?? undefined,
409
+ }));
410
+ }
411
+ /** Get currently running executions (no finished_at) */
412
+ runningExecutions() {
413
+ return this.db.prepare(`
414
+ SELECT * FROM executions
415
+ WHERE finished_at IS NULL
416
+ ORDER BY started_at DESC
417
+ `).all();
418
+ }
419
+ /** Aggregate execution stats */
420
+ executionStats() {
421
+ const today = new Date();
422
+ today.setHours(0, 0, 0, 0);
423
+ const todayIso = today.toISOString();
424
+ const total = this.db.prepare(`SELECT COUNT(*) as c FROM executions`).get().c;
425
+ const todayCount = this.db.prepare(`SELECT COUNT(*) as c FROM executions WHERE started_at >= ?`).get(todayIso).c;
426
+ const running = this.db.prepare(`SELECT COUNT(*) as c FROM executions WHERE finished_at IS NULL`).get().c;
427
+ const skillRows = this.db.prepare(`
428
+ SELECT skill, COUNT(*) as count,
429
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as success,
430
+ SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as fail
431
+ FROM executions GROUP BY skill
432
+ `).all();
433
+ const by_skill = {};
434
+ for (const r of skillRows) {
435
+ by_skill[r.skill] = { count: r.count, success: r.success, fail: r.fail };
436
+ }
437
+ const triggerRows = this.db.prepare(`
438
+ SELECT trigger_type, COUNT(*) as count FROM executions GROUP BY trigger_type
439
+ `).all();
440
+ const by_trigger = {};
441
+ for (const r of triggerRows) {
442
+ by_trigger[r.trigger_type] = r.count;
443
+ }
444
+ return { total_executions: total, today_count: todayCount, by_skill, by_trigger, running };
445
+ }
446
+ /** Daily aggregated stats for the last N days */
447
+ dailyStats(days) {
448
+ // Build the inclusive UTC date window: [today - (days-1), today].
449
+ // SQLite's date(started_at) returns a UTC YYYY-MM-DD string, so we
450
+ // generate the same format here to align keys.
451
+ const today = new Date();
452
+ const startUtc = new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate() - (days - 1)));
453
+ const dateKeys = [];
454
+ for (let i = 0; i < days; i++) {
455
+ const d = new Date(startUtc);
456
+ d.setUTCDate(startUtc.getUTCDate() + i);
457
+ dateKeys.push(d.toISOString().slice(0, 10));
458
+ }
459
+ const rows = this.db.prepare(`
460
+ SELECT
461
+ date(started_at) AS date,
462
+ COUNT(*) AS executions,
463
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) AS successes,
464
+ SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) AS failures,
465
+ COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0) + COALESCE(SUM(cache_read_input_tokens), 0) AS totalTokens,
466
+ COALESCE(SUM(input_tokens), 0) AS inputTokens,
467
+ COALESCE(SUM(output_tokens), 0) AS outputTokens,
468
+ COALESCE(SUM(cache_read_input_tokens), 0) AS cacheReadTokens,
469
+ COALESCE(SUM(cost_usd), 0) AS costUsd
470
+ FROM executions
471
+ WHERE date(started_at) >= ?
472
+ GROUP BY date(started_at)
473
+ `).all(dateKeys[0]);
474
+ const byDate = new Map(rows.map((r) => [r.date, r]));
475
+ return dateKeys.map((date) => byDate.get(date) ?? {
476
+ date,
477
+ executions: 0,
478
+ successes: 0,
479
+ failures: 0,
480
+ totalTokens: 0,
481
+ inputTokens: 0,
482
+ outputTokens: 0,
483
+ cacheReadTokens: 0,
484
+ costUsd: 0,
485
+ });
486
+ }
487
+ /** Hourly aggregated stats for the last N hours (UTC). Bucket key is `YYYY-MM-DDTHH`. */
488
+ hourlyStats(hours) {
489
+ const now = new Date();
490
+ const startUtc = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours() - (hours - 1)));
491
+ const hourKeys = [];
492
+ for (let i = 0; i < hours; i++) {
493
+ const d = new Date(startUtc);
494
+ d.setUTCHours(startUtc.getUTCHours() + i);
495
+ // YYYY-MM-DDTHH (matches strftime('%Y-%m-%dT%H', …))
496
+ hourKeys.push(d.toISOString().slice(0, 13));
497
+ }
498
+ const rows = this.db.prepare(`
499
+ SELECT
500
+ strftime('%Y-%m-%dT%H', started_at) AS date,
501
+ COUNT(*) AS executions,
502
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) AS successes,
503
+ SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) AS failures,
504
+ COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0) + COALESCE(SUM(cache_read_input_tokens), 0) AS totalTokens,
505
+ COALESCE(SUM(input_tokens), 0) AS inputTokens,
506
+ COALESCE(SUM(output_tokens), 0) AS outputTokens,
507
+ COALESCE(SUM(cache_read_input_tokens), 0) AS cacheReadTokens,
508
+ COALESCE(SUM(cost_usd), 0) AS costUsd
509
+ FROM executions
510
+ WHERE strftime('%Y-%m-%dT%H', started_at) >= ?
511
+ GROUP BY strftime('%Y-%m-%dT%H', started_at)
512
+ `).all(hourKeys[0]);
513
+ const byHour = new Map(rows.map((r) => [r.date, r]));
514
+ return hourKeys.map((date) => byHour.get(date) ?? {
515
+ date,
516
+ executions: 0,
517
+ successes: 0,
518
+ failures: 0,
519
+ totalTokens: 0,
520
+ inputTokens: 0,
521
+ outputTokens: 0,
522
+ cacheReadTokens: 0,
523
+ costUsd: 0,
524
+ });
525
+ }
526
+ }
527
+ //# sourceMappingURL=execution-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-store.js","sourceRoot":"","sources":["../../src/state/execution-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * Apply the full SQLite schema for the harness state DB.
4
+ *
5
+ * Centralized here (rather than on a store) because the three stores
6
+ * (`WorkflowRunStore` / `ApprovalStore` / `ExecutionStore`) all share a
7
+ * single `Database` connection and assume the schema already exists. `StateDb`
8
+ * is the construction root and calls this once at boot; tests that exercise a
9
+ * store directly construct a raw `Database`, call `migrate()`, then build the
10
+ * store on top.
11
+ *
12
+ * Every statement is idempotent (`IF NOT EXISTS` / additive `ALTER` guarded by
13
+ * try/catch) so it is safe to run on an existing DB.
14
+ */
15
+ export declare function migrate(db: Database.Database): void;