@shepai/cli 1.91.0-pr271.f9e060f → 1.91.0-pr272.23df749

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 (128) hide show
  1. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +0 -1
  2. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
  3. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +0 -1
  4. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +15 -55
  6. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +0 -2
  7. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +0 -73
  9. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  10. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +1 -1
  11. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +3 -1
  12. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  14. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts +1 -0
  15. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +6 -0
  17. package/dist/tsconfig.build.tsbuildinfo +1 -1
  18. package/package.json +1 -1
  19. package/web/.next/BUILD_ID +1 -1
  20. package/web/.next/build-manifest.json +2 -2
  21. package/web/.next/fallback-build-manifest.json +2 -2
  22. package/web/.next/prerender-manifest.json +3 -3
  23. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  24. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/create/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]/page/server-reference-manifest.json +21 -21
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  39. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  42. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/_global-error.html +2 -2
  45. package/web/.next/server/app/_global-error.rsc +1 -1
  46. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  47. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  48. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  51. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  52. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  54. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  56. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  58. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  60. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  62. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  63. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  64. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  65. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  66. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  67. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  68. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  69. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  82. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  83. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  84. package/web/.next/server/chunks/ssr/{_3735fe72._.js → _6f210cd6._.js} +2 -2
  85. package/web/.next/server/chunks/ssr/{_3735fe72._.js.map → _6f210cd6._.js.map} +1 -1
  86. package/web/.next/server/chunks/ssr/_752e01fd._.js +1 -1
  87. package/web/.next/server/chunks/ssr/_752e01fd._.js.map +1 -1
  88. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  89. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  90. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  91. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  92. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  93. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  94. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  95. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  97. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  99. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  101. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  103. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  105. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  107. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  109. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  111. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  112. package/web/.next/server/pages/500.html +2 -2
  113. package/web/.next/server/server-reference-manifest.js +1 -1
  114. package/web/.next/server/server-reference-manifest.json +28 -28
  115. package/web/.next/static/chunks/{3c887e1254ebcf9b.js → 4fd356eadcea8c40.js} +1 -1
  116. package/web/.next/static/chunks/{7acc79e599df9890.js → 5354f4b7b25b3665.js} +1 -1
  117. package/web/.next/static/chunks/{a60332c83c5a9a99.js → 540002baafa530e0.js} +1 -1
  118. package/web/.next/static/chunks/{2bc592fcedb175e3.js → 841fb079ad5ab441.js} +1 -1
  119. package/web/.next/static/chunks/{3b01d6c5f2c80432.js → 915f4adc1d6233bc.js} +1 -1
  120. package/web/.next/static/chunks/{dfe944323bed074c.js → 967581e4d3e8cfa2.js} +1 -1
  121. package/web/.next/static/chunks/{355d71c0450b4a02.js → a151b8da17938657.js} +1 -1
  122. package/web/.next/static/chunks/{0e16acc45407464e.js → aae0ffaa16d68384.js} +1 -1
  123. package/web/.next/static/chunks/{e1c70b7a7e2d1977.js → e33eb32a2fca0093.js} +1 -1
  124. package/web/.next/static/chunks/{63aece55683a5d9e.js → ef185482eaf516a2.js} +1 -1
  125. package/web/.next/static/chunks/{359c068ab4a0da6f.js → f2d1d08bcc83df46.js} +1 -1
  126. /package/web/.next/static/{MBJ8GLCn8wUUq7rR0bnER → B8iQuiEt6Gx7OEET_ANjn}/_buildManifest.js +0 -0
  127. /package/web/.next/static/{MBJ8GLCn8wUUq7rR0bnER → B8iQuiEt6Gx7OEET_ANjn}/_clientMiddlewareManifest.json +0 -0
  128. /package/web/.next/static/{MBJ8GLCn8wUUq7rR0bnER → B8iQuiEt6Gx7OEET_ANjn}/_ssgManifest.js +0 -0
@@ -11,7 +11,6 @@ export interface RejectionFeedbackData {
11
11
  iteration: number;
12
12
  message: string;
13
13
  phase?: string;
14
- timestamp?: string;
15
14
  attachments?: string[];
16
15
  }
17
16
  type GetPhaseTimingsResult = {
@@ -1 +1 @@
1
- {"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,qBAAqB,GACtB;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA2B9F"}
1
+ {"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,qBAAqB,GACtB;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA2B9F"}
@@ -42,7 +42,6 @@ async function readRejectionFeedback(featureId) {
42
42
  iteration: Number(entry.iteration ?? 1),
43
43
  message: String(entry.message ?? ''),
44
44
  phase: entry.phase ? String(entry.phase) : undefined,
45
- timestamp: entry.timestamp ? String(entry.timestamp) : undefined,
46
45
  attachments: Array.isArray(entry.attachments)
47
46
  ? entry.attachments.map(String)
48
47
  : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAGjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AA6HD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CAiE3F"}
1
+ {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAGjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AA4ED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CA8D3F"}
@@ -39,63 +39,23 @@ function groupTimingsByRun(timings) {
39
39
  return groups;
40
40
  }
41
41
  /**
42
- * Ensure every rejection feedback entry has a corresponding run:rejected timing event
43
- * and build a map from each event key to its display data.
44
- *
45
- * The timings array may contain fewer run:rejected events than the feedback array
46
- * (e.g. 2 timing events for 4 feedback entries). For any unmatched feedback entries,
47
- * synthetic run:rejected timing events are inserted after the last existing
48
- * run:rejected event in the timings array so that all feedback is rendered.
42
+ * Map each run:rejected timing entry to its rejection feedback message and attachments.
43
+ * Matches by sequential order: 1st rejected event 1st feedback entry, etc.
49
44
  */
50
- function ensureRejectionTimingsAndBuildMap(timings, feedback) {
45
+ function buildRejectionMessageMap(timings, feedback) {
51
46
  const map = new Map();
52
47
  if (!feedback?.length)
53
- return { timings, rejectionMessages: map };
54
- // Collect existing run:rejected events
55
- const existingRejections = [];
56
- for (let i = 0; i < timings.length; i++) {
57
- if (timings[i].phase === 'run:rejected') {
58
- existingRejections.push({ index: i, timing: timings[i] });
48
+ return map;
49
+ let rejectionIdx = 0;
50
+ for (const t of timings) {
51
+ if (t.phase === 'run:rejected' && rejectionIdx < feedback.length) {
52
+ const key = `${t.agentRunId}-${t.phase}-${t.startedAt}`;
53
+ const entry = feedback[rejectionIdx];
54
+ map.set(key, { message: entry.message, attachments: entry.attachments });
55
+ rejectionIdx++;
59
56
  }
60
57
  }
61
- // Pair existing events with feedback sequentially
62
- const paired = Math.min(existingRejections.length, feedback.length);
63
- for (let i = 0; i < paired; i++) {
64
- const t = existingRejections[i].timing;
65
- const key = `${t.agentRunId}-${t.phase}-${t.startedAt}`;
66
- map.set(key, { message: feedback[i].message, attachments: feedback[i].attachments });
67
- }
68
- // If all feedback is covered, no need to inject synthetic entries
69
- if (paired >= feedback.length) {
70
- return { timings, rejectionMessages: map };
71
- }
72
- // Synthesize additional run:rejected timing entries for remaining feedback
73
- const result = [...timings];
74
- // Determine where to insert: after the last existing run:rejected, or at the end
75
- let insertAfter = result.length - 1;
76
- if (existingRejections.length > 0) {
77
- insertAfter = existingRejections[existingRejections.length - 1].index;
78
- }
79
- // Use the last existing rejected event as a template for agentRunId,
80
- // or fall back to the first timing entry's agentRunId
81
- const templateRunId = existingRejections.length > 0
82
- ? existingRejections[existingRejections.length - 1].timing.agentRunId
83
- : (timings[0]?.agentRunId ?? 'unknown');
84
- const synthetic = [];
85
- for (let i = paired; i < feedback.length; i++) {
86
- const fb = feedback[i];
87
- const syntheticTiming = {
88
- agentRunId: templateRunId,
89
- phase: 'run:rejected',
90
- startedAt: fb.timestamp ?? `synthetic-${i}`,
91
- };
92
- const key = `${syntheticTiming.agentRunId}-${syntheticTiming.phase}-${syntheticTiming.startedAt}`;
93
- map.set(key, { message: fb.message, attachments: fb.attachments });
94
- synthetic.push(syntheticTiming);
95
- }
96
- // Insert synthetic entries after the last existing run:rejected
97
- result.splice(insertAfter + 1, 0, ...synthetic);
98
- return { timings: result, rejectionMessages: map };
58
+ return map;
99
59
  }
100
60
  export function ActivityTab({ timings, loading, error, rejectionFeedback }) {
101
61
  if (loading) {
@@ -109,9 +69,9 @@ export function ActivityTab({ timings, loading, error, rejectionFeedback }) {
109
69
  }
110
70
  const nodeTimings = timings.filter((t) => !isLifecycleEvent(t.phase));
111
71
  const maxDurationMs = Math.max(...nodeTimings.map((t) => t.durationMs ?? 0), ...nodeTimings.map((t) => t.approvalWaitMs ?? 0), 0);
112
- // Ensure every rejection feedback entry has a timing event and build display map
113
- const { timings: enrichedTimings, rejectionMessages } = ensureRejectionTimingsAndBuildMap(timings, rejectionFeedback);
114
- const groups = groupTimingsByRun(enrichedTimings);
72
+ // Build a map from rejection index to feedback message
73
+ const rejectionMessages = buildRejectionMessageMap(timings, rejectionFeedback);
74
+ const groups = groupTimingsByRun(timings);
115
75
  const multiRun = groups.length > 1;
116
76
  const totalExecMs = nodeTimings.reduce((sum, t) => sum + (t.durationMs ?? 0), 0);
117
77
  const totalWaitMs = nodeTimings.reduce((sum, t) => sum + (t.approvalWaitMs ?? 0), 0);
@@ -17,8 +17,6 @@ export declare const Empty: Story;
17
17
  export declare const Error: Story;
18
18
  /** Rejection — shows rejected lifecycle event with user feedback text. */
19
19
  export declare const WithRejection: Story;
20
- /** Multiple rejections — all feedback entries shown even with fewer run:rejected events. */
21
- export declare const MultipleRejections: Story;
22
20
  /** Approval wait indicators — phases with approval wait sub-rows. */
23
21
  export declare const WithApprovalWaits: Story;
24
22
  //# sourceMappingURL=activity-tab.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAmK1C,2EAA2E;AAC3E,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,KAsE3B,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,KAwEhC,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,EAAE,KAgC/B,CAAC"}
1
+ {"version":3,"file":"activity-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAmK1C,2EAA2E;AAC3E,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,KAsE3B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,EAAE,KAgC/B,CAAC"}
@@ -288,79 +288,6 @@ export const WithRejection = {
288
288
  error: null,
289
289
  },
290
290
  };
291
- /** Multiple rejections — all feedback entries shown even with fewer run:rejected events. */
292
- export const MultipleRejections = {
293
- args: {
294
- timings: [
295
- {
296
- agentRunId: 'run-1',
297
- phase: 'run:started',
298
- startedAt: '2025-01-15T10:00:00Z',
299
- durationMs: 0,
300
- },
301
- {
302
- agentRunId: 'run-1',
303
- phase: 'plan',
304
- startedAt: '2025-01-15T10:00:01Z',
305
- completedAt: '2025-01-15T10:05:00Z',
306
- durationMs: 300000,
307
- },
308
- {
309
- agentRunId: 'run-1',
310
- phase: 'run:rejected',
311
- startedAt: '2025-01-15T10:05:00Z',
312
- durationMs: 0,
313
- },
314
- {
315
- agentRunId: 'run-1',
316
- phase: 'run:resumed',
317
- startedAt: '2025-01-15T10:10:00Z',
318
- durationMs: 0,
319
- },
320
- {
321
- agentRunId: 'run-1',
322
- phase: 'merge',
323
- startedAt: '2025-01-15T10:10:01Z',
324
- completedAt: '2025-01-15T10:15:00Z',
325
- durationMs: 299000,
326
- },
327
- {
328
- agentRunId: 'run-1',
329
- phase: 'run:rejected',
330
- startedAt: '2025-01-15T10:15:00Z',
331
- durationMs: 0,
332
- },
333
- ],
334
- rejectionFeedback: [
335
- {
336
- iteration: 1,
337
- message: 'rebase on main',
338
- phase: 'plan',
339
- timestamp: '2025-01-15T10:05:00Z',
340
- },
341
- {
342
- iteration: 2,
343
- message: 'rebase on main',
344
- phase: 'merge',
345
- timestamp: '2025-01-15T10:15:00Z',
346
- },
347
- {
348
- iteration: 3,
349
- message: 'add support for evidence agent into fast mode as well',
350
- phase: 'merge',
351
- timestamp: '2025-01-15T10:20:00Z',
352
- },
353
- {
354
- iteration: 4,
355
- message: "I've test and created a feature but the screenshots seems to be broken https://github.com/shep-ai/cli/pull/258 fix",
356
- phase: 'merge',
357
- timestamp: '2025-01-15T10:25:00Z',
358
- },
359
- ],
360
- loading: false,
361
- error: null,
362
- },
363
- };
364
291
  /** Approval wait indicators — phases with approval wait sub-rows. */
365
292
  export const WithApprovalWaits = {
366
293
  args: {
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBpD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAkDD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAUnD"}
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBpD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAmDD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAUnD"}
@@ -29,7 +29,7 @@ function AppShellInner({ children }) {
29
29
  const handleRepositorySelect = useCallback((path) => {
30
30
  window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));
31
31
  }, []);
32
- return (_jsxs(SidebarProvider, { children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onNewFeature: handleNewFeature, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsxs("div", { className: "absolute top-3 right-3 z-50 flex gap-1", children: [_jsx(AddRepositoryButton, { onSelect: handleRepositorySelect }), _jsx(SoundToggle, {}), _jsx(ThemeToggle, {})] }), _jsx("main", { className: "h-full", children: children })] }) })] }));
32
+ return (_jsxs(SidebarProvider, { children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, showNewFeature: true, onNewFeature: handleNewFeature, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsxs("div", { className: "absolute top-3 right-3 z-50 flex gap-1", children: [_jsx(AddRepositoryButton, { onSelect: handleRepositorySelect }), _jsx(SoundToggle, {}), _jsx(ThemeToggle, {})] }), _jsx("main", { className: "h-full", children: children })] }) })] }));
33
33
  }
