@shepai/cli 1.142.0-pr453.13e9c32 → 1.142.0-pr453.4cfded1

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 (169) hide show
  1. package/dist/src/presentation/web/app/api/sessions/route.d.ts.map +1 -1
  2. package/dist/src/presentation/web/app/api/sessions/route.js +13 -45
  3. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts +1 -3
  4. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +5 -13
  6. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  7. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  8. package/dist/tsconfig.build.tsbuildinfo +1 -1
  9. package/package.json +1 -1
  10. package/web/.next/BUILD_ID +1 -1
  11. package/web/.next/build-manifest.json +2 -2
  12. package/web/.next/fallback-build-manifest.json +2 -2
  13. package/web/.next/prerender-manifest.json +3 -3
  14. package/web/.next/required-server-files.js +1 -1
  15. package/web/.next/required-server-files.json +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  17. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  18. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  21. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  29. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  30. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  37. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  38. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  41. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  42. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  45. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  46. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  49. package/web/.next/server/app/(dashboard)/page.js +1 -1
  50. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  53. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  54. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/_global-error.html +2 -2
  57. package/web/.next/server/app/_global-error.rsc +1 -1
  58. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  59. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  61. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  62. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  63. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  64. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/api/sessions/route.js +2 -3
  66. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  67. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  68. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  69. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  71. package/web/.next/server/app/skills/page.js +1 -1
  72. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  73. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  75. package/web/.next/server/app/tools/page.js +1 -1
  76. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  77. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  79. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  81. package/web/.next/server/chunks/[root-of-the-server]__a62bd945._.js +3 -0
  82. package/web/.next/server/chunks/[root-of-the-server]__a62bd945._.js.map +1 -0
  83. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  84. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0b150ddf._.js → [root-of-the-server]__6ec59045._.js} +2 -2
  92. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0b150ddf._.js.map → [root-of-the-server]__6ec59045._.js.map} +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2138fa7e._.js → [root-of-the-server]__a5f9c6e5._.js} +3 -3
  96. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2138fa7e._.js.map → [root-of-the-server]__a5f9c6e5._.js.map} +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  108. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/{_32981544._.js → _1ac172f4._.js} +2 -2
  110. package/web/.next/server/chunks/ssr/{_32981544._.js.map → _1ac172f4._.js.map} +1 -1
  111. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  112. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  114. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  116. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  118. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  120. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  122. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  124. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  126. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/{_63e2b867._.js → _be6f83dc._.js} +2 -2
  128. package/web/.next/server/chunks/ssr/{_63e2b867._.js.map → _be6f83dc._.js.map} +1 -1
  129. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  132. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  134. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  140. package/web/.next/server/chunks/ssr/{src_presentation_web_688c51e1._.js → src_presentation_web_b3f3c105._.js} +2 -2
  141. package/web/.next/server/chunks/ssr/{src_presentation_web_688c51e1._.js.map → src_presentation_web_b3f3c105._.js.map} +1 -1
  142. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  143. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  145. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
  147. package/web/.next/server/pages/500.html +2 -2
  148. package/web/.next/server/server-reference-manifest.js +1 -1
  149. package/web/.next/server/server-reference-manifest.json +44 -44
  150. package/web/.next/static/chunks/{ea9c9f37826b159d.js → 280686d2e1ff0649.js} +1 -1
  151. package/web/.next/static/chunks/473cac64731704c6.js +1 -0
  152. package/web/.next/static/chunks/{4575b817cd7db8c5.js → 66723d84a0b01634.js} +1 -1
  153. package/web/.next/static/chunks/{85d5f2264fa98de1.js → 6bd2935bef50e8c9.js} +1 -1
  154. package/web/.next/static/chunks/{a09e919d12064e37.js → 6e4420930c0fe21c.js} +1 -1
  155. package/web/.next/static/chunks/{724568a9e1667cb1.js → 73a92c1924e105bd.js} +2 -2
  156. package/web/.next/static/chunks/{08e65e91fd585be8.js → 770ba660d1a0d50b.js} +2 -2
  157. package/web/.next/static/chunks/{e749dc8b153ba333.js → a6e1538e04c9f936.js} +1 -1
  158. package/web/.next/static/chunks/{ff97b9889fb1642b.js → cc40bfb418fa8f56.js} +1 -1
  159. package/web/.next/static/chunks/{603856182abb645c.js → cf622541a1f71988.js} +1 -1
  160. package/web/.next/static/chunks/{5f44d9e531c22671.js → d65caa2ba3f34f84.js} +1 -1
  161. package/web/.next/static/chunks/{965e6498eaf81213.js → f2c4d78aa6703653.js} +1 -1
  162. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_ff60e4a5.js +0 -3
  163. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_ff60e4a5.js.map +0 -1
  164. package/web/.next/server/chunks/[externals]__448264a3._.js +0 -3
  165. package/web/.next/server/chunks/[externals]__448264a3._.js.map +0 -1
  166. package/web/.next/static/chunks/8d9be8bb05402535.js +0 -1
  167. /package/web/.next/static/{vfqEcI-EmzmeSUI9cEWTq → tn6fdCmeXEgmEoL57Nt7c}/_buildManifest.js +0 -0
  168. /package/web/.next/static/{vfqEcI-EmzmeSUI9cEWTq → tn6fdCmeXEgmEoL57Nt7c}/_clientMiddlewareManifest.json +0 -0
  169. /package/web/.next/static/{vfqEcI-EmzmeSUI9cEWTq → tn6fdCmeXEgmEoL57Nt7c}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/sessions/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,eAAO,MAAM,OAAO,kBAAkB,CAAC;AA2VvC;;;;;GAKG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,OAAO;;;;YA9VpC,MAAM;mBACC,MAAM;iBACR,MAAM,GAAG,IAAI;sBACR,MAAM;wBACJ,MAAM,GAAG,IAAI;uBACd,MAAM,GAAG,IAAI;mBACjB,MAAM,GAAG,IAAI;qBACX,MAAM;kBACT,MAAM;;IAoXjB"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/sessions/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAgTvC;;;;;GAKG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,OAAO;;;;YAnTpC,MAAM;mBACC,MAAM;iBACR,MAAM,GAAG,IAAI;sBACR,MAAM;wBACJ,MAAM,GAAG,IAAI;uBACd,MAAM,GAAG,IAAI;mBACjB,MAAM,GAAG,IAAI;qBACX,MAAM;kBACT,MAAM;;IAwUjB"}
