@phnx-labs/agents-cli 0.1.0 → 1.14.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 (554) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +283 -372
  3. package/dist/commands/alias.d.ts +11 -0
  4. package/dist/commands/alias.js +117 -0
  5. package/dist/commands/beta.d.ts +2 -0
  6. package/dist/commands/beta.js +53 -0
  7. package/dist/commands/cloud.d.ts +8 -1
  8. package/dist/commands/cloud.js +108 -22
  9. package/dist/commands/commands.d.ts +9 -1
  10. package/dist/commands/commands.js +24 -172
  11. package/dist/commands/daemon.d.ts +8 -1
  12. package/dist/commands/daemon.js +13 -5
  13. package/dist/commands/doctor.d.ts +15 -0
  14. package/dist/commands/doctor.js +132 -0
  15. package/dist/commands/drive.d.ts +8 -1
  16. package/dist/commands/drive.js +20 -3
  17. package/dist/commands/exec.d.ts +8 -1
  18. package/dist/commands/exec.js +96 -27
  19. package/dist/commands/factory.d.ts +19 -0
  20. package/dist/commands/factory.js +71 -0
  21. package/dist/commands/fork.d.ts +8 -1
  22. package/dist/commands/fork.js +11 -4
  23. package/dist/commands/hooks.d.ts +9 -1
  24. package/dist/commands/hooks.js +30 -182
  25. package/dist/commands/init.d.ts +15 -1
  26. package/dist/commands/init.js +168 -74
  27. package/dist/commands/mcp.d.ts +9 -1
  28. package/dist/commands/mcp.js +11 -7
  29. package/dist/commands/models.d.ts +8 -1
  30. package/dist/commands/models.js +16 -4
  31. package/dist/commands/packages.d.ts +8 -1
  32. package/dist/commands/packages.js +13 -7
  33. package/dist/commands/permissions.d.ts +9 -1
  34. package/dist/commands/permissions.js +3 -3
  35. package/dist/commands/plugins.d.ts +8 -1
  36. package/dist/commands/plugins.js +13 -2
  37. package/dist/commands/profiles.d.ts +9 -1
  38. package/dist/commands/profiles.js +56 -7
  39. package/dist/commands/prune.d.ts +22 -0
  40. package/dist/commands/prune.js +191 -0
  41. package/dist/commands/pty.d.ts +1 -1
  42. package/dist/commands/pty.js +2 -1
  43. package/dist/commands/pull.d.ts +8 -1
  44. package/dist/commands/pull.js +58 -128
  45. package/dist/commands/refresh-memory.d.ts +7 -1
  46. package/dist/commands/refresh-memory.js +7 -1
  47. package/dist/commands/repo.d.ts +15 -0
  48. package/dist/commands/repo.js +570 -0
  49. package/dist/commands/resource-view.d.ts +10 -3
  50. package/dist/commands/resource-view.js +18 -5
  51. package/dist/commands/routines.d.ts +8 -1
  52. package/dist/commands/routines.js +17 -4
  53. package/dist/commands/rules.d.ts +9 -1
  54. package/dist/commands/rules.js +16 -11
  55. package/dist/commands/secrets.d.ts +8 -1
  56. package/dist/commands/secrets.js +235 -63
  57. package/dist/commands/sessions-picker.d.ts +2 -1
  58. package/dist/commands/sessions-picker.js +88 -11
  59. package/dist/commands/sessions-tail.d.ts +19 -0
  60. package/dist/commands/sessions-tail.js +235 -0
  61. package/dist/commands/sessions.d.ts +2 -1
  62. package/dist/commands/sessions.js +188 -7
  63. package/dist/commands/skills.d.ts +9 -1
  64. package/dist/commands/skills.js +28 -178
  65. package/dist/commands/status.d.ts +7 -1
  66. package/dist/commands/status.js +7 -1
  67. package/dist/commands/subagents.d.ts +8 -1
  68. package/dist/commands/subagents.js +11 -1
  69. package/dist/commands/sync.d.ts +8 -1
  70. package/dist/commands/sync.js +8 -1
  71. package/dist/commands/teams-picker.d.ts +4 -1
  72. package/dist/commands/teams-picker.js +55 -3
  73. package/dist/commands/teams.d.ts +15 -1
  74. package/dist/commands/teams.js +323 -69
  75. package/dist/commands/usage.d.ts +11 -0
  76. package/dist/commands/usage.js +60 -0
  77. package/dist/commands/utils.d.ts +6 -1
  78. package/dist/commands/utils.js +6 -1
  79. package/dist/commands/versions.d.ts +8 -1
  80. package/dist/commands/versions.js +4 -3
  81. package/dist/commands/view.d.ts +47 -2
  82. package/dist/commands/view.js +317 -24
  83. package/dist/index.d.ts +7 -2
  84. package/dist/index.js +172 -34
  85. package/dist/lib/acp/client.d.ts +31 -0
  86. package/dist/lib/acp/client.js +117 -0
  87. package/dist/lib/acp/harnesses.d.ts +26 -0
  88. package/dist/lib/acp/harnesses.js +65 -0
  89. package/dist/lib/acp/run.d.ts +18 -0
  90. package/dist/lib/acp/run.js +39 -0
  91. package/dist/lib/agents.d.ts +74 -2
  92. package/dist/lib/agents.js +197 -21
  93. package/dist/lib/artifact-actions.d.ts +8 -4
  94. package/dist/lib/artifact-actions.js +8 -6
  95. package/dist/lib/auto-pull-worker.d.ts +11 -0
  96. package/dist/lib/auto-pull-worker.js +121 -0
  97. package/dist/lib/auto-pull.d.ts +31 -0
  98. package/dist/lib/auto-pull.js +97 -0
  99. package/dist/lib/beta.d.ts +23 -0
  100. package/dist/lib/beta.js +90 -0
  101. package/dist/lib/capabilities.d.ts +29 -0
  102. package/dist/lib/capabilities.js +74 -0
  103. package/dist/lib/cloud/codex.d.ts +9 -3
  104. package/dist/lib/cloud/codex.js +53 -13
  105. package/dist/lib/cloud/factory.d.ts +8 -3
  106. package/dist/lib/cloud/factory.js +19 -3
  107. package/dist/lib/cloud/registry.d.ts +10 -1
  108. package/dist/lib/cloud/registry.js +14 -3
  109. package/dist/lib/cloud/rush.d.ts +63 -3
  110. package/dist/lib/cloud/rush.js +273 -20
  111. package/dist/lib/cloud/store.d.ts +13 -1
  112. package/dist/lib/cloud/store.js +23 -4
  113. package/dist/lib/cloud/stream.d.ts +6 -1
  114. package/dist/lib/cloud/stream.js +95 -39
  115. package/dist/lib/cloud/types.d.ts +153 -8
  116. package/dist/lib/cloud/types.js +34 -2
  117. package/dist/lib/command-skills.d.ts +20 -0
  118. package/dist/lib/command-skills.js +142 -0
  119. package/dist/lib/commands.d.ts +22 -2
  120. package/dist/lib/commands.js +51 -11
  121. package/dist/lib/convert.d.ts +10 -1
  122. package/dist/lib/convert.js +9 -1
  123. package/dist/lib/daemon.d.ts +21 -1
  124. package/dist/lib/daemon.js +97 -4
  125. package/dist/lib/drive-sync.d.ts +18 -1
  126. package/dist/lib/drive-sync.js +57 -15
  127. package/dist/lib/exec.d.ts +23 -6
  128. package/dist/lib/exec.js +53 -17
  129. package/dist/lib/fs-walk.d.ts +2 -0
  130. package/dist/lib/fs-walk.js +40 -0
  131. package/dist/lib/fuzzy.d.ts +53 -0
  132. package/dist/lib/fuzzy.js +72 -0
  133. package/dist/lib/gemini-settings.d.ts +4 -0
  134. package/dist/lib/gemini-settings.js +33 -0
  135. package/dist/lib/git.d.ts +12 -2
  136. package/dist/lib/git.js +17 -6
  137. package/dist/lib/help.d.ts +20 -1
  138. package/dist/lib/help.js +45 -6
  139. package/dist/lib/hooks/match.d.ts +32 -0
  140. package/dist/lib/hooks/match.js +120 -0
  141. package/dist/lib/hooks.d.ts +17 -4
  142. package/dist/lib/hooks.js +119 -101
  143. package/dist/lib/manifest.d.ts +6 -1
  144. package/dist/lib/manifest.js +15 -4
  145. package/dist/lib/markdown.d.ts +0 -1
  146. package/dist/lib/markdown.js +6 -1
  147. package/dist/lib/mcp.d.ts +0 -1
  148. package/dist/lib/mcp.js +29 -33
  149. package/dist/lib/memory-compile.d.ts +13 -3
  150. package/dist/lib/memory-compile.js +31 -9
  151. package/dist/lib/memory.d.ts +14 -7
  152. package/dist/lib/memory.js +67 -38
  153. package/dist/lib/migrate.d.ts +8 -0
  154. package/dist/lib/migrate.js +85 -0
  155. package/dist/lib/models.d.ts +10 -4
  156. package/dist/lib/models.js +36 -15
  157. package/dist/lib/onepassword.d.ts +63 -0
  158. package/dist/lib/onepassword.js +186 -0
  159. package/dist/lib/paths.d.ts +8 -0
  160. package/dist/lib/paths.js +20 -0
  161. package/dist/lib/permissions.d.ts +24 -2
  162. package/dist/lib/permissions.js +117 -48
  163. package/dist/lib/picker.d.ts +10 -1
  164. package/dist/lib/picker.js +15 -1
  165. package/dist/lib/plugins.d.ts +7 -1
  166. package/dist/lib/plugins.js +10 -1
  167. package/dist/lib/profiles-presets.d.ts +10 -1
  168. package/dist/lib/profiles-presets.js +9 -1
  169. package/dist/lib/profiles.d.ts +35 -1
  170. package/dist/lib/profiles.js +36 -15
  171. package/dist/lib/pty-client.d.ts +1 -1
  172. package/dist/lib/pty-client.js +0 -1
  173. package/dist/lib/pty-server.d.ts +16 -2
  174. package/dist/lib/pty-server.js +92 -3
  175. package/dist/lib/registry.d.ts +23 -3
  176. package/dist/lib/registry.js +153 -8
  177. package/dist/lib/resources.d.ts +28 -1
  178. package/dist/lib/resources.js +79 -1
  179. package/dist/lib/rotate.d.ts +40 -13
  180. package/dist/lib/rotate.js +238 -40
  181. package/dist/lib/routines.d.ts +29 -1
  182. package/dist/lib/routines.js +32 -5
  183. package/dist/lib/runner.d.ts +14 -1
  184. package/dist/lib/runner.js +22 -3
  185. package/dist/lib/sandbox.d.ts +16 -1
  186. package/dist/lib/sandbox.js +39 -16
  187. package/dist/lib/scheduler.d.ts +8 -1
  188. package/dist/lib/scheduler.js +8 -1
  189. package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
  190. package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
  191. package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
  192. package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
  193. package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
  194. package/dist/lib/{secrets-bundles.d.ts → secrets/bundles.d.ts} +12 -2
  195. package/dist/lib/{secrets-bundles.js → secrets/bundles.js} +38 -17
  196. package/dist/lib/secrets/index.d.ts +55 -0
  197. package/dist/lib/secrets/index.js +211 -0
  198. package/dist/lib/secrets/profiles.d.ts +10 -0
  199. package/dist/lib/secrets/profiles.js +13 -0
  200. package/dist/lib/session/active.d.ts +43 -0
  201. package/dist/lib/session/active.js +392 -0
  202. package/dist/lib/session/artifacts.d.ts +12 -1
  203. package/dist/lib/session/artifacts.js +25 -5
  204. package/dist/lib/session/cloud.d.ts +30 -0
  205. package/dist/lib/session/cloud.js +121 -0
  206. package/dist/lib/session/db.d.ts +23 -2
  207. package/dist/lib/session/db.js +76 -12
  208. package/dist/lib/session/discover.d.ts +19 -4
  209. package/dist/lib/session/discover.js +344 -48
  210. package/dist/lib/session/parse.d.ts +28 -1
  211. package/dist/lib/session/parse.js +267 -9
  212. package/dist/lib/session/prompt.d.ts +9 -1
  213. package/dist/lib/session/prompt.js +17 -3
  214. package/dist/lib/session/render.d.ts +13 -1
  215. package/dist/lib/session/render.js +20 -1
  216. package/dist/lib/session/team-filter.d.ts +9 -1
  217. package/dist/lib/session/team-filter.js +11 -2
  218. package/dist/lib/session/types.d.ts +16 -2
  219. package/dist/lib/session/types.js +10 -2
  220. package/dist/lib/shims.d.ts +64 -5
  221. package/dist/lib/shims.js +309 -47
  222. package/dist/lib/skills.d.ts +27 -2
  223. package/dist/lib/skills.js +127 -65
  224. package/dist/lib/sqlite.d.ts +43 -0
  225. package/dist/lib/sqlite.js +94 -0
  226. package/dist/lib/state.d.ts +112 -27
  227. package/dist/lib/state.js +320 -148
  228. package/dist/lib/subagents.d.ts +9 -1
  229. package/dist/lib/subagents.js +70 -63
  230. package/dist/lib/sync-manifest.d.ts +81 -0
  231. package/dist/lib/sync-manifest.js +450 -0
  232. package/dist/lib/teams/agents.d.ts +103 -5
  233. package/dist/lib/teams/agents.js +414 -91
  234. package/dist/lib/teams/api.d.ts +26 -3
  235. package/dist/lib/teams/api.js +63 -3
  236. package/dist/lib/teams/debug.d.ts +6 -1
  237. package/dist/lib/teams/debug.js +6 -1
  238. package/dist/lib/teams/file_ops.d.ts +7 -1
  239. package/dist/lib/teams/file_ops.js +7 -1
  240. package/dist/lib/teams/index.d.ts +15 -0
  241. package/dist/lib/teams/index.js +14 -0
  242. package/dist/lib/teams/parsers.d.ts +4 -1
  243. package/dist/lib/teams/parsers.js +11 -1
  244. package/dist/lib/teams/persistence.d.ts +15 -1
  245. package/dist/lib/teams/persistence.js +102 -20
  246. package/dist/lib/teams/registry.d.ts +12 -1
  247. package/dist/lib/teams/registry.js +116 -33
  248. package/dist/lib/teams/summarizer.d.ts +15 -1
  249. package/dist/lib/teams/summarizer.js +14 -1
  250. package/dist/lib/teams/supervisor.d.ts +48 -0
  251. package/dist/lib/teams/supervisor.js +73 -0
  252. package/dist/lib/template.d.ts +8 -6
  253. package/dist/lib/template.js +8 -6
  254. package/dist/lib/types.d.ts +147 -8
  255. package/dist/lib/types.js +26 -3
  256. package/dist/lib/usage.d.ts +32 -1
  257. package/dist/lib/usage.js +70 -6
  258. package/dist/lib/version-duplicates.d.ts +21 -0
  259. package/dist/lib/version-duplicates.js +90 -0
  260. package/dist/lib/versions.d.ts +33 -4
  261. package/dist/lib/versions.js +376 -108
  262. package/package.json +32 -17
  263. package/scripts/postinstall.js +126 -30
  264. package/dist/commands/__tests__/sessions.test.d.ts +0 -2
  265. package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
  266. package/dist/commands/__tests__/sessions.test.js +0 -636
  267. package/dist/commands/__tests__/sessions.test.js.map +0 -1
  268. package/dist/commands/cloud.d.ts.map +0 -1
  269. package/dist/commands/cloud.js.map +0 -1
  270. package/dist/commands/commands.d.ts.map +0 -1
  271. package/dist/commands/commands.js.map +0 -1
  272. package/dist/commands/daemon.d.ts.map +0 -1
  273. package/dist/commands/daemon.js.map +0 -1
  274. package/dist/commands/drive.d.ts.map +0 -1
  275. package/dist/commands/drive.js.map +0 -1
  276. package/dist/commands/exec.d.ts.map +0 -1
  277. package/dist/commands/exec.js.map +0 -1
  278. package/dist/commands/fork.d.ts.map +0 -1
  279. package/dist/commands/fork.js.map +0 -1
  280. package/dist/commands/hooks.d.ts.map +0 -1
  281. package/dist/commands/hooks.js.map +0 -1
  282. package/dist/commands/init.d.ts.map +0 -1
  283. package/dist/commands/init.js.map +0 -1
  284. package/dist/commands/mcp.d.ts.map +0 -1
  285. package/dist/commands/mcp.js.map +0 -1
  286. package/dist/commands/models.d.ts.map +0 -1
  287. package/dist/commands/models.js.map +0 -1
  288. package/dist/commands/packages.d.ts.map +0 -1
  289. package/dist/commands/packages.js.map +0 -1
  290. package/dist/commands/permissions.d.ts.map +0 -1
  291. package/dist/commands/permissions.js.map +0 -1
  292. package/dist/commands/plugins.d.ts.map +0 -1
  293. package/dist/commands/plugins.js.map +0 -1
  294. package/dist/commands/profiles.d.ts.map +0 -1
  295. package/dist/commands/profiles.js.map +0 -1
  296. package/dist/commands/pty.d.ts.map +0 -1
  297. package/dist/commands/pty.js.map +0 -1
  298. package/dist/commands/pull.d.ts.map +0 -1
  299. package/dist/commands/pull.js.map +0 -1
  300. package/dist/commands/push.d.ts +0 -3
  301. package/dist/commands/push.d.ts.map +0 -1
  302. package/dist/commands/push.js +0 -180
  303. package/dist/commands/push.js.map +0 -1
  304. package/dist/commands/refresh-memory.d.ts.map +0 -1
  305. package/dist/commands/refresh-memory.js.map +0 -1
  306. package/dist/commands/resource-view.d.ts.map +0 -1
  307. package/dist/commands/resource-view.js.map +0 -1
  308. package/dist/commands/routines.d.ts.map +0 -1
  309. package/dist/commands/routines.js.map +0 -1
  310. package/dist/commands/rules.d.ts.map +0 -1
  311. package/dist/commands/rules.js.map +0 -1
  312. package/dist/commands/secrets.d.ts.map +0 -1
  313. package/dist/commands/secrets.js.map +0 -1
  314. package/dist/commands/sessions-picker.d.ts.map +0 -1
  315. package/dist/commands/sessions-picker.js.map +0 -1
  316. package/dist/commands/sessions.d.ts.map +0 -1
  317. package/dist/commands/sessions.js.map +0 -1
  318. package/dist/commands/skills.d.ts.map +0 -1
  319. package/dist/commands/skills.js.map +0 -1
  320. package/dist/commands/status.d.ts.map +0 -1
  321. package/dist/commands/status.js.map +0 -1
  322. package/dist/commands/subagents.d.ts.map +0 -1
  323. package/dist/commands/subagents.js.map +0 -1
  324. package/dist/commands/sync.d.ts.map +0 -1
  325. package/dist/commands/sync.js.map +0 -1
  326. package/dist/commands/teams-picker.d.ts.map +0 -1
  327. package/dist/commands/teams-picker.js.map +0 -1
  328. package/dist/commands/teams.d.ts.map +0 -1
  329. package/dist/commands/teams.js.map +0 -1
  330. package/dist/commands/utils.d.ts.map +0 -1
  331. package/dist/commands/utils.js.map +0 -1
  332. package/dist/commands/versions.d.ts.map +0 -1
  333. package/dist/commands/versions.js.map +0 -1
  334. package/dist/commands/view.d.ts.map +0 -1
  335. package/dist/commands/view.js.map +0 -1
  336. package/dist/index.d.ts.map +0 -1
  337. package/dist/index.js.map +0 -1
  338. package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
  339. package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
  340. package/dist/lib/__tests__/bugfixes.test.js +0 -192
  341. package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
  342. package/dist/lib/__tests__/exec.test.d.ts +0 -2
  343. package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
  344. package/dist/lib/__tests__/exec.test.js +0 -446
  345. package/dist/lib/__tests__/exec.test.js.map +0 -1
  346. package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
  347. package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
  348. package/dist/lib/__tests__/git-sync.test.js +0 -138
  349. package/dist/lib/__tests__/git-sync.test.js.map +0 -1
  350. package/dist/lib/__tests__/hooks.test.d.ts +0 -2
  351. package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
  352. package/dist/lib/__tests__/hooks.test.js +0 -203
  353. package/dist/lib/__tests__/hooks.test.js.map +0 -1
  354. package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
  355. package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
  356. package/dist/lib/__tests__/memory-compile.test.js +0 -95
  357. package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
  358. package/dist/lib/__tests__/models.test.d.ts +0 -2
  359. package/dist/lib/__tests__/models.test.d.ts.map +0 -1
  360. package/dist/lib/__tests__/models.test.js +0 -239
  361. package/dist/lib/__tests__/models.test.js.map +0 -1
  362. package/dist/lib/__tests__/rotate.test.d.ts +0 -2
  363. package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
  364. package/dist/lib/__tests__/rotate.test.js +0 -80
  365. package/dist/lib/__tests__/rotate.test.js.map +0 -1
  366. package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
  367. package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
  368. package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
  369. package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
  370. package/dist/lib/__tests__/secrets.test.d.ts +0 -2
  371. package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
  372. package/dist/lib/__tests__/secrets.test.js +0 -90
  373. package/dist/lib/__tests__/secrets.test.js.map +0 -1
  374. package/dist/lib/__tests__/shims.test.d.ts +0 -2
  375. package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
  376. package/dist/lib/__tests__/shims.test.js +0 -39
  377. package/dist/lib/__tests__/shims.test.js.map +0 -1
  378. package/dist/lib/__tests__/usage.test.d.ts +0 -2
  379. package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
  380. package/dist/lib/__tests__/usage.test.js +0 -220
  381. package/dist/lib/__tests__/usage.test.js.map +0 -1
  382. package/dist/lib/__tests__/versions.test.d.ts +0 -2
  383. package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
  384. package/dist/lib/__tests__/versions.test.js +0 -63
  385. package/dist/lib/__tests__/versions.test.js.map +0 -1
  386. package/dist/lib/agents.d.ts.map +0 -1
  387. package/dist/lib/agents.js.map +0 -1
  388. package/dist/lib/artifact-actions.d.ts.map +0 -1
  389. package/dist/lib/artifact-actions.js.map +0 -1
  390. package/dist/lib/cloud/codex.d.ts.map +0 -1
  391. package/dist/lib/cloud/codex.js.map +0 -1
  392. package/dist/lib/cloud/factory.d.ts.map +0 -1
  393. package/dist/lib/cloud/factory.js.map +0 -1
  394. package/dist/lib/cloud/registry.d.ts.map +0 -1
  395. package/dist/lib/cloud/registry.js.map +0 -1
  396. package/dist/lib/cloud/rush.d.ts.map +0 -1
  397. package/dist/lib/cloud/rush.js.map +0 -1
  398. package/dist/lib/cloud/store.d.ts.map +0 -1
  399. package/dist/lib/cloud/store.js.map +0 -1
  400. package/dist/lib/cloud/stream.d.ts.map +0 -1
  401. package/dist/lib/cloud/stream.js.map +0 -1
  402. package/dist/lib/cloud/types.d.ts.map +0 -1
  403. package/dist/lib/cloud/types.js.map +0 -1
  404. package/dist/lib/commands.d.ts.map +0 -1
  405. package/dist/lib/commands.js.map +0 -1
  406. package/dist/lib/convert.d.ts.map +0 -1
  407. package/dist/lib/convert.js.map +0 -1
  408. package/dist/lib/daemon.d.ts.map +0 -1
  409. package/dist/lib/daemon.js.map +0 -1
  410. package/dist/lib/drive-sync.d.ts.map +0 -1
  411. package/dist/lib/drive-sync.js.map +0 -1
  412. package/dist/lib/exec.d.ts.map +0 -1
  413. package/dist/lib/exec.js.map +0 -1
  414. package/dist/lib/factory.d.ts +0 -57
  415. package/dist/lib/factory.d.ts.map +0 -1
  416. package/dist/lib/factory.js +0 -110
  417. package/dist/lib/factory.js.map +0 -1
  418. package/dist/lib/git.d.ts.map +0 -1
  419. package/dist/lib/git.js.map +0 -1
  420. package/dist/lib/help.d.ts.map +0 -1
  421. package/dist/lib/help.js.map +0 -1
  422. package/dist/lib/hooks.d.ts.map +0 -1
  423. package/dist/lib/hooks.js.map +0 -1
  424. package/dist/lib/manifest.d.ts.map +0 -1
  425. package/dist/lib/manifest.js.map +0 -1
  426. package/dist/lib/markdown.d.ts.map +0 -1
  427. package/dist/lib/markdown.js.map +0 -1
  428. package/dist/lib/mcp.d.ts.map +0 -1
  429. package/dist/lib/mcp.js.map +0 -1
  430. package/dist/lib/memory-compile.d.ts.map +0 -1
  431. package/dist/lib/memory-compile.js.map +0 -1
  432. package/dist/lib/memory.d.ts.map +0 -1
  433. package/dist/lib/memory.js.map +0 -1
  434. package/dist/lib/models.d.ts.map +0 -1
  435. package/dist/lib/models.js.map +0 -1
  436. package/dist/lib/permissions.d.ts.map +0 -1
  437. package/dist/lib/permissions.js.map +0 -1
  438. package/dist/lib/picker.d.ts.map +0 -1
  439. package/dist/lib/picker.js.map +0 -1
  440. package/dist/lib/plugins.d.ts.map +0 -1
  441. package/dist/lib/plugins.js.map +0 -1
  442. package/dist/lib/profiles-keychain.d.ts +0 -3
  443. package/dist/lib/profiles-keychain.d.ts.map +0 -1
  444. package/dist/lib/profiles-keychain.js +0 -10
  445. package/dist/lib/profiles-keychain.js.map +0 -1
  446. package/dist/lib/profiles-presets.d.ts.map +0 -1
  447. package/dist/lib/profiles-presets.js.map +0 -1
  448. package/dist/lib/profiles.d.ts.map +0 -1
  449. package/dist/lib/profiles.js.map +0 -1
  450. package/dist/lib/pty-client.d.ts.map +0 -1
  451. package/dist/lib/pty-client.js.map +0 -1
  452. package/dist/lib/pty-server.d.ts.map +0 -1
  453. package/dist/lib/pty-server.js.map +0 -1
  454. package/dist/lib/registry.d.ts.map +0 -1
  455. package/dist/lib/registry.js.map +0 -1
  456. package/dist/lib/resources.d.ts.map +0 -1
  457. package/dist/lib/resources.js.map +0 -1
  458. package/dist/lib/rotate.d.ts.map +0 -1
  459. package/dist/lib/rotate.js.map +0 -1
  460. package/dist/lib/routines.d.ts.map +0 -1
  461. package/dist/lib/routines.js.map +0 -1
  462. package/dist/lib/runner.d.ts.map +0 -1
  463. package/dist/lib/runner.js.map +0 -1
  464. package/dist/lib/sandbox.d.ts.map +0 -1
  465. package/dist/lib/sandbox.js.map +0 -1
  466. package/dist/lib/scheduler.d.ts.map +0 -1
  467. package/dist/lib/scheduler.js.map +0 -1
  468. package/dist/lib/secrets-bundles.d.ts.map +0 -1
  469. package/dist/lib/secrets-bundles.js.map +0 -1
  470. package/dist/lib/secrets.d.ts +0 -27
  471. package/dist/lib/secrets.d.ts.map +0 -1
  472. package/dist/lib/secrets.js +0 -127
  473. package/dist/lib/secrets.js.map +0 -1
  474. package/dist/lib/session/__tests__/db.test.d.ts +0 -2
  475. package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
  476. package/dist/lib/session/__tests__/db.test.js +0 -54
  477. package/dist/lib/session/__tests__/db.test.js.map +0 -1
  478. package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
  479. package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
  480. package/dist/lib/session/__tests__/discover.test.js +0 -63
  481. package/dist/lib/session/__tests__/discover.test.js.map +0 -1
  482. package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
  483. package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
  484. package/dist/lib/session/__tests__/prompt.test.js +0 -44
  485. package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
  486. package/dist/lib/session/__tests__/render.test.d.ts +0 -2
  487. package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
  488. package/dist/lib/session/__tests__/render.test.js +0 -602
  489. package/dist/lib/session/__tests__/render.test.js.map +0 -1
  490. package/dist/lib/session/artifacts.d.ts.map +0 -1
  491. package/dist/lib/session/artifacts.js.map +0 -1
  492. package/dist/lib/session/db.d.ts.map +0 -1
  493. package/dist/lib/session/db.js.map +0 -1
  494. package/dist/lib/session/discover.d.ts.map +0 -1
  495. package/dist/lib/session/discover.js.map +0 -1
  496. package/dist/lib/session/parse.d.ts.map +0 -1
  497. package/dist/lib/session/parse.js.map +0 -1
  498. package/dist/lib/session/prompt.d.ts.map +0 -1
  499. package/dist/lib/session/prompt.js.map +0 -1
  500. package/dist/lib/session/prompt.test.d.ts +0 -2
  501. package/dist/lib/session/prompt.test.d.ts.map +0 -1
  502. package/dist/lib/session/prompt.test.js +0 -57
  503. package/dist/lib/session/prompt.test.js.map +0 -1
  504. package/dist/lib/session/render.d.ts.map +0 -1
  505. package/dist/lib/session/render.js.map +0 -1
  506. package/dist/lib/session/team-filter.d.ts.map +0 -1
  507. package/dist/lib/session/team-filter.js.map +0 -1
  508. package/dist/lib/session/team-filter.test.d.ts +0 -2
  509. package/dist/lib/session/team-filter.test.d.ts.map +0 -1
  510. package/dist/lib/session/team-filter.test.js +0 -157
  511. package/dist/lib/session/team-filter.test.js.map +0 -1
  512. package/dist/lib/session/types.d.ts.map +0 -1
  513. package/dist/lib/session/types.js.map +0 -1
  514. package/dist/lib/shims.d.ts.map +0 -1
  515. package/dist/lib/shims.js.map +0 -1
  516. package/dist/lib/skills.d.ts.map +0 -1
  517. package/dist/lib/skills.js.map +0 -1
  518. package/dist/lib/state.d.ts.map +0 -1
  519. package/dist/lib/state.js.map +0 -1
  520. package/dist/lib/subagents.d.ts.map +0 -1
  521. package/dist/lib/subagents.js.map +0 -1
  522. package/dist/lib/teams/agents.d.ts.map +0 -1
  523. package/dist/lib/teams/agents.js.map +0 -1
  524. package/dist/lib/teams/api.d.ts.map +0 -1
  525. package/dist/lib/teams/api.js.map +0 -1
  526. package/dist/lib/teams/cloud.d.ts +0 -11
  527. package/dist/lib/teams/cloud.d.ts.map +0 -1
  528. package/dist/lib/teams/cloud.js +0 -169
  529. package/dist/lib/teams/cloud.js.map +0 -1
  530. package/dist/lib/teams/debug.d.ts.map +0 -1
  531. package/dist/lib/teams/debug.js.map +0 -1
  532. package/dist/lib/teams/file_ops.d.ts.map +0 -1
  533. package/dist/lib/teams/file_ops.js.map +0 -1
  534. package/dist/lib/teams/parsers.d.ts.map +0 -1
  535. package/dist/lib/teams/parsers.js.map +0 -1
  536. package/dist/lib/teams/persistence.d.ts.map +0 -1
  537. package/dist/lib/teams/persistence.js.map +0 -1
  538. package/dist/lib/teams/ralph.d.ts +0 -8
  539. package/dist/lib/teams/ralph.d.ts.map +0 -1
  540. package/dist/lib/teams/ralph.js +0 -59
  541. package/dist/lib/teams/ralph.js.map +0 -1
  542. package/dist/lib/teams/registry.d.ts.map +0 -1
  543. package/dist/lib/teams/registry.js.map +0 -1
  544. package/dist/lib/teams/summarizer.d.ts.map +0 -1
  545. package/dist/lib/teams/summarizer.js.map +0 -1
  546. package/dist/lib/template.d.ts.map +0 -1
  547. package/dist/lib/template.js.map +0 -1
  548. package/dist/lib/types.d.ts.map +0 -1
  549. package/dist/lib/types.js.map +0 -1
  550. package/dist/lib/usage.d.ts.map +0 -1
  551. package/dist/lib/usage.js.map +0 -1
  552. package/dist/lib/versions.d.ts.map +0 -1
  553. package/dist/lib/versions.js.map +0 -1
  554. package/scripts/rebuild-sqlite.sh +0 -46