34
34
  export function AppShell({ children }) {
35
35
  return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { children: children }) }) }) }));
@@ -12,8 +12,10 @@ export interface FeatureItem {
12
12
  export interface AppSidebarProps {
13
13
  features: FeatureItem[];
14
14
  featureFlags: FeatureFlagsState;
15
+ /** Whether to show the "New feature" button in the sidebar footer. Defaults to `false`. */
16
+ showNewFeature?: boolean;
15
17
  onNewFeature?: () => void;
16
18
  onFeatureClick?: (featureId: string) => void;
17
19
  }
18
- export declare function AppSidebar({ features, featureFlags, onNewFeature, onFeatureClick, }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function AppSidebar({ features, featureFlags, showNewFeature, onNewFeature, onFeatureClick, }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
19
21
  //# sourceMappingURL=app-sidebar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,EAAE,eAAe,2CA6GjB"}
1
+ {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAChC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EACZ,cAAsB,EACtB,YAAY,EACZ,cAAc,GACf,EAAE,eAAe,2CA+GjB"}
@@ -12,7 +12,7 @@ import { FeatureStatusGroup } from '../../common/feature-status-group/index.js';
12
12
  import { SidebarSectionHeader } from '../../common/sidebar-section-header/index.js';
13
13
  import { featureStatusConfig, featureStatusOrder } from '../../common/feature-status-config.js';
14
14
  import { useDeferredMount } from '../../../hooks/use-deferred-mount.js';
15
- export function AppSidebar({ features, featureFlags, onNewFeature, onFeatureClick, }) {
15
+ export function AppSidebar({ features, featureFlags, showNewFeature = false, onNewFeature, onFeatureClick, }) {
16
16
  const pathname = usePathname();
17
17
  const { state } = useSidebar();
18
18
  const collapsed = state === 'collapsed';
@@ -30,5 +30,5 @@ export function AppSidebar({ features, featureFlags, onNewFeature, onFeatureClic
30
30
  'min-w-0 overflow-hidden transition-opacity duration-200 ease-out',
31
31
  '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
32
32
  expandedVisible ? 'opacity-100' : 'opacity-0',
33
- ].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features" }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, agentType: feature.agentType, modelId: feature.modelId, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, key)) : null) })] })) : null }), _jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { onClick: onNewFeature, tooltip: "New feature", children: [_jsx(Plus, {}), _jsx("span", { children: "New feature" })] }) }) }) }), _jsx(SidebarRail, {})] }));
33
+ ].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features" }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, agentType: feature.agentType, modelId: feature.modelId, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, key)) : null) })] })) : null }), showNewFeature ? (_jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { onClick: onNewFeature, tooltip: "New feature", children: [_jsx(Plus, {}), _jsx("span", { children: "New feature" })] }) }) }) })) : null, _jsx(SidebarRail, {})] }));
34
34
  }
@@ -4,6 +4,7 @@ declare const meta: Meta<typeof AppSidebar>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof meta>;
6
6
  export declare const Default: Story;
7
+ export declare const WithNewFeatureButton: Story;
7
8
  export declare const Collapsed: Story;
8
9
  export declare const Empty: Story;
9
10
  export declare const AllInProgress: Story;
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAQ3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAmDnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAiB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC"}
1
+ {"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAQ3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAmDnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAKlC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAiB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC"}
@@ -73,6 +73,12 @@ export const Default = {
73
73
  features: mockFeatures,
74
74
  },
75
75
  };
76
+ export const WithNewFeatureButton = {
77
+ args: {
78
+ features: mockFeatures,
79
+ showNewFeature: true,
80
+ },
81
+ };
76
82
  export const Collapsed = {
77
83
  args: {
78
84
  features: mockFeatures,