@@ -1,5 +1,4 @@
1
1
  import { NextResponse } from 'next/server';
2
- import { createHash } from 'node:crypto';
3
2
  import { homedir } from 'node:os';
4
3
  import { join } from 'node:path';
5
4
  import { readdir, stat } from 'node:fs/promises';
@@ -21,58 +20,28 @@ function cursorEncodePath(p) {
21
20
  return p.replace(/^\//, '').replace(/\./g, '').replace(/[/\\]/g, '-');
22
21
  }
23
22
  // ── Claude Code session scanner ───────────────────────────────────────
24
- /**
25
- * Collect .jsonl session files from a single Claude project directory.
26
- */
27
- async function collectJsonlFiles(projectDir) {
28
- let entries;
23
+ async function scanClaudeSessions(repositoryPath, limit) {
24
+ const dirName = claudeEncodePath(repositoryPath);
25
+ const projectDir = join(homedir(), '.claude', 'projects', dirName);
26
+ let files;
29
27
  try {
30
- entries = await readdir(projectDir);
28
+ const entries = await readdir(projectDir);
29
+ files = entries.filter((e) => e.endsWith('.jsonl'));
31
30
  }
32
31
  catch {
33
32
  return [];
34
33
  }
35
- const jsonlFiles = entries.filter((e) => e.endsWith('.jsonl'));
36
- const fileInfos = await Promise.allSettled(jsonlFiles.map(async (name) => {
34
+ // Stat all files for mtime sorting
35
+ const fileInfos = await Promise.allSettled(files.map(async (name) => {
37
36
  const filePath = join(projectDir, name);
38
37
  const s = await stat(filePath);
39
38
  return { name, filePath, mtime: s.mtime.getTime() };
40
39
  }));
41
- return fileInfos
40
+ const valid = fileInfos
42
41
  .filter((r) => r.status === 'fulfilled')
43
- .map((r) => r.value);
44
- }
45
- async function scanClaudeSessions(repositoryPath, limit, includeWorktrees = false) {
46
- const dirName = claudeEncodePath(repositoryPath);
47
- const projectsRoot = join(homedir(), '.claude', 'projects');
48
- // Collect files from the exact directory
49
- const primaryDir = join(projectsRoot, dirName);
50
- let allFiles = await collectJsonlFiles(primaryDir);
51
- // When includeWorktrees is set, also scan:
52
- // 1. Directories whose name starts with the encoded repo path (git worktrees, .worktrees)
53
- // 2. Shep worktree directories (~/.shep/repos/<hash>/wt/*) which use a hash of the repo path
54
- if (includeWorktrees) {
55
- try {
56
- const allDirs = await readdir(projectsRoot);
57
- // Match git-style worktrees (same prefix as repo path)
58
- const prefixMatches = allDirs.filter((d) => d !== dirName && d.startsWith(dirName));
59
- // Match shep worktrees: compute repo hash → find dirs starting with encoded shep path
60
- const normalizedRepoPath = repositoryPath.replace(/\\/g, '/');
61
- const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
62
- const shepHome = join(homedir(), '.shep').replace(/\\/g, '/');
63
- const shepWorktreePrefix = claudeEncodePath(join(shepHome, 'repos', repoHash));
64
- const shepMatches = allDirs.filter((d) => d.startsWith(shepWorktreePrefix) && !prefixMatches.includes(d) && d !== dirName);
65
- const worktreeDirs = [...prefixMatches, ...shepMatches];
66
- const worktreeResults = await Promise.all(worktreeDirs.map((d) => collectJsonlFiles(join(projectsRoot, d))));
67
- for (const files of worktreeResults) {
68
- allFiles = allFiles.concat(files);
69
- }
70
- }
71
- catch {
72
- // projectsRoot doesn't exist — no sessions at all
73
- }
74
- }
75
- const valid = allFiles.sort((a, b) => b.mtime - a.mtime).slice(0, limit);
42
+ .map((r) => r.value)
43
+ .sort((a, b) => b.mtime - a.mtime)
44
+ .slice(0, limit);
76
45
  // Parse each file
77
46
  const results = await Promise.allSettled(valid.map(async (fi) => parseClaudeSession(fi.filePath, fi.name, fi.mtime, repositoryPath)));
78
47
  return results
@@ -269,14 +238,13 @@ export async function GET(request) {
269
238
  const url = new URL(request.url);
270
239
  const repositoryPath = url.searchParams.get('repositoryPath');
271
240
  const limit = parseInt(url.searchParams.get('limit') ?? '10', 10);
272
- const includeWorktrees = url.searchParams.get('includeWorktrees') === 'true';
273
241
  if (!repositoryPath?.trim()) {
274
242
  return NextResponse.json({ error: 'repositoryPath is required' }, { status: 400 });
275
243
  }
276
244
  try {
277
245
  // Scan all providers in parallel
278
246
  const [claudeSessions, cursorSessions] = await Promise.all([
279
- scanClaudeSessions(repositoryPath, limit, includeWorktrees),
247
+ scanClaudeSessions(repositoryPath, limit),
280
248
  scanCursorSessions(repositoryPath, limit),
281
249
  ]);
282
250
  // Merge and sort by mtime descending, apply limit
@@ -13,11 +13,9 @@ export interface SessionSummary {
13
13
  interface FeatureSessionsDropdownProps {
14
14
  repositoryPath: string;
15
15
  className?: string;
16
- /** When true, also scan worktree session directories (used by repo nodes). */
17
- includeWorktrees?: boolean;
18
16
  /** Callback to create a feature from a session. Only shown on repo nodes. */
19
17
  onCreateFromSession?: (session: SessionSummary, sessionFilePath: string) => void;
20
18
  }
21
- export declare function FeatureSessionsDropdown({ repositoryPath, className, includeWorktrees, onCreateFromSession, }: FeatureSessionsDropdownProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function FeatureSessionsDropdown({ repositoryPath, className, onCreateFromSession, }: FeatureSessionsDropdownProps): import("react/jsx-runtime").JSX.Element;
22
20
  export {};
23
21
  //# sourceMappingURL=feature-sessions-dropdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-sessions-dropdown.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-sessions-dropdown.tsx"],"names":[],"mappings":"AA8BA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,4BAA4B;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;CAClF;AAmDD,wBAAgB,uBAAuB,CAAC,EACtC,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,mBAAmB,GACpB,EAAE,4BAA4B,2CAmK9B"}
1
+ {"version":3,"file":"feature-sessions-dropdown.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-sessions-dropdown.tsx"],"names":[],"mappings":"AA8BA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,4BAA4B;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;CAClF;AAmDD,wBAAgB,uBAAuB,CAAC,EACtC,cAAc,EACd,SAAS,EACT,mBAAmB,GACpB,EAAE,4BAA4B,2CA2J9B"}
@@ -56,7 +56,7 @@ async function copyToClipboard(text) {
56
56
  function stopNodeEvent(e) {
57
57
  e.stopPropagation();
58
58
  }
59
- export function FeatureSessionsDropdown({ repositoryPath, className, includeWorktrees, onCreateFromSession, }) {
59
+ export function FeatureSessionsDropdown({ repositoryPath, className, onCreateFromSession, }) {
60
60
  const [sessions, setSessions] = useState([]);
61
61
  const [loading, setLoading] = useState(false);
62
62
  const [fetched, setFetched] = useState(false);
@@ -77,11 +77,7 @@ export function FeatureSessionsDropdown({ repositoryPath, className, includeWork
77
77
  // Populates count badge + active indicator, and pre-loads the dropdown.
78
78
  useEffect(() => {
79
79
  let cancelled = false;
80
- const params = new URLSearchParams({
81
- repositoryPath,
82
- limit: '10',
83
- ...(includeWorktrees && { includeWorktrees: 'true' }),
84
- });
80
+ const params = new URLSearchParams({ repositoryPath, limit: '10' });
85
81
  fetch(`/api/sessions?${params.toString()}`)
86
82
  .then((res) => (res.ok ? res.json() : null))
87
83
  .then((data) => {
@@ -95,18 +91,14 @@ export function FeatureSessionsDropdown({ repositoryPath, className, includeWork
95
91
  return () => {
96
92
  cancelled = true;
97
93
  };
98
- }, [repositoryPath, includeWorktrees]);
94
+ }, [repositoryPath]);
99
95
  // Re-fetch on dropdown open if not already loaded (e.g. path changed)
100
96
  const doFetch = useCallback(async () => {
101
97
  if (fetched)
102
98
  return;
103
99
  setLoading(true);
104
100
  try {
105
- const params = new URLSearchParams({
106
- repositoryPath,
107
- limit: '10',
108
- ...(includeWorktrees && { includeWorktrees: 'true' }),
109
- });
101
+ const params = new URLSearchParams({ repositoryPath, limit: '10' });
110
102
  const res = await fetch(`/api/sessions?${params.toString()}`);
111
103
  if (res.ok) {
112
104
  const data = (await res.json());
@@ -121,7 +113,7 @@ export function FeatureSessionsDropdown({ repositoryPath, className, includeWork
121
113
  setLoading(false);
122
114
  setFetched(true);
123
115
  }
124
- }, [repositoryPath, fetched, includeWorktrees]);
116
+ }, [repositoryPath, fetched]);
125
117
  const handleOpenChange = useCallback((open) => {
126
118
  if (open)
127
119
  void doFetch();
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CA0aA"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAyaA"}
@@ -71,7 +71,7 @@ export function RepositoryNode({ data, selected, }) {
71
71
  e.stopPropagation();
72
72
  data.onClick?.();
73
73
  }
74
- }, className: cn('nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80', selected && 'border-blue-400 dark:border-amber-500/60'), children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, includeWorktrees: true, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? _jsx("div", { className: "ml-1.5" }) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": "New feature", "data-testid": "repository-node-add-button", onClick: (e) => {
74
+ }, className: cn('nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80', selected && 'border-blue-400 dark:border-amber-500/60'), children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? _jsx("div", { className: "ml-1.5" }) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": "New feature", "data-testid": "repository-node-add-button", onClick: (e) => {
75
75
  e.stopPropagation();
76
76
  data.onAdd?.();
77
77
  }, className: cn('flex h-6 shrink-0 cursor-pointer items-center gap-0.5 rounded bg-blue-500 px-1.5 text-[11px] font-bold text-white transition-colors hover:bg-blue-600 dark:bg-amber-500 dark:hover:bg-amber-400', data.pulseAdd && 'animate-pulse-cta'), children: [_jsx(Plus, { className: "h-3 w-3" }), _jsx("span", { className: "translate-y-px", children: "New" })] }) }), _jsx(TooltipContent, { side: "top", children: "New feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (