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
@@ -1,6 +1,4 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import readline from "node:readline";
1
+ import { SessionLog, } from "../session-log.js";
4
2
  /**
5
3
  * Detect session type from the first user message (prompt).
6
4
  * Matches against known orchestrator prompt patterns.
@@ -38,199 +36,38 @@ function detectSessionType(firstUserMessage) {
38
36
  return "chat";
39
37
  return "agent";
40
38
  }
41
- /**
42
- * Unwrap a Claude Code CLI envelope line into a normalized JsonlMessage.
43
- *
44
- * Claude Code format: { type: "user"|"assistant"|"tool_use"|"tool_result"|...,
45
- * message: { role, content, ... } | "<json string>", timestamp, uuid, sessionId, ... }
46
- *
47
- * Hermes/Agent SDK format: { role: "user"|"assistant"|"tool"|"session_meta", content, ... }
48
- */
49
- /**
50
- * Unwrap a Claude Code CLI envelope line into normalized JsonlMessage(s).
51
- * Returns an array because one line can contain multiple tool_results.
52
- */
53
- export function unwrapLine(raw) {
54
- // Already in role-based format (Hermes / Agent SDK --print output)
55
- if (typeof raw.role === "string") {
56
- return [raw];
57
- }
58
- const type = raw.type;
59
- if (!type)
60
- return [];
61
- // Skip internal types
62
- if (type === "queue-operation" || type === "summary" || type === "login")
63
- return [];
64
- if (type === "last-prompt" || type === "attachment")
65
- return [];
66
- const timestamp = raw.timestamp;
67
- // Parse the message field — can be a JSON string or an object
68
- let msg = {};
69
- if (raw.message != null) {
70
- if (typeof raw.message === "string") {
71
- try {
72
- msg = JSON.parse(raw.message);
73
- }
74
- catch {
75
- msg = { content: raw.message };
76
- }
77
- }
78
- else if (typeof raw.message === "object") {
79
- msg = raw.message;
80
- }
81
- }
82
- if (type === "user") {
83
- const content = msg.content ?? raw.content;
84
- // User messages with tool_result blocks → emit each as a separate tool message
85
- if (Array.isArray(content)) {
86
- const hasToolResults = content.some((b) => b.type === "tool_result");
87
- if (hasToolResults) {
88
- return content
89
- .filter((b) => b.type === "tool_result")
90
- .map((b) => {
91
- const block = b;
92
- return {
93
- role: "tool",
94
- content: block.content,
95
- tool_call_id: block.tool_use_id,
96
- timestamp,
97
- };
98
- });
99
- }
100
- }
101
- return [{ role: "user", content, timestamp }];
102
- }
103
- if (type === "assistant") {
104
- if (raw.isApiErrorMessage || raw.error) {
105
- return [{ role: "system", content: String(raw.error ?? "API error"), timestamp }];
106
- }
107
- const content = msg.content;
108
- const model = msg.model;
109
- const stopReason = msg.stop_reason;
110
- let textContent;
111
- let toolCalls;
112
- let reasoning;
113
- if (Array.isArray(content)) {
114
- const textBlocks = [];
115
- const tools = [];
116
- for (const block of content) {
117
- const b = block;
118
- if (b.type === "text" && typeof b.text === "string") {
119
- textBlocks.push(b.text);
120
- }
121
- else if (b.type === "tool_use") {
122
- tools.push({
123
- id: b.id,
124
- function: { name: b.name, arguments: b.input },
125
- });
126
- }
127
- else if (b.type === "thinking" || b.type === "reasoning") {
128
- reasoning = b.thinking ?? b.text;
129
- }
130
- }
131
- if (textBlocks.length)
132
- textContent = textBlocks.join("\n");
133
- if (tools.length)
134
- toolCalls = tools;
135
- }
136
- else if (typeof content === "string") {
137
- textContent = content;
138
- }
139
- // Skip lines that only have thinking (no text, no tools) — they're noise
140
- if (!textContent && !toolCalls && reasoning)
141
- return [];
142
- // Skip completely empty assistant messages
143
- if (!textContent && !toolCalls)
144
- return [];
145
- return [{
146
- role: "assistant",
147
- content: textContent,
148
- tool_calls: toolCalls,
149
- reasoning,
150
- finish_reason: stopReason,
151
- model,
152
- timestamp,
153
- }];
154
- }
155
- if (type === "tool_result") {
156
- const content = msg.content ?? raw.content;
157
- const toolUseId = msg.tool_use_id ?? raw.tool_use_id;
158
- return [{
159
- role: "tool",
160
- content,
161
- tool_call_id: toolUseId,
162
- timestamp,
163
- }];
164
- }
165
- if (type === "tool_use") {
166
- return [{
167
- role: "assistant",
168
- tool_calls: [{
169
- id: msg.id ?? raw.uuid,
170
- function: { name: msg.name, arguments: msg.input },
171
- }],
172
- timestamp,
173
- }];
174
- }
175
- return [];
176
- }
177
39
  export class SessionReader {
178
- claudeHomeDir;
40
+ sessionLog;
179
41
  scope;
180
42
  metaCache = new Map();
181
43
  static CACHE_TTL_MS = 10_000; // 10s cache for session metadata
182
- constructor(claudeHomeDir, scope = "sandbox") {
183
- this.claudeHomeDir = claudeHomeDir;
44
+ constructor(sessionsHomeDirOrLog, scope = "sandbox") {
45
+ this.sessionLog = typeof sessionsHomeDirOrLog === "string"
46
+ ? new SessionLog(sessionsHomeDirOrLog)
47
+ : sessionsHomeDirOrLog;
184
48
  this.scope = scope;
185
49
  }
186
- /** Find the project directories this reader is scoped to. See SessionReaderScope. */
187
- projectDirs() {
188
- const projectsDir = path.join(this.claudeHomeDir, "projects");
189
- try {
190
- return fs
191
- .readdirSync(projectsDir)
192
- .filter((name) => (this.scope === "chat" ? name === "-app" : name !== "-app"))
193
- .map((d) => path.join(projectsDir, d))
194
- .filter((p) => fs.statSync(p).isDirectory());
195
- }
196
- catch {
197
- return [];
198
- }
199
- }
200
- /** Resolve session ID to its file path (search across project dirs) */
201
- pathFor(sessionId) {
202
- for (const dir of this.projectDirs()) {
203
- const candidate = path.join(dir, `${sessionId}.jsonl`);
204
- if (fs.existsSync(candidate))
205
- return candidate;
206
- }
207
- return null;
208
- }
209
50
  exists(sessionId) {
210
- return this.pathFor(sessionId) !== null;
51
+ return this.sessionLog.findSession(this.scope, sessionId) !== null;
211
52
  }
212
- /** Return all session IDs across all project directories.
53
+ /** Return all session IDs across all project directories, sorted
54
+ * newest-first by file mtime.
55
+ *
213
56
  * Filters out agent sub-sessions (agent-xxx) — those are included
214
- * in their parent session's view. */
57
+ * in their parent session's view.
58
+ *
59
+ * The newest-first ordering matters: callers (the `/sessions` list +
60
+ * SSE handlers) slice this to a `limit * 2` window BEFORE loading and
61
+ * date-sorting each session's meta. With raw `readdir` order that window
62
+ * could omit the most recent sessions entirely — e.g. today's runs living
63
+ * in repo-suffixed project dirs read after a large generic dir — so the
64
+ * list silently showed only older sessions. mtime is a cheap, reliable
65
+ * recency proxy (it tracks the last appended message) that keeps the
66
+ * freshest sessions inside the window; the handler then refines ordering
67
+ * by parsed `started_at`. Mirrors the DB-backed chat reader, which
68
+ * already returns threads newest-first. */
215
69
  listSessionIds() {
216
- const ids = [];
217
- for (const dir of this.projectDirs()) {
218
- try {
219
- for (const f of fs.readdirSync(dir)) {
220
- if (!f.endsWith(".jsonl"))
221
- continue;
222
- const id = f.slice(0, -6);
223
- // Skip agent sub-sessions — they'll be loaded via parent
224
- if (id.startsWith("agent-"))
225
- continue;
226
- ids.push(id);
227
- }
228
- }
229
- catch {
230
- // skip unreadable dirs
231
- }
232
- }
233
- return ids;
70
+ return this.sessionLog.listSessions(this.scope).map((e) => e.id);
234
71
  }
235
72
  async getSessionMeta(sessionId) {
236
73
  const cached = this.metaCache.get(sessionId);
@@ -244,25 +81,10 @@ export class SessionReader {
244
81
  return meta;
245
82
  }
246
83
  async _readSessionMeta(sessionId) {
247
- const file = this.pathFor(sessionId);
248
- if (!file)
84
+ const entry = this.sessionLog.findSession(this.scope, sessionId);
85
+ if (!entry)
249
86
  return null;
250
- // Collect all files to scan: main session + agent sub-sessions
251
- const filesToScan = [file];
252
- const dir = path.dirname(file);
253
- // Check for agent files in same directory (old layout)
254
- // and in subagents/ subdirectory (new layout)
255
- const agentDirs = [dir, path.join(dir, sessionId, "subagents")];
256
- for (const agentDir of agentDirs) {
257
- try {
258
- for (const f of fs.readdirSync(agentDir)) {
259
- if (!f.startsWith("agent-") || !f.endsWith(".jsonl"))
260
- continue;
261
- filesToScan.push(path.join(agentDir, f));
262
- }
263
- }
264
- catch { /* dir doesn't exist */ }
265
- }
87
+ const filesToScan = this.sessionLog.relatedFilesForSession(this.scope, sessionId, { includeAgents: true });
266
88
  let source = "agent";
267
89
  let model = null;
268
90
  let startedAt = null;
@@ -274,18 +96,8 @@ export class SessionReader {
274
96
  let firstUserMessage = null;
275
97
  const agentIds = [];
276
98
  for (const scanFile of filesToScan) {
277
- const stream = fs.createReadStream(scanFile, { encoding: "utf8" });
278
- const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
279
- for await (const line of rl) {
280
- if (!line.trim())
281
- continue;
282
- let raw;
283
- try {
284
- raw = JSON.parse(line);
285
- }
286
- catch {
287
- continue;
288
- }
99
+ const records = await this.sessionLog.readNormalizedFile(scanFile);
100
+ for (const { raw, msg } of records) {
289
101
  // Track agent sub-sessions
290
102
  const agentId = raw.agentId;
291
103
  if (agentId && !agentIds.includes(agentId)) {
@@ -294,66 +106,66 @@ export class SessionReader {
294
106
  // Extract source from userType field
295
107
  if (raw.userType === "external")
296
108
  source = "agent";
297
- const msgs = unwrapLine(raw);
298
- if (!msgs.length)
299
- continue;
300
- for (const msg of msgs) {
301
- // Extract model from first assistant message
302
- if (msg.role === "assistant" && msg.model && !model) {
303
- model = msg.model;
304
- }
305
- // Handle session_meta (Hermes format)
306
- if (msg.role === "session_meta") {
307
- source = msg.platform ?? msg.source ?? source;
308
- model = msg.model ?? model;
309
- if (msg.timestamp) {
310
- startedAt = new Date(msg.timestamp).getTime() / 1000;
311
- }
312
- continue;
313
- }
109
+ // Extract model from first assistant message
110
+ if (msg.role === "assistant" && msg.model && !model) {
111
+ model = msg.model;
112
+ }
113
+ // Handle session_meta (Hermes format)
114
+ if (msg.role === "session_meta") {
115
+ source = msg.platform ?? msg.source ?? source;
116
+ model = msg.model ?? model;
314
117
  if (msg.timestamp) {
315
- const ts = new Date(msg.timestamp).getTime() / 1000;
316
- if (!Number.isNaN(ts)) {
317
- // True min/max across the main session AND every agent sub-
318
- // session file. The previous "first / last seen" logic broke
319
- // when multiple files were scanned in non-chronological
320
- // readdir order — `lastMessageAt` ended up being the final
321
- // timestamp of whichever file was scanned last, which could
322
- // easily be older than the real most recent message.
323
- if (startedAt === null || ts < startedAt)
324
- startedAt = ts;
325
- if (lastMessageAt === null || ts > lastMessageAt)
326
- lastMessageAt = ts;
327
- }
118
+ startedAt = new Date(msg.timestamp).getTime() / 1000;
328
119
  }
329
- if (msg.role === "user" || msg.role === "assistant" || msg.role === "tool") {
330
- messageCount++;
331
- conversationMessageCount++;
120
+ continue;
121
+ }
122
+ if (msg.timestamp) {
123
+ const ts = new Date(msg.timestamp).getTime() / 1000;
124
+ if (!Number.isNaN(ts)) {
125
+ // True min/max across the main session AND every agent sub-
126
+ // session file. The previous "first / last seen" logic broke
127
+ // when multiple files were scanned in non-chronological
128
+ // readdir order — `lastMessageAt` ended up being the final
129
+ // timestamp of whichever file was scanned last, which could
130
+ // easily be older than the real most recent message.
131
+ if (startedAt === null || ts < startedAt)
132
+ startedAt = ts;
133
+ if (lastMessageAt === null || ts > lastMessageAt)
134
+ lastMessageAt = ts;
332
135
  }
333
- // Capture first user message for type detection
334
- if (msg.role === "user" && firstUserMessage === null && msg.content) {
335
- firstUserMessage = typeof msg.content === "string"
136
+ }
137
+ if (msg.role === "user" || msg.role === "assistant" || msg.role === "tool") {
138
+ messageCount++;
139
+ conversationMessageCount++;
140
+ }
141
+ // Capture first user message for type detection
142
+ if (msg.role === "user" && firstUserMessage === null && msg.content) {
143
+ firstUserMessage = typeof msg.content === "string"
144
+ ? msg.content
145
+ : Array.isArray(msg.content)
336
146
  ? msg.content
337
- : Array.isArray(msg.content)
338
- ? msg.content
339
- .filter((b) => b.type === "text")
340
- .map((b) => b.text)
341
- .join(" ")
342
- : JSON.stringify(msg.content);
147
+ .filter((b) => b.type === "text")
148
+ .map((b) => b.text)
149
+ .join(" ")
150
+ : JSON.stringify(msg.content);
151
+ }
152
+ if (msg.role === "assistant") {
153
+ if (msg.tool_calls && Array.isArray(msg.tool_calls)) {
154
+ toolCallCount += msg.tool_calls.length;
343
155
  }
344
- if (msg.role === "assistant") {
345
- if (msg.tool_calls && Array.isArray(msg.tool_calls)) {
346
- toolCallCount += msg.tool_calls.length;
347
- }
348
- if (typeof msg.content === "string" && msg.content) {
349
- lastAssistantContent = msg.content;
350
- }
156
+ if (typeof msg.content === "string" && msg.content) {
157
+ lastAssistantContent = msg.content;
351
158
  }
352
159
  }
353
160
  }
354
161
  }
355
162
  if (startedAt === null) {
356
- startedAt = Date.now() / 1000;
163
+ // No parseable timestamps (empty or malformed file). Fall back to the
164
+ // file's mtime — its real last-write time — NOT Date.now(). Using "now"
165
+ // made a zero-byte/timestamp-less session masquerade as freshly active:
166
+ // it sorted to the top of the list and tripped the 5-minute liveness
167
+ // check, surfacing dead runs as live sessions.
168
+ startedAt = entry.mtimeMs > 0 ? entry.mtimeMs / 1000 : Date.now() / 1000;
357
169
  }
358
170
  const sessionType = detectSessionType(firstUserMessage ?? "");
359
171
  return {
@@ -376,53 +188,17 @@ export class SessionReader {
376
188
  * belong to this session, interleaved by timestamp.
377
189
  */
378
190
  async read(sessionId) {
379
- const file = this.pathFor(sessionId);
380
- if (!file)
381
- return [];
382
- const dir = path.dirname(file);
383
- const allMessages = [];
384
- // Read main session file
385
- await this.readFile(file, allMessages);
386
- // Find and read agent sub-sessions
387
- const agentDirs = [dir, path.join(dir, sessionId, "subagents")];
388
- for (const agentDir of agentDirs) {
389
- try {
390
- for (const f of fs.readdirSync(agentDir)) {
391
- if (!f.startsWith("agent-") || !f.endsWith(".jsonl"))
392
- continue;
393
- await this.readFile(path.join(agentDir, f), allMessages);
394
- }
395
- }
396
- catch { /* dir doesn't exist */ }
397
- }
398
- // Sort by timestamp and assign indices
399
- allMessages.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
400
- return allMessages.map((m, i) => ({ index: i, msg: m.msg }));
401
- }
402
- async readFile(file, out) {
403
- const stream = fs.createReadStream(file, { encoding: "utf8" });
404
- const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
405
- for await (const line of rl) {
406
- if (!line.trim())
407
- continue;
408
- try {
409
- const raw = JSON.parse(line);
410
- const msgs = unwrapLine(raw);
411
- for (const msg of msgs) {
412
- if (msg.role === "system" && !msg.content)
413
- continue;
414
- const timestamp = msg.timestamp ?? raw.timestamp ?? "";
415
- out.push({ timestamp: timestamp, msg });
416
- }
417
- }
418
- catch {
419
- // skip malformed
420
- }
421
- }
191
+ return this.sessionLog.readNormalizedSession(this.scope, sessionId, {
192
+ includeAgents: true,
193
+ skipEmptySystem: true,
194
+ });
422
195
  }
423
196
  /** Get the file path for a session (needed by the tailer) */
424
197
  getFilePath(sessionId) {
425
- return this.pathFor(sessionId);
198
+ return this.sessionLog.findSession(this.scope, sessionId)?.filePath ?? null;
199
+ }
200
+ normalizeRawLine(raw) {
201
+ return this.sessionLog.normalizeLine(raw);
426
202
  }
427
203
  }
428
204
  //# sourceMappingURL=sessions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/admin/sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/admin/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,78 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { SessionReader } from "./sessions.js";
6
+ /**
7
+ * Regression coverage for the sandbox "Sessions" tab silently hiding the
8
+ * newest sessions. The list handler slices `listSessionIds()` to a
9
+ * `limit * 2` window BEFORE loading + date-sorting each session's meta, so
10
+ * `listSessionIds()` must return ids newest-first (by mtime). When it
11
+ * returned raw readdir order, today's runs — written to repo-suffixed
12
+ * project dirs read after a large generic dir — fell outside the window and
13
+ * never appeared until "Load more" pushed the limit past the backlog.
14
+ */
15
+ describe("SessionReader.listSessionIds ordering", () => {
16
+ let home;
17
+ beforeEach(() => {
18
+ home = fs.mkdtempSync(path.join(os.tmpdir(), "ll-sessions-"));
19
+ fs.mkdirSync(path.join(home, "projects"), { recursive: true });
20
+ });
21
+ afterEach(() => {
22
+ fs.rmSync(home, { recursive: true, force: true });
23
+ });
24
+ /** Create a session jsonl in `projectDir` and stamp its mtime. */
25
+ function writeSession(projectDir, id, mtimeMs) {
26
+ const dir = path.join(home, "projects", projectDir);
27
+ fs.mkdirSync(dir, { recursive: true });
28
+ const file = path.join(dir, `${id}.jsonl`);
29
+ fs.writeFileSync(file, JSON.stringify({ type: "user", message: { role: "user", content: id } }) + "\n");
30
+ const t = new Date(mtimeMs);
31
+ fs.utimesSync(file, t, t);
32
+ }
33
+ it("returns ids newest-first by mtime across project dirs", () => {
34
+ // An old session in the big generic dir, and a newer one in a
35
+ // repo-suffixed dir — the exact shape that used to hide today's runs.
36
+ writeSession("-home-agent-workspace", "old-session", 1_000_000);
37
+ writeSession("-home-agent-workspace-lastlight", "new-session", 9_000_000);
38
+ writeSession("-home-agent-workspace", "mid-session", 5_000_000);
39
+ const reader = new SessionReader(home, "sandbox");
40
+ expect(reader.listSessionIds()).toEqual(["new-session", "mid-session", "old-session"]);
41
+ });
42
+ it("keeps the newest session inside a limit*2 window (handler slice semantics)", () => {
43
+ // 60 old sessions in the generic dir + 1 fresh session in a repo dir.
44
+ for (let i = 0; i < 60; i++) {
45
+ writeSession("-home-agent-workspace", `old-${String(i).padStart(3, "0")}`, 1_000_000 + i);
46
+ }
47
+ writeSession("-home-agent-workspace-lastlight", "todays-run", 9_000_000);
48
+ const reader = new SessionReader(home, "sandbox");
49
+ const limit = 25; // window = 50, smaller than the 61-session backlog
50
+ const windowed = reader.listSessionIds().slice(0, limit * 2);
51
+ expect(windowed).toContain("todays-run");
52
+ expect(windowed[0]).toBe("todays-run");
53
+ });
54
+ it("uses file mtime (not now) as started_at for an empty/timestamp-less file", async () => {
55
+ const mtime = 1_700_000_000_000; // fixed past instant
56
+ writeSession("-home-agent-workspace", "empty-run", mtime);
57
+ // Zero it out so there are no parseable timestamps inside.
58
+ const file = path.join(home, "projects", "-home-agent-workspace", "empty-run.jsonl");
59
+ fs.writeFileSync(file, "");
60
+ const t = new Date(mtime);
61
+ fs.utimesSync(file, t, t);
62
+ const reader = new SessionReader(home, "sandbox");
63
+ const meta = await reader.getSessionMeta("empty-run");
64
+ expect(meta).not.toBeNull();
65
+ // started_at should track the real mtime, not Date.now()
66
+ expect(meta.started_at).toBeCloseTo(mtime / 1000, 0);
67
+ expect(meta.message_count).toBe(0);
68
+ });
69
+ it("excludes the -app (chat) project dir under the sandbox scope", () => {
70
+ writeSession("-app", "chat-session", 9_000_000);
71
+ writeSession("-home-agent-workspace", "sandbox-session", 1_000_000);
72
+ const reader = new SessionReader(home, "sandbox");
73
+ const ids = reader.listSessionIds();
74
+ expect(ids).toContain("sandbox-session");
75
+ expect(ids).not.toContain("chat-session");
76
+ });
77
+ });
78
+ //# sourceMappingURL=sessions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.test.js","sourceRoot":"","sources":["../../src/admin/sessions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface RepoVersion {
2
+ current: string | null;
3
+ latest: string | null;
4
+ behind: boolean;
5
+ }
6
+ export interface ServerVersion {
7
+ core: RepoVersion;
8
+ overlay: RepoVersion;
9
+ /** package.json version of the running harness. */
10
+ packageVersion: string | null;
11
+ /** Build date baked into the image (LASTLIGHT_BUILD_DATE), if any. */
12
+ buildDate: string | null;
13
+ }
14
+ /** Compute core + overlay version drift for `GET /admin/api/server/info`. */
15
+ export declare function getServerVersion(): Promise<ServerVersion>;