@shepai/cli 1.92.1 → 1.92.2

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 (160) hide show
  1. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts +2 -0
  2. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts.map +1 -1
  3. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.js +16 -0
  4. package/dist/src/presentation/web/components/common/feature-status-badges/feature-status-badges.stories.js +6 -6
  5. package/dist/src/presentation/web/components/common/feature-status-config.d.ts +1 -1
  6. package/dist/src/presentation/web/components/common/feature-status-config.d.ts.map +1 -1
  7. package/dist/src/presentation/web/components/common/feature-status-config.js +20 -2
  8. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +1 -1
  9. package/dist/src/presentation/web/hooks/sidebar-features-context.js +4 -4
  10. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
  11. package/dist/src/presentation/web/lib/layout-with-dagre.js +78 -55
  12. package/dist/tsconfig.build.tsbuildinfo +1 -1
  13. package/package.json +1 -1
  14. package/web/.next/BUILD_ID +1 -1
  15. package/web/.next/build-manifest.json +2 -2
  16. package/web/.next/fallback-build-manifest.json +2 -2
  17. package/web/.next/prerender-manifest.json +3 -3
  18. package/web/.next/required-server-files.js +2 -2
  19. package/web/.next/required-server-files.json +2 -2
  20. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  21. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +21 -21
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  33. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +21 -21
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  42. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  45. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/_global-error.html +2 -2
  48. package/web/.next/server/app/_global-error.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  54. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  55. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  56. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  58. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  59. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  61. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  62. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  64. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  65. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  67. package/web/.next/server/app/version/page.js.nft.json +1 -1
  68. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  70. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  71. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  72. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  73. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  74. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js.map +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +3 -0
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -0
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  96. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/{_f02f4210._.js → _16a7514c._.js} +2 -2
  98. package/web/.next/server/chunks/ssr/_16a7514c._.js.map +1 -0
  99. package/web/.next/server/chunks/ssr/_364346ad._.js +3 -0
  100. package/web/.next/server/chunks/ssr/_364346ad._.js.map +1 -0
  101. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  102. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  104. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/_df15bd24._.js +3 -0
  106. package/web/.next/server/chunks/ssr/_df15bd24._.js.map +1 -0
  107. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  108. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  110. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  118. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  126. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  128. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  129. package/web/.next/server/pages/500.html +2 -2
  130. package/web/.next/server/server-reference-manifest.js +1 -1
  131. package/web/.next/server/server-reference-manifest.json +28 -28
  132. package/web/.next/static/chunks/{e1adbd3c092ccc3c.js → 0a1511515cbdf02e.js} +2 -2
  133. package/web/.next/static/chunks/{5b3dd4146a57ce02.js → 166e31f7adad1949.js} +1 -1
  134. package/web/.next/static/chunks/{d7f984a3e8043cb0.js → 1da59e0c79357cf8.js} +1 -1
  135. package/web/.next/static/chunks/2536dce61f55daad.js +1 -0
  136. package/web/.next/static/chunks/2ae98439dac3693e.js +1 -0
  137. package/web/.next/static/chunks/39560c01879ac76a.css +2 -0
  138. package/web/.next/static/chunks/449251751b4908f7.js +11 -0
  139. package/web/.next/static/chunks/{bea7a5f44d99512f.js → 4a13c8befddbfae9.js} +1 -1
  140. package/web/.next/static/chunks/{2ddedc7a1d0d0a35.js → 62652f0d1304c333.js} +1 -1
  141. package/web/.next/static/chunks/{2d02a8deb3cfb404.js → 7bf51da075913f1c.js} +1 -1
  142. package/web/.next/static/chunks/85c0a8c9420d2064.js +1 -0
  143. package/web/.next/static/chunks/97b0a13714eb4d92.js +1 -0
  144. package/web/.next/static/chunks/{8a174308ba4bd69d.js → ceb79276cb6d8b88.js} +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js +0 -3
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js.map +0 -1
  147. package/web/.next/server/chunks/ssr/_21c75883._.js +0 -3
  148. package/web/.next/server/chunks/ssr/_21c75883._.js.map +0 -1
  149. package/web/.next/server/chunks/ssr/_a5c23e45._.js +0 -3
  150. package/web/.next/server/chunks/ssr/_a5c23e45._.js.map +0 -1
  151. package/web/.next/server/chunks/ssr/_f02f4210._.js.map +0 -1
  152. package/web/.next/static/chunks/1a2af08680037549.js +0 -1
  153. package/web/.next/static/chunks/30a344bb33a015e4.js +0 -1
  154. package/web/.next/static/chunks/4f94860011f9fb20.css +0 -2
  155. package/web/.next/static/chunks/dac26a484f476f36.js +0 -1
  156. package/web/.next/static/chunks/dd04e12ee5ccb0ad.js +0 -1
  157. package/web/.next/static/chunks/f54b972c149092b5.js +0 -11
  158. /package/web/.next/static/{UOxWj8CnreBdyLxAYAGYQ → KEWoM0Hk-MbG0_3S8cSrW}/_buildManifest.js +0 -0
  159. /package/web/.next/static/{UOxWj8CnreBdyLxAYAGYQ → KEWoM0Hk-MbG0_3S8cSrW}/_clientMiddlewareManifest.json +0 -0
  160. /package/web/.next/static/{UOxWj8CnreBdyLxAYAGYQ → KEWoM0Hk-MbG0_3S8cSrW}/_ssgManifest.js +0 -0
@@ -6,6 +6,8 @@ type Story = StoryObj<typeof meta>;
6
6
  export declare const ActionNeeded: Story;
7
7
  export declare const InProgress: Story;
8
8
  export declare const Done: Story;
9
+ export declare const Blocked: Story;
10
+ export declare const Error: Story;
9
11
  export declare const WithClickHandler: Story;
10
12
  export declare const WithoutAgent: Story;
11
13
  //# sourceMappingURL=feature-list-item.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-list-item.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-list-item/feature-list-item.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAgBtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,YAAY,EAAE,KAO1B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAQlB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAQ9B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC"}
1
+ {"version":3,"file":"feature-list-item.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-list-item/feature-list-item.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAgBtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,YAAY,EAAE,KAO1B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAQlB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAOnB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAQ9B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC"}
@@ -39,6 +39,22 @@ export const Done = {
39
39
  modelId: 'gemini-2.5-pro',
40
40
  },
41
41
  };
42
+ export const Blocked = {
43
+ args: {
44
+ name: 'Dependency Resolver',
45
+ status: 'blocked',
46
+ agentType: 'claude-code',
47
+ modelId: 'claude-sonnet-4-6',
48
+ },
49
+ };
50
+ export const Error = {
51
+ args: {
52
+ name: 'Broken Pipeline',
53
+ status: 'error',
54
+ agentType: 'cursor',
55
+ modelId: 'claude-opus-4-6',
56
+ },
57
+ };
42
58
  export const WithClickHandler = {
43
59
  args: {
44
60
  name: 'API Gateway',
@@ -15,31 +15,31 @@ const meta = {
15
15
  export default meta;
16
16
  export const AllStatuses = {
17
17
  args: {
18
- counts: { 'action-needed': 2, 'in-progress': 3, done: 5 },
18
+ counts: { 'action-needed': 2, 'in-progress': 3, blocked: 1, error: 1, done: 5 },
19
19
  },
20
20
  };
21
21
  export const ActionNeededOnly = {
22
22
  args: {
23
- counts: { 'action-needed': 4, 'in-progress': 0, done: 0 },
23
+ counts: { 'action-needed': 4, 'in-progress': 0, blocked: 0, error: 0, done: 0 },
24
24
  },
25
25
  };
26
26
  export const InProgressOnly = {
27
27
  args: {
28
- counts: { 'action-needed': 0, 'in-progress': 2, done: 0 },
28
+ counts: { 'action-needed': 0, 'in-progress': 2, blocked: 0, error: 0, done: 0 },
29
29
  },
30
30
  };
31
31
  export const DoneOnly = {
32
32
  args: {
33
- counts: { 'action-needed': 0, 'in-progress': 0, done: 7 },
33
+ counts: { 'action-needed': 0, 'in-progress': 0, blocked: 0, error: 0, done: 7 },
34
34
  },
35
35
  };
36
36
  export const LargeCounts = {
37
37
  args: {
38
- counts: { 'action-needed': 12, 'in-progress': 99, done: 150 },
38
+ counts: { 'action-needed': 12, 'in-progress': 99, blocked: 5, error: 3, done: 150 },
39
39
  },
40
40
  };
41
41
  export const Empty = {
42
42
  args: {
43
- counts: { 'action-needed': 0, 'in-progress': 0, done: 0 },
43
+ counts: { 'action-needed': 0, 'in-progress': 0, blocked: 0, error: 0, done: 0 },
44
44
  },
45
45
  };
@@ -1,5 +1,5 @@
1
1
  import type { LucideIcon } from 'lucide-react';
2
- export type FeatureStatus = 'action-needed' | 'in-progress' | 'done';
2
+ export type FeatureStatus = 'action-needed' | 'in-progress' | 'blocked' | 'error' | 'done';
3
3
  export interface FeatureStatusConfig {
4
4
  icon: LucideIcon;
5
5
  iconClass: string;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-status-config.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/feature-status-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,aAAa,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAmB1E,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,aAAa,EAA6C,CAAC"}
1
+ {"version":3,"file":"feature-status-config.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/feature-status-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,aAAa,EAAE,mBAAmB,CA+B1E,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,aAAa,EAM7C,CAAC"}
@@ -1,4 +1,4 @@
1
- import { CircleAlert, Loader2, CircleCheck } from 'lucide-react';
1
+ import { CircleAlert, Loader2, CircleCheck, Ban, CircleX } from 'lucide-react';
2
2
  export const featureStatusConfig = {
3
3
  'action-needed': {
4
4
  icon: CircleAlert,
@@ -12,6 +12,18 @@ export const featureStatusConfig = {
12
12
  bgClass: 'bg-blue-500/10',
13
13
  label: 'In Progress',
14
14
  },
15
+ blocked: {
16
+ icon: Ban,
17
+ iconClass: 'text-gray-400',
18
+ bgClass: 'bg-gray-400/10',
19
+ label: 'Blocked',
20
+ },
21
+ error: {
22
+ icon: CircleX,
23
+ iconClass: 'text-red-500',
24
+ bgClass: 'bg-red-500/10',
25
+ label: 'Error',
26
+ },
15
27
  done: {
16
28
  icon: CircleCheck,
17
29
  iconClass: 'text-emerald-500',
@@ -19,4 +31,10 @@ export const featureStatusConfig = {
19
31
  label: 'Done',
20
32
  },
21
33
  };
22
- export const featureStatusOrder = ['action-needed', 'in-progress', 'done'];
34
+ export const featureStatusOrder = [
35
+ 'action-needed',
36
+ 'error',
37
+ 'blocked',
38
+ 'in-progress',
39
+ 'done',
40
+ ];
@@ -11,7 +11,7 @@ export interface SidebarFeatureItem {
11
11
  modelId?: string;
12
12
  }
13
13
  /**
14
- * Maps a canvas FeatureNodeState to the sidebar's 3-state FeatureStatus.
14
+ * Maps a canvas FeatureNodeState to the sidebar's 5-state FeatureStatus.
15
15
  * Returns `null` for `creating` (optimistic UI) — these should be excluded from the sidebar.
16
16
  */
17
17
  export declare function mapNodeStateToSidebarStatus(state: FeatureNodeState): FeatureStatus | null;
@@ -2,18 +2,18 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { createContext, useContext, useState, useMemo } from 'react';
4
4
  // ---------------------------------------------------------------------------
5
- // Pure mapping: FeatureNodeState (6-state) → FeatureStatus (3-state) | null
5
+ // Pure mapping: FeatureNodeState (6-state) → FeatureStatus (5-state) | null
6
6
  // ---------------------------------------------------------------------------
7
7
  const stateMapping = {
8
8
  'action-required': 'action-needed',
9
9
  running: 'in-progress',
10
10
  done: 'done',
11
- blocked: 'in-progress',
12
- error: 'in-progress',
11
+ blocked: 'blocked',
12
+ error: 'error',
13
13
  creating: null,
14
14
  };
15
15
  /**
16
- * Maps a canvas FeatureNodeState to the sidebar's 3-state FeatureStatus.
16
+ * Maps a canvas FeatureNodeState to the sidebar's 5-state FeatureStatus.
17
17
  * Returns `null` for `creating` (optimistic UI) — these should be excluded from the sidebar.
18
18
  */
19
19
  export function mapNodeStateToSidebarStatus(state) {
@@ -1 +1 @@
1
- {"version":3,"file":"layout-with-dagre.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/layout-with-dagre.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAkCF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,EAC5C,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,GAAE,aAAkB,GACvB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAoK/B"}
1
+ {"version":3,"file":"layout-with-dagre.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/layout-with-dagre.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAkCF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,EAC5C,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,GAAE,aAAkB,GACvB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAyL/B"}
@@ -75,9 +75,15 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
75
75
  const size = getNodeSize(node, nodeSize);
76
76
  centerMap.set(node.id, { cx: dagreNode.x, cy: dagreNode.y, w: size.width, h: size.height });
77
77
  }
78
- // Post-process: center each group of children around their parent's
79
- // secondary-axis center so the edge fans out symmetrically.
80
- // Build parent→children map from the edges.
78
+ // ── Proper tree layout for the secondary axis ──
79
+ // Dagre gives us correct primary-axis (rank/X) positions but its secondary-
80
+ // axis (Y) positioning doesn't respect our tree structure well. Replace it
81
+ // with a bottom-up tree layout:
82
+ // 1. Compute subtree heights (leaves → roots)
83
+ // 2. Position children centered on parent (roots → leaves)
84
+ // This guarantees: no overlaps, parents centered on children, and straight
85
+ // lines for 1-to-1 connections at every depth.
86
+ // Build parent→children map from edges
81
87
  const childrenOf = new Map();
82
88
  for (const edge of edges) {
83
89
  if (!centerMap.has(edge.source) || !centerMap.has(edge.target))
@@ -86,63 +92,80 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
86
92
  childrenOf.set(edge.source, []);
87
93
  childrenOf.get(edge.source).push(edge.target);
88
94
  }
89
- for (const [parentId, childIds] of childrenOf) {
90
- if (childIds.length <= 1)
91
- continue;
92
- const parent = centerMap.get(parentId);
93
- const parentCenter = isHorizontal ? parent.cy : parent.cx;
94
- // Sort children by their current secondary-axis position
95
- const sorted = childIds
96
- .filter((id) => centerMap.has(id))
97
- .sort((a, b) => {
98
- const pa = centerMap.get(a);
99
- const pb = centerMap.get(b);
100
- return isHorizontal ? pa.cy - pb.cy : pa.cx - pb.cx;
101
- });
102
- // Compute the current center of the children group
103
- const first = centerMap.get(sorted[0]);
104
- const last = centerMap.get(sorted[sorted.length - 1]);
105
- const groupCenter = isHorizontal ? (first.cy + last.cy) / 2 : (first.cx + last.cx) / 2;
106
- // Shift all children so the group center aligns with the parent center
107
- const shift = parentCenter - groupCenter;
108
- if (Math.abs(shift) > 1) {
109
- for (const childId of sorted) {
110
- const c = centerMap.get(childId);
111
- if (isHorizontal) {
112
- c.cy += shift;
113
- }
114
- else {
115
- c.cx += shift;
116
- }
117
- }
118
- }
119
- }
120
- // Enforce input-order within each sibling group so that the caller's
121
- // sort (e.g. by createdAt) is respected on the secondary axis.
95
+ // Sort children by input order (preserves caller's ordering, e.g. createdAt)
122
96
  const inputIndex = new Map();
123
97
  for (let i = 0; i < graphNodes.length; i++) {
124
98
  inputIndex.set(graphNodes[i].id, i);
125
99
  }
126
- for (const [, childIds] of childrenOf) {
127
- const valid = childIds.filter((id) => centerMap.has(id));
128
- if (valid.length <= 1)
129
- continue;
130
- // Collect current secondary-axis positions, sorted ascending
131
- const positions = valid
132
- .map((id) => (isHorizontal ? centerMap.get(id).cy : centerMap.get(id).cx))
133
- .sort((a, b) => a - b);
134
- // Sort children by input index (preserves caller's ordering, e.g. createdAt)
135
- const byInput = [...valid].sort((a, b) => (inputIndex.get(a) ?? 0) - (inputIndex.get(b) ?? 0));
136
- // Assign sorted positions in input order
137
- for (let i = 0; i < byInput.length; i++) {
138
- const c = centerMap.get(byInput[i]);
139
- if (isHorizontal) {
140
- c.cy = positions[i];
141
- }
142
- else {
143
- c.cx = positions[i];
144
- }
100
+ for (const [, kids] of childrenOf) {
101
+ kids.sort((a, b) => (inputIndex.get(a) ?? 0) - (inputIndex.get(b) ?? 0));
102
+ }
103
+ // Find tree roots (nodes that are parents but not children)
104
+ const childSet = new Set();
105
+ for (const ids of childrenOf.values()) {
106
+ for (const id of ids)
107
+ childSet.add(id);
108
+ }
109
+ // Include leaf nodes that have no children and are not in childrenOf keys
110
+ const allConnected = new Set(centerMap.keys());
111
+ const roots = [...allConnected].filter((id) => !childSet.has(id));
112
+ // Bottom-up: compute the total secondary-axis span each subtree needs
113
+ const subtreeSpan = new Map();
114
+ function computeSpan(nodeId) {
115
+ if (subtreeSpan.has(nodeId))
116
+ return subtreeSpan.get(nodeId);
117
+ const c = centerMap.get(nodeId);
118
+ const nodeSpan = isHorizontal ? c.h : c.w;
119
+ const kids = childrenOf.get(nodeId);
120
+ if (!kids || kids.length === 0) {
121
+ subtreeSpan.set(nodeId, nodeSpan);
122
+ return nodeSpan;
145
123
  }
124
+ let childrenTotalSpan = 0;
125
+ for (const kid of kids) {
126
+ childrenTotalSpan += computeSpan(kid);
127
+ }
128
+ childrenTotalSpan += (kids.length - 1) * nodesep;
129
+ const span = Math.max(nodeSpan, childrenTotalSpan);
130
+ subtreeSpan.set(nodeId, span);
131
+ return span;
132
+ }
133
+ for (const root of roots)
134
+ computeSpan(root);
135
+ // Top-down: position each node on the secondary axis, centering parent
136
+ // on its children block. For 1-to-1 edges the child gets the same
137
+ // secondary-axis value as its parent (straight line).
138
+ function positionTree(nodeId, centerPos) {
139
+ const c = centerMap.get(nodeId);
140
+ if (isHorizontal) {
141
+ c.cy = centerPos;
142
+ }
143
+ else {
144
+ c.cx = centerPos;
145
+ }
146
+ const kids = childrenOf.get(nodeId);
147
+ if (!kids || kids.length === 0)
148
+ return;
149
+ // Total span occupied by children
150
+ let childrenTotalSpan = 0;
151
+ for (const kid of kids) {
152
+ childrenTotalSpan += subtreeSpan.get(kid) ?? 0;
153
+ }
154
+ childrenTotalSpan += (kids.length - 1) * nodesep;
155
+ // Start from the top of the centered children block
156
+ let cursor = centerPos - childrenTotalSpan / 2;
157
+ for (const kid of kids) {
158
+ const kidSpan = subtreeSpan.get(kid) ?? 0;
159
+ positionTree(kid, cursor + kidSpan / 2);
160
+ cursor += kidSpan + nodesep;
161
+ }
162
+ }
163
+ // Position each root tree. Stack root trees vertically with nodesep gap.
164
+ let rootCursor = 0;
165
+ for (const root of roots) {
166
+ const span = subtreeSpan.get(root) ?? 0;
167
+ positionTree(root, rootCursor + span / 2);
168
+ rootCursor += span + nodesep;
146
169
  }
147
170
  // Build result array converting center-coords to React Flow top-left
148
171
  const result = [];