@@ -1,9 +1,18 @@
1
+ /**
2
+ * Session artifact discovery and resolution.
3
+ *
4
+ * Scans parsed session events for file-write tool calls (Write, Edit, etc.)
5
+ * and returns metadata about each artifact: path, authoring tool, existence
6
+ * on disk, and file size. Used by the artifacts subcommand and session detail views.
7
+ */
1
8
  import * as fs from 'fs';
2
9
  import * as path from 'path';
3
10
  import { parseSession } from './parse.js';
11
+ /** Tool names that produce file artifacts (writes, edits, patches). */
4
12
  const WRITE_TOOLS = new Set([
5
13
  'Write', 'Edit', 'write_file', 'edit_file', 'create_file', 'replace', 'patch',
6
14
  ]);
15
+ /** Parse a session and return metadata for every file written or edited during it. */
7
16
  export function discoverArtifacts(meta) {
8
17
  let events;
9
18
  try {
@@ -34,12 +43,14 @@ export function discoverArtifacts(meta) {
34
43
  let exists = false;
35
44
  let sizeBytes;
36
45
  try {
37
- const stat = fs.statSync(p);
38
- exists = true;
39
- sizeBytes = stat.size;
46
+ const stat = fs.lstatSync(p);
47
+ if (stat.isFile()) {
48
+ exists = true;
49
+ sizeBytes = stat.size;
50
+ }
40
51
  }
41
52
  catch {
42
- // file gone or inaccessible
53
+ // file gone, inaccessible, or symlink/special file
43
54
  }
44
55
  artifacts.push({
45
56
  path: p,
@@ -52,9 +63,19 @@ export function discoverArtifacts(meta) {
52
63
  }
53
64
  return artifacts;
54
65
  }
66
+ /** Refuse to load artifact files larger than this. Returns '' silently above the cap. */
67
+ export const ARTIFACT_MAX_BYTES = 50_000_000;
68
+ /** Read the current contents of an artifact file from disk. Rejects symlinks. */
55
69
  export function readArtifact(artifact) {
70
+ const stat = fs.lstatSync(artifact.path);
71
+ if (!stat.isFile()) {
72
+ throw new Error(`Refusing to read non-regular file: ${artifact.path}`);
73
+ }
74
+ if (stat.size > ARTIFACT_MAX_BYTES)
75
+ return '';
56
76
  return fs.readFileSync(artifact.path, 'utf-8');
57
77
  }
78
+ /** Resolve a user-provided name to an artifact by exact path, basename, or path suffix. */
58
79
  export function resolveArtifact(artifacts, name) {
59
80
  // Exact path match
60
81
  const exact = artifacts.find(a => a.path === name);
@@ -72,4 +93,3 @@ export function resolveArtifact(artifacts, name) {
72
93
  return bySuffix[0];
73
94
  return null;
74
95
  }
75
- //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Rush Cloud session source.
3
+ *
4
+ * Fetches cloud-captured sessions from halo/proxy (api.prix.dev) and caches
5
+ * them locally so the existing filesystem-based parse pipeline works unchanged.
6
+ *
7
+ * Endpoints consumed (implemented in halo/proxy/src/cloud-runs.ts):
8
+ * GET /api/v1/cloud-runs → list executions
9
+ * GET /api/v1/cloud-runs/:id → get one (used for meta)
10
+ * GET /api/v1/cloud-runs/:id/session.jsonl → raw captured jsonl
11
+ */
12
+ import type { SessionMeta } from './types.js';
13
+ /**
14
+ * List cloud executions the user has captured sessions for. Includes
15
+ * completed + needs_review + failed; an empty session_path means capture
16
+ * never ran, so those are silently dropped.
17
+ */
18
+ export declare function discoverCloudSessions(options?: {
19
+ limit?: number;
20
+ }): Promise<SessionMeta[]>;
21
+ /**
22
+ * Fetch the jsonl for one cloud execution and stash it in the local cache.
23
+ * Returns the local file path. Re-fetches on every call (cheap — executions
24
+ * are immutable once complete). Callers may pass an already-known filePath.
25
+ */
26
+ export declare function ensureCloudSessionCached(executionId: string, destPath?: string): Promise<string>;
27
+ /** True if filePath points into the cloud session cache dir. */
28
+ export declare function isCloudSessionPath(filePath: string): boolean;
29
+ /** Extract execution_id from a cloud cache path. */
30
+ export declare function executionIdFromCloudPath(filePath: string): string | null;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Rush Cloud session source.
3
+ *
4
+ * Fetches cloud-captured sessions from halo/proxy (api.prix.dev) and caches
5
+ * them locally so the existing filesystem-based parse pipeline works unchanged.
6
+ *
7
+ * Endpoints consumed (implemented in halo/proxy/src/cloud-runs.ts):
8
+ * GET /api/v1/cloud-runs → list executions
9
+ * GET /api/v1/cloud-runs/:id → get one (used for meta)
10
+ * GET /api/v1/cloud-runs/:id/session.jsonl → raw captured jsonl
11
+ */
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ import * as os from 'os';
15
+ import * as yaml from 'yaml';
16
+ import { getAgentsDir } from '../state.js';
17
+ const PROXY_BASE = process.env.RUSH_PROXY_BASE ?? 'https://api.prix.dev';
18
+ const USER_YAML = path.join(os.homedir(), '.rush', 'user.yaml');
19
+ const CLOUD_CACHE_DIR = path.join(getAgentsDir(), 'cache', 'cloud-runs');
20
+ function readToken() {
21
+ if (!fs.existsSync(USER_YAML)) {
22
+ throw new Error('Not logged in to Rush. Run `rush login` first.');
23
+ }
24
+ const raw = fs.readFileSync(USER_YAML, 'utf-8');
25
+ const data = yaml.parse(raw);
26
+ const token = data?.session?.access_token;
27
+ if (!token) {
28
+ throw new Error('No session token in ~/.rush/user.yaml. Run `rush login` first.');
29
+ }
30
+ return token;
31
+ }
32
+ async function api(method, endpoint, token) {
33
+ return fetch(`${PROXY_BASE}${endpoint}`, {
34
+ method,
35
+ headers: { Authorization: `Bearer ${token}` },
36
+ });
37
+ }
38
+ /** Coerce the `agent` field on a cloud-run row to a SessionAgentId. */
39
+ function agentToFormat(agent) {
40
+ if (agent === 'claude')
41
+ return 'claude';
42
+ if (agent === 'codex')
43
+ return 'codex';
44
+ if (agent === 'rush')
45
+ return 'rush';
46
+ return null;
47
+ }
48
+ /**
49
+ * List cloud executions the user has captured sessions for. Includes
50
+ * completed + needs_review + failed; an empty session_path means capture
51
+ * never ran, so those are silently dropped.
52
+ */
53
+ export async function discoverCloudSessions(options) {
54
+ const token = readToken();
55
+ const limit = options?.limit ?? 50;
56
+ const res = await api('GET', `/api/v1/cloud-runs?limit=${limit}`, token);
57
+ if (!res.ok) {
58
+ throw new Error(`cloud-runs list failed (${res.status})`);
59
+ }
60
+ const data = (await res.json());
61
+ const rows = data.executions ?? [];
62
+ const out = [];
63
+ for (const row of rows) {
64
+ const agent = agentToFormat(row.agent);
65
+ if (!agent)
66
+ continue;
67
+ const id = row.execution_id;
68
+ const timestamp = row.updated_at || row.created_at || new Date().toISOString();
69
+ const project = row.repo_owner && row.repo_name ? `${row.repo_owner}/${row.repo_name}` : undefined;
70
+ // filePath doubles as the sink path for the cached jsonl. parseSession
71
+ // dispatches on detectAgent which recognizes the `session.<format>.jsonl`
72
+ // suffix — so the local cache file name must preserve it.
73
+ const filePath = path.join(CLOUD_CACHE_DIR, id, `session.${agent}.jsonl`);
74
+ out.push({
75
+ id,
76
+ shortId: id.slice(0, 8),
77
+ agent,
78
+ timestamp,
79
+ project,
80
+ filePath,
81
+ topic: row.prompt?.split('\n')[0]?.slice(0, 120),
82
+ label: `[cloud/${row.status}]${row.branch ? ` ${row.branch}` : ''}`,
83
+ });
84
+ }
85
+ out.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
86
+ return out;
87
+ }
88
+ /**
89
+ * Fetch the jsonl for one cloud execution and stash it in the local cache.
90
+ * Returns the local file path. Re-fetches on every call (cheap — executions
91
+ * are immutable once complete). Callers may pass an already-known filePath.
92
+ */
93
+ export async function ensureCloudSessionCached(executionId, destPath) {
94
+ const token = readToken();
95
+ const res = await api('GET', `/api/v1/cloud-runs/${encodeURIComponent(executionId)}/session.jsonl`, token);
96
+ if (!res.ok) {
97
+ const body = await res.text().catch(() => '');
98
+ throw new Error(`session.jsonl fetch ${res.status}: ${body.slice(0, 200)}`);
99
+ }
100
+ const format = (res.headers.get('X-Session-Format') || '').toLowerCase();
101
+ if (!['claude', 'codex', 'rush'].includes(format)) {
102
+ throw new Error(`Unknown X-Session-Format on cloud response: "${format}"`);
103
+ }
104
+ const finalPath = destPath ?? path.join(CLOUD_CACHE_DIR, executionId, `session.${format}.jsonl`);
105
+ fs.mkdirSync(path.dirname(finalPath), { recursive: true });
106
+ const body = Buffer.from(await res.arrayBuffer());
107
+ fs.writeFileSync(finalPath, body);
108
+ return finalPath;
109
+ }
110
+ /** True if filePath points into the cloud session cache dir. */
111
+ export function isCloudSessionPath(filePath) {
112
+ return filePath.startsWith(CLOUD_CACHE_DIR);
113
+ }
114
+ /** Extract execution_id from a cloud cache path. */
115
+ export function executionIdFromCloudPath(filePath) {
116
+ if (!isCloudSessionPath(filePath))
117
+ return null;
118
+ const rel = path.relative(CLOUD_CACHE_DIR, filePath);
119
+ const parts = rel.split(path.sep);
120
+ return parts[0] || null;
121
+ }
@@ -1,5 +1,14 @@
1
- import Database from 'better-sqlite3';
1
+ /**
2
+ * SQLite-backed session index and full-text search.
3
+ *
4
+ * Stores session metadata and user-prompt text in a WAL-mode SQLite database
5
+ * at ~/.agents/sessions/sessions.db. Provides incremental upsert, scan-stamp
6
+ * ledger (mtime/size tracking to skip unchanged files), FTS5 search with
7
+ * BM25 ranking, and label-first search for /rename'd sessions.
8
+ */
9
+ import Database from '../sqlite.js';
2
10
  import type { SessionAgentId, SessionMeta } from './types.js';
11
+ /** Raw row shape returned from the sessions table. */
3
12
  export interface SessionRow {
4
13
  id: string;
5
14
  short_id: string;
@@ -20,10 +29,12 @@ export interface SessionRow {
20
29
  scanned_at: number | null;
21
30
  is_team_origin: number;
22
31
  }
32
+ /** File stat snapshot used to detect changes between scan runs. */
23
33
  export interface ScanStamp {
24
34
  fileMtimeMs: number;
25
35
  fileSize: number;
26
36
  }
37
+ /** Filter and pagination options for querying the sessions table. */
27
38
  export interface QueryOptions {
28
39
  agent?: SessionAgentId;
29
40
  agents?: SessionAgentId[];
@@ -40,8 +51,11 @@ export interface QueryOptions {
40
51
  /** Keep only team-origin rows (for hidden-count queries). */
41
52
  onlyTeamOrigin?: boolean;
42
53
  }
54
+ /** Open (or return the cached) sessions database, applying migrations as needed. */
43
55
  export declare function getDB(): Database.Database;
56
+ /** Close the cached database connection. */
44
57
  export declare function closeDB(): void;
58
+ /** Return the absolute path to the sessions database file. */
45
59
  export declare function getDBPath(): string;
46
60
  /**
47
61
  * Look up the file stat stamp we stored the last time we scanned a given file path.
@@ -66,6 +80,7 @@ export declare function recordScans(entries: Array<{
66
80
  * `content` is the tokenizable user-prompt text; pass '' to leave the row unsearchable.
67
81
  */
68
82
  export declare function upsertSession(meta: SessionMeta, content: string, scan?: ScanStamp): void;
83
+ /** Batch-upsert sessions with their FTS5 content and scan stamps in a single transaction. */
69
84
  export declare function upsertSessionsBatch(entries: Array<{
70
85
  meta: SessionMeta;
71
86
  content: string;
@@ -77,11 +92,17 @@ export declare function upsertSessionsBatch(entries: Array<{
77
92
  * Leaves FTS5 content/topic/project untouched — cheap to call every run.
78
93
  */
79
94
  export declare function syncLabels(labelMap: Map<string, string | null>): number;
95
+ /** Query sessions from the database, applying filters and ordering by timestamp descending. */
80
96
  export declare function querySessions(options?: QueryOptions): SessionMeta[];
97
+ /** Count sessions matching the given filter options. */
81
98
  export declare function countSessions(options?: QueryOptions): number;
99
+ /** Return the set of all file paths currently tracked in the sessions table. */
82
100
  export declare function getAllFilePaths(): Set<string>;
101
+ /** Look up sessions by their source file paths. */
83
102
  export declare function getSessionsByFilePaths(paths: string[]): Map<string, SessionMeta>;
103
+ /** Look up a single session by its unique ID. */
84
104
  export declare function getSessionById(id: string): SessionMeta | null;
105
+ /** A single full-text search result with ranking score. */
85
106
  export interface FtsHit {
86
107
  sessionId: string;
87
108
  score: number;
@@ -111,8 +132,8 @@ export declare function buildFtsQuery(input: string): {
111
132
  * so "higher = better" is consistent across all tiers.
112
133
  */
113
134
  export declare function ftsSearch(input: string, limit?: number): FtsHit[];
135
+ /** Return the total row counts for the sessions and FTS5 tables (diagnostic). */
114
136
  export declare function getRowCount(): {
115
137
  sessions: number;
116
138
  textRows: number;
117
139
  };
118
- //# sourceMappingURL=db.d.ts.map
@@ -1,14 +1,43 @@
1
+ /**
2
+ * SQLite-backed session index and full-text search.
3
+ *
4
+ * Stores session metadata and user-prompt text in a WAL-mode SQLite database
5
+ * at ~/.agents/sessions/sessions.db. Provides incremental upsert, scan-stamp
6
+ * ledger (mtime/size tracking to skip unchanged files), FTS5 search with
7
+ * BM25 ranking, and label-first search for /rename'd sessions.
8
+ */
1
9
  import * as fs from 'fs';
2
- import * as os from 'os';
3
10
  import * as path from 'path';
4
- import Database from 'better-sqlite3';
5
- const HOME = os.homedir();
6
- const SESSIONS_DIR = path.join(HOME, '.agents', 'sessions');
11
+ import Database from '../sqlite.js';
12
+ import { getAgentsDir } from '../state.js';
13
+ const SESSIONS_DIR = path.join(getAgentsDir(), 'sessions');
7
14
  const DB_PATH = path.join(SESSIONS_DIR, 'sessions.db');
8
- const SCHEMA_VERSION = 4;
15
+ /** Current schema version; bumped when migrations are added. */
16
+ const SCHEMA_VERSION = 5;
17
+ /**
18
+ * Canonicalize a file path for use as a scan_ledger key. The same physical
19
+ * session file is reachable via multiple aliases — `~/.claude/projects/x.jsonl`
20
+ * (when `~/.claude` is a symlink to a versioned home) and
21
+ * `~/.agents-system/versions/claude/<v>/home/.claude/projects/x.jsonl`. Keying the
22
+ * ledger by the raw path means switching between these aliases (e.g. via
23
+ * `agents use`) misses the cache and forces a full re-parse. Realpath collapses
24
+ * all aliases to one stable key.
25
+ */
26
+ function canonicalLedgerKey(filePath) {
27
+ if (!filePath)
28
+ return filePath;
29
+ try {
30
+ return fs.realpathSync(filePath);
31
+ }
32
+ catch {
33
+ return filePath;
34
+ }
35
+ }
9
36
  // BM25 column weights for session_text: label > topic > project > content.
10
37
  // Higher weights make matches in that column rank higher.
38
+ /** BM25 column weights for FTS5: label > topic > project > content. */
11
39
  const BM25_WEIGHTS = [5.0, 2.0, 1.5, 1.0];
40
+ /** DDL for the sessions database (tables, indexes, FTS5 virtual table). */
12
41
  const SCHEMA = `
13
42
  CREATE TABLE IF NOT EXISTS sessions (
14
43
  id TEXT PRIMARY KEY,
@@ -105,7 +134,15 @@ function migrateSchema(db, fromVersion) {
105
134
  }
106
135
  db.exec(`DELETE FROM scan_ledger;`);
107
136
  }
137
+ if (fromVersion < 5) {
138
+ // v4 → v5: ledger is now keyed by realpath instead of the as-discovered
139
+ // path, so symlink/version-relative aliases for the same physical file
140
+ // collapse to one row. Old aliased rows are dropped — next scan will
141
+ // repopulate under canonical keys.
142
+ db.exec(`DELETE FROM scan_ledger;`);
143
+ }
108
144
  }
145
+ /** Open (or return the cached) sessions database, applying migrations as needed. */
109
146
  export function getDB() {
110
147
  if (dbInstance)
111
148
  return dbInstance;
@@ -144,12 +181,14 @@ export function getDB() {
144
181
  dbInstance = db;
145
182
  return db;
146
183
  }
184
+ /** Close the cached database connection. */
147
185
  export function closeDB() {
148
186
  if (dbInstance) {
149
187
  dbInstance.close();
150
188
  dbInstance = null;
151
189
  }
152
190
  }
191
+ /** Return the absolute path to the sessions database file. */
153
192
  export function getDBPath() {
154
193
  return DB_PATH;
155
194
  }
@@ -161,7 +200,7 @@ export function getScanStampByPath(filePath) {
161
200
  const db = getDB();
162
201
  const row = db
163
202
  .prepare(`SELECT file_mtime_ms, file_size FROM scan_ledger WHERE file_path = ? LIMIT 1`)
164
- .get(filePath);
203
+ .get(canonicalLedgerKey(filePath));
165
204
  return row ? { fileMtimeMs: row.file_mtime_ms, fileSize: row.file_size } : null;
166
205
  }
167
206
  /**
@@ -173,10 +212,24 @@ export function getScanStampsForPaths(filePaths) {
173
212
  if (filePaths.length === 0)
174
213
  return result;
175
214
  const db = getDB();
215
+ // Multiple input paths can resolve to the same canonical key (e.g. the same
216
+ // session JSONL reachable via `~/.claude/...` and `~/.agents-system/versions/...`).
217
+ // We query DB by canonical key, then fan results back out to every original
218
+ // alias so callers can `.get(filePath)` with the path they passed in.
219
+ const canonicalToOriginals = new Map();
220
+ for (const fp of filePaths) {
221
+ const canonical = canonicalLedgerKey(fp);
222
+ const aliases = canonicalToOriginals.get(canonical);
223
+ if (aliases)
224
+ aliases.push(fp);
225
+ else
226
+ canonicalToOriginals.set(canonical, [fp]);
227
+ }
228
+ const canonicalKeys = [...canonicalToOriginals.keys()];
176
229
  // SQLite parameter limit is typically 999 / 32766 — chunk defensively.
177
230
  const CHUNK = 500;
178
- for (let i = 0; i < filePaths.length; i += CHUNK) {
179
- const chunk = filePaths.slice(i, i + CHUNK);
231
+ for (let i = 0; i < canonicalKeys.length; i += CHUNK) {
232
+ const chunk = canonicalKeys.slice(i, i + CHUNK);
180
233
  const placeholders = chunk.map(() => '?').join(',');
181
234
  const rows = db
182
235
  .prepare(`
@@ -186,7 +239,10 @@ export function getScanStampsForPaths(filePaths) {
186
239
  `)
187
240
  .all(...chunk);
188
241
  for (const row of rows) {
189
- result.set(row.file_path, { fileMtimeMs: row.file_mtime_ms, fileSize: row.file_size });
242
+ const stamp = { fileMtimeMs: row.file_mtime_ms, fileSize: row.file_size };
243
+ for (const original of canonicalToOriginals.get(row.file_path) || []) {
244
+ result.set(original, stamp);
245
+ }
190
246
  }
191
247
  }
192
248
  return result;
@@ -210,7 +266,7 @@ export function recordScans(entries) {
210
266
  const now = Date.now();
211
267
  const txn = db.transaction((items) => {
212
268
  for (const { filePath, scan } of items) {
213
- stmt.run(filePath, scan.fileMtimeMs, scan.fileSize, now);
269
+ stmt.run(canonicalLedgerKey(filePath), scan.fileMtimeMs, scan.fileSize, now);
214
270
  }
215
271
  });
216
272
  txn(entries);
@@ -291,6 +347,7 @@ export function upsertSession(meta, content, scan) {
291
347
  });
292
348
  txn();
293
349
  }
350
+ /** Batch-upsert sessions with their FTS5 content and scan stamps in a single transaction. */
294
351
  export function upsertSessionsBatch(entries) {
295
352
  if (entries.length === 0)
296
353
  return;
@@ -330,7 +387,7 @@ export function upsertSessionsBatch(entries) {
330
387
  delText.run(meta.id);
331
388
  insText.run(meta.id, meta.label ?? '', meta.topic ?? '', meta.project ?? '', content ?? '');
332
389
  if (scan && meta.filePath) {
333
- ledger.run(meta.filePath, scan.fileMtimeMs, scan.fileSize, now);
390
+ ledger.run(canonicalLedgerKey(meta.filePath), scan.fileMtimeMs, scan.fileSize, now);
334
391
  }
335
392
  }
336
393
  });
@@ -374,6 +431,7 @@ export function syncLabels(labelMap) {
374
431
  txn(updates);
375
432
  return updates.length;
376
433
  }
434
+ /** Convert a raw database row into a SessionMeta object. */
377
435
  function rowToMeta(row) {
378
436
  return {
379
437
  id: row.id,
@@ -393,6 +451,7 @@ function rowToMeta(row) {
393
451
  isTeamOrigin: row.is_team_origin === 1,
394
452
  };
395
453
  }
454
+ /** Build a parameterized WHERE clause from query options. */
396
455
  function buildSessionWhere(options) {
397
456
  const where = [];
398
457
  const params = [];
@@ -438,6 +497,7 @@ function buildSessionWhere(options) {
438
497
  const clause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : '';
439
498
  return { clause, params };
440
499
  }
500
+ /** Query sessions from the database, applying filters and ordering by timestamp descending. */
441
501
  export function querySessions(options = {}) {
442
502
  const db = getDB();
443
503
  const { clause, params } = buildSessionWhere(options);
@@ -446,6 +506,7 @@ export function querySessions(options = {}) {
446
506
  const rows = db.prepare(sql).all(...params);
447
507
  return rows.map(rowToMeta);
448
508
  }
509
+ /** Count sessions matching the given filter options. */
449
510
  export function countSessions(options = {}) {
450
511
  const db = getDB();
451
512
  const { clause, params } = buildSessionWhere(options);
@@ -453,11 +514,13 @@ export function countSessions(options = {}) {
453
514
  const row = db.prepare(sql).get(...params);
454
515
  return row ? row.n : 0;
455
516
  }
517
+ /** Return the set of all file paths currently tracked in the sessions table. */
456
518
  export function getAllFilePaths() {
457
519
  const db = getDB();
458
520
  const rows = db.prepare(`SELECT file_path FROM sessions`).all();
459
521
  return new Set(rows.map(r => r.file_path));
460
522
  }
523
+ /** Look up sessions by their source file paths. */
461
524
  export function getSessionsByFilePaths(paths) {
462
525
  if (paths.length === 0)
463
526
  return new Map();
@@ -471,6 +534,7 @@ export function getSessionsByFilePaths(paths) {
471
534
  result.set(row.file_path, rowToMeta(row));
472
535
  return result;
473
536
  }
537
+ /** Look up a single session by its unique ID. */
474
538
  export function getSessionById(id) {
475
539
  const db = getDB();
476
540
  const row = db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id);
@@ -567,10 +631,10 @@ export function ftsSearch(input, limit = 200) {
567
631
  hits.sort((a, b) => b.score - a.score);
568
632
  return hits.slice(0, limit);
569
633
  }
634
+ /** Return the total row counts for the sessions and FTS5 tables (diagnostic). */
570
635
  export function getRowCount() {
571
636
  const db = getDB();
572
637
  const sessions = db.prepare(`SELECT COUNT(*) AS c FROM sessions`).get().c;
573
638
  const textRows = db.prepare(`SELECT COUNT(*) AS c FROM session_text`).get().c;
574
639
  return { sessions, textRows };
575
640
  }
576
- //# sourceMappingURL=db.js.map
@@ -1,4 +1,13 @@
1
+ /**
2
+ * Session discovery across Claude, Codex, Gemini, OpenCode, and OpenClaw.
3
+ *
4
+ * Performs incremental scans: each agent's session files are stat'd and compared
5
+ * to a scan-stamp ledger in SQLite. Only files whose mtime or size changed since
6
+ * the last run are re-parsed. All metadata is upserted into the sessions DB so
7
+ * subsequent queries are served entirely from the cache.
8
+ */
1
9
  import type { SessionAgentId, SessionMeta } from './types.js';
10
+ /** Options controlling which sessions to discover and how to report progress. */
2
11
  export interface DiscoverOptions {
3
12
  agent?: SessionAgentId;
4
13
  version?: string;
@@ -19,6 +28,7 @@ export interface DiscoverOptions {
19
28
  /** Called as each agent makes parsing progress. Totals count only files that need re-parsing (cache misses). */
20
29
  onProgress?: (progress: ScanProgress) => void;
21
30
  }
31
+ /** Progress report emitted during incremental scanning. */
22
32
  export interface ScanProgress {
23
33
  agent: SessionAgentId;
24
34
  parsed: number;
@@ -51,10 +61,15 @@ export declare function searchContentIndex(sessions: SessionMeta[], query: strin
51
61
  * realpath to avoid double-counting symlinked version homes.
52
62
  */
53
63
  export declare function getAgentSessionDirs(agent: string, subdir: string): string[];
54
- export declare function readFirstLines(filePath: string, maxLines: number): Promise<string[]>;
55
64
  /**
56
- * Walk a directory recursively for files with a given extension.
65
+ * Build a map of Claude sessionId -> user-given label from ~/.claude/sessions/*.json.
66
+ * Each JSON has shape { pid, sessionId, cwd, startedAt, name?, ... }. The
67
+ * `name` field only exists if the user ran /rename in that session.
68
+ * For sessionId collisions (re-resume of the same session), prefer the most
69
+ * recent startedAt.
57
70
  */
58
- export declare function walkForFiles(dir: string, ext: string, limit: number): string[];
71
+ export declare function buildClaudeLabelMap(): Map<string, string | null>;
72
+ /** Read up to maxLines non-empty lines from the beginning of a file. */
73
+ export declare function readFirstLines(filePath: string, maxLines: number): Promise<string[]>;
74
+ /** Parse a time filter string (relative like '7d' or ISO timestamp) into epoch milliseconds. */
59
75
  export declare function parseTimeFilter(input: string): number;
60
- //# sourceMappingURL=discover.d.ts.map