@shepai/cli 1.124.0-pr401.74b2155 → 1.124.0-pr403.3ad79ff

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 (191) hide show
  1. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +3 -20
  3. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  4. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +2 -19
  5. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +0 -5
  6. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  7. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +9 -38
  8. package/dist/src/presentation/web/components/features/settings/notification-settings-section.d.ts.map +1 -1
  9. package/dist/src/presentation/web/components/features/settings/notification-settings-section.js +4 -8
  10. package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.js +3 -3
  11. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  12. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +12 -37
  13. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +2 -3
  15. package/dist/tsconfig.build.tsbuildinfo +1 -1
  16. package/package.json +1 -1
  17. package/web/.next/BUILD_ID +1 -1
  18. package/web/.next/build-manifest.json +2 -2
  19. package/web/.next/fallback-build-manifest.json +2 -2
  20. package/web/.next/prerender-manifest.json +3 -3
  21. package/web/.next/required-server-files.js +1 -1
  22. package/web/.next/required-server-files.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  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]/[tab]/page/server-reference-manifest.json +28 -28
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  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 +20 -20
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  36. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  42. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  45. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  48. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/_global-error.html +2 -2
  51. package/web/.next/server/app/_global-error.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  55. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  56. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  57. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  58. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  59. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  61. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  62. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  64. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  65. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  67. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  68. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  70. package/web/.next/server/app/version/page.js.nft.json +1 -1
  71. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  73. package/web/.next/server/chunks/ssr/{node_modules__pnpm_f9ac7604._.js → 403f9_next_d6c8d28d._.js} +2 -2
  74. package/web/.next/server/chunks/ssr/403f9_next_d6c8d28d._.js.map +1 -0
  75. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  76. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  77. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  78. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  79. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  80. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js +2 -2
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__56ecbe40._.js +3 -0
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__56ecbe40._.js.map +1 -0
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js +3 -0
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js.map +1 -0
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  104. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  106. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/{_b86eec90._.js → _580a1781._.js} +2 -2
  108. package/web/.next/server/chunks/ssr/_580a1781._.js.map +1 -0
  109. package/web/.next/server/chunks/ssr/_6985c922._.js +3 -0
  110. package/web/.next/server/chunks/ssr/_6985c922._.js.map +1 -0
  111. package/web/.next/server/chunks/ssr/{_0e506641._.js → _918887c5._.js} +2 -2
  112. package/web/.next/server/chunks/ssr/_918887c5._.js.map +1 -0
  113. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  114. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/{_1bb131c4._.js → _d4b20e29._.js} +2 -2
  116. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -0
  117. package/web/.next/server/chunks/ssr/_e9703421._.js +3 -0
  118. package/web/.next/server/chunks/ssr/_e9703421._.js.map +1 -0
  119. package/web/.next/server/chunks/ssr/{_f605354c._.js → _f1a649e3._.js} +3 -3
  120. package/web/.next/server/chunks/ssr/_f1a649e3._.js.map +1 -0
  121. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  122. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  124. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js +3 -0
  126. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js.map +1 -0
  127. package/web/.next/server/chunks/ssr/src_presentation_web_0c0bf8cd._.js +3 -0
  128. package/web/.next/server/chunks/ssr/src_presentation_web_0c0bf8cd._.js.map +1 -0
  129. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  130. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  138. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  140. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  142. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  144. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  145. package/web/.next/server/pages/500.html +2 -2
  146. package/web/.next/server/server-reference-manifest.js +1 -1
  147. package/web/.next/server/server-reference-manifest.json +34 -34
  148. package/web/.next/static/chunks/0158bd913a9f8332.css +1 -0
  149. package/web/.next/static/chunks/01ba448cf76c6014.js +1 -0
  150. package/web/.next/static/chunks/22a9e0a854f004b4.js +1 -0
  151. package/web/.next/static/chunks/{683f1449a7acbe69.js → 25001092d097ddb4.js} +2 -2
  152. package/web/.next/static/chunks/37ada233462bcaec.js +11 -0
  153. package/web/.next/static/chunks/{ffcc006639ba2fd8.js → 4443ee9c7733399b.js} +1 -1
  154. package/web/.next/static/chunks/79d97aa93fd1e121.js +1 -0
  155. package/web/.next/static/chunks/{efb06f2eab920f11.js → 928630e95ee8880b.js} +1 -1
  156. package/web/.next/static/chunks/b70dd4985a814b27.js +1 -0
  157. package/web/.next/static/chunks/{15e868c5ed24e68d.js → c068a726224db05d.js} +1 -1
  158. package/web/.next/static/chunks/{fb8b8be474a3e2b5.js → c69ea4b27e353eba.js} +1 -1
  159. package/web/.next/static/chunks/{94861aa7270facbd.js → d378fd488e2ea128.js} +1 -1
  160. package/web/.next/static/chunks/{a7231c3b616020d8.js → e80fd818b2c6b13d.js} +2 -2
  161. package/web/.next/static/chunks/eb9841ec4d80af01.js +1 -0
  162. package/web/.next/static/chunks/ee776a212fb02c56.js +1 -0
  163. package/web/.next/static/chunks/f4e3b6092c7ab027.js +1 -0
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js +0 -3
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js.map +0 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +0 -3
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +0 -1
  168. package/web/.next/server/chunks/ssr/_0e506641._.js.map +0 -1
  169. package/web/.next/server/chunks/ssr/_109ee019._.js +0 -3
  170. package/web/.next/server/chunks/ssr/_109ee019._.js.map +0 -1
  171. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
  172. package/web/.next/server/chunks/ssr/_5d43c3db._.js +0 -3
  173. package/web/.next/server/chunks/ssr/_5d43c3db._.js.map +0 -1
  174. package/web/.next/server/chunks/ssr/_a161be0a._.js +0 -3
  175. package/web/.next/server/chunks/ssr/_a161be0a._.js.map +0 -1
  176. package/web/.next/server/chunks/ssr/_b86eec90._.js.map +0 -1
  177. package/web/.next/server/chunks/ssr/_f605354c._.js.map +0 -1
  178. package/web/.next/server/chunks/ssr/node_modules__pnpm_70f6d54e._.js +0 -3
  179. package/web/.next/server/chunks/ssr/node_modules__pnpm_70f6d54e._.js.map +0 -1
  180. package/web/.next/server/chunks/ssr/node_modules__pnpm_f9ac7604._.js.map +0 -1
  181. package/web/.next/static/chunks/1dd878b6feb55d2e.js +0 -1
  182. package/web/.next/static/chunks/44f74b62f897f41c.css +0 -1
  183. package/web/.next/static/chunks/8f09849a5cb49bc8.js +0 -1
  184. package/web/.next/static/chunks/a09c0c629f88ee12.js +0 -1
  185. package/web/.next/static/chunks/ac7251026c1e2cdf.js +0 -1
  186. package/web/.next/static/chunks/c4e46fbe479ebd88.js +0 -11
  187. package/web/.next/static/chunks/e2ef95d904c360f3.js +0 -1
  188. package/web/.next/static/chunks/e39cee9f73d1fda2.js +0 -1
  189. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → JTTVp0Y9VKbOO74jiTEeD}/_buildManifest.js +0 -0
  190. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → JTTVp0Y9VKbOO74jiTEeD}/_clientMiddlewareManifest.json +0 -0
  191. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → JTTVp0Y9VKbOO74jiTEeD}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAcD,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAoL3E"}
1
+ {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAmF3E"}
@@ -1,30 +1,14 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { Code2, Terminal, FolderOpen, GitBranch, GitCommitHorizontal, User, ArrowDown, Clock, } from 'lucide-react';
5
+ import { Code2, Terminal, FolderOpen } from 'lucide-react';
6
6
  import { BaseDrawer } from '../../common/base-drawer/index.js';
7
7
  import { ActionButton } from '../../common/action-button/index.js';
8
8
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
9
9
  import { Separator } from '../../ui/separator.js';
10
- import { Badge } from '../../ui/badge.js';
11
10
  import { useRepositoryActions } from '../../common/repository-node/use-repository-actions.js';
12
11
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
13
- function formatRelativeTime(epochMs) {
14
- const diff = Date.now() - epochMs;
15
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
16
- if (days === 0)
17
- return 'Today';
18
- if (days === 1)
19
- return 'Yesterday';
20
- if (days < 30)
21
- return `${days} days ago`;
22
- const months = Math.floor(days / 30);
23
- if (months < 12)
24
- return `${months} month${months > 1 ? 's' : ''} ago`;
25
- const years = Math.floor(months / 12);
26
- return `${years} year${years > 1 ? 's' : ''} ago`;
27
- }
28
12
  export function RepositoryDrawerClient({ data }) {
29
13
  const featureFlags = useFeatureFlags();
30
14
  const router = useRouter();
@@ -42,6 +26,5 @@ export function RepositoryDrawerClient({ data }) {
42
26
  }
43
27
  : undefined;
44
28
  const header = (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] }));
45
- const hasGitInfo = !!(data.branch ?? data.commitMessage);
46
- return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: _jsxs("div", { className: "flex flex-1 flex-col overflow-y-auto", children: [hasGitInfo ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-git-section", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT STATUS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [data.branch ? (_jsxs("div", { className: "flex items-center justify-between gap-2", "data-testid": "repository-drawer-branch-row", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(GitBranch, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "text-foreground font-medium", children: "Branch" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "secondary", className: "font-mono text-xs", "data-testid": "repository-drawer-branch", children: data.branch }), data.behindCount != null && data.behindCount > 0 ? (_jsxs(Badge, { variant: "outline", className: "border-amber-500/40 bg-amber-50 text-xs text-amber-600 dark:bg-amber-900/20 dark:text-amber-400", "data-testid": "repository-drawer-behind", children: [_jsx(ArrowDown, { className: "mr-1 h-3 w-3" }), data.behindCount, " behind"] })) : null] })] })) : null, data.commitMessage ? (_jsx("div", { className: "bg-muted/50 rounded-lg p-3", "data-testid": "repository-drawer-commit-section", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground mt-0.5 h-4 w-4 shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-foreground text-sm leading-snug font-medium", "data-testid": "repository-drawer-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("div", { className: "text-muted-foreground mt-1 flex items-center gap-1 text-xs", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { "data-testid": "repository-drawer-committer", children: data.committer })] })) : null] })] }) })) : null] })] })] })) : null, data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null, data.createdAt ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-metadata", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "INFO" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Clock, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: "Added" })] }), _jsx("span", { className: "text-foreground text-xs", title: new Date(data.createdAt).toLocaleString(), "data-testid": "repository-drawer-created-at", children: formatRelativeTime(data.createdAt) })] })] })] })) : null] }) }));
29
+ return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
47
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAcD,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CAsLxE"}
1
+ {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CA+ExE"}
@@ -1,39 +1,22 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
- import { Code2, Terminal, FolderOpen, GitBranch, GitCommitHorizontal, User, ArrowDown, Clock, } from 'lucide-react';
4
+ import { Code2, Terminal, FolderOpen } from 'lucide-react';
5
5
  import { BaseDrawer } from '../../common/base-drawer/index.js';
6
6
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
7
7
  import { Separator } from '../../ui/separator.js';
8
- import { Badge } from '../../ui/badge.js';
9
8
  import { ActionButton } from '../../common/action-button/index.js';
10
9
  import { useRepositoryActions } from './use-repository-actions.js';
11
- function formatRelativeTime(epochMs) {
12
- const diff = Date.now() - epochMs;
13
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
14
- if (days === 0)
15
- return 'Today';
16
- if (days === 1)
17
- return 'Yesterday';
18
- if (days < 30)
19
- return `${days} days ago`;
20
- const months = Math.floor(days / 30);
21
- if (months < 12)
22
- return `${months} month${months > 1 ? 's' : ''} ago`;
23
- const years = Math.floor(months / 12);
24
- return `${years} year${years > 1 ? 's' : ''} ago`;
25
- }
26
10
  export function RepositoryDrawer({ data, onClose }) {
27
11
  const handleClose = useCallback(() => {
28
12
  onClose();
29
13
  }, [onClose]);
30
14
  const actions = useRepositoryActions(data?.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
31
- const hasGitInfo = !!(data?.branch ?? data?.commitMessage);
32
15
  return (_jsx(BaseDrawer, { open: data !== null, onClose: handleClose, size: "md", modal: false, "data-testid": "repository-drawer", deployTarget: data?.repositoryPath
33
16
  ? {
34
17
  targetId: data.repositoryPath,
35
18
  targetType: 'repository',
36
19
  repositoryPath: data.repositoryPath,
37
20
  }
38
- : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data ? (_jsxs("div", { className: "flex flex-1 flex-col overflow-y-auto", children: [hasGitInfo ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-git-section", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT STATUS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [data.branch ? (_jsxs("div", { className: "flex items-center justify-between gap-2", "data-testid": "repository-drawer-branch-row", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(GitBranch, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "text-foreground font-medium", children: "Branch" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "secondary", className: "font-mono text-xs", "data-testid": "repository-drawer-branch", children: data.branch }), data.behindCount != null && data.behindCount > 0 ? (_jsxs(Badge, { variant: "outline", className: "border-amber-500/40 bg-amber-50 text-xs text-amber-600 dark:bg-amber-900/20 dark:text-amber-400", "data-testid": "repository-drawer-behind", children: [_jsx(ArrowDown, { className: "mr-1 h-3 w-3" }), data.behindCount, " behind"] })) : null] })] })) : null, data.commitMessage ? (_jsx("div", { className: "bg-muted/50 rounded-lg p-3", "data-testid": "repository-drawer-commit-section", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground mt-0.5 h-4 w-4 shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-foreground text-sm leading-snug font-medium", "data-testid": "repository-drawer-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("div", { className: "text-muted-foreground mt-1 flex items-center gap-1 text-xs", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { "data-testid": "repository-drawer-committer", children: data.committer })] })) : null] })] }) })) : null] })] })] })) : null, data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null, data.createdAt ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-metadata", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "INFO" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Clock, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: "Added" })] }), _jsx("span", { className: "text-foreground text-xs", title: new Date(data.createdAt).toLocaleString(), "data-testid": "repository-drawer-created-at", children: formatRelativeTime(data.createdAt) })] })] })] })) : null] })) : null }));
21
+ : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data?.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
39
22
  }
@@ -3,12 +3,7 @@ import { RepositoryDrawer } from './repository-drawer.js';
3
3
  declare const meta: Meta<typeof RepositoryDrawer>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof RepositoryDrawer>;
6
- /** Basic drawer — no git info, just path and actions. */
7
6
  export declare const Default: Story;
8
- /** Full enriched drawer — branch, commit, committer, behind count, metadata. */
9
- export declare const WithGitInfo: Story;
10
- /** On default branch — no behind count shown. */
11
- export declare const OnDefaultBranch: Story;
12
7
  export declare const LongPath: Story;
13
8
  export declare const WithoutPath: Story;
14
9
  /** Repository drawer rendered inside a full-page context — starts open. */
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAOvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAgE/C,yDAAyD;AACzD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
1
+ {"version":3,"file":"repository-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAOvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAqB/C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAuBF,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
@@ -16,59 +16,30 @@ const repoData = {
16
16
  name: 'shep-ai/cli',
17
17
  repositoryPath: '/home/user/shep-ai/cli',
18
18
  };
19
- const enrichedRepoData = {
20
- id: 'repo-2',
21
- name: 'shep-ai/cli',
22
- repositoryPath: '/home/user/shep-ai/cli',
23
- branch: 'feat/repo-tab-redesign',
24
- commitMessage: 'feat(web): redesign repository drawer with git info',
25
- committer: 'Jane Doe',
26
- behindCount: 3,
27
- createdAt: Date.now() - 1000 * 60 * 60 * 24 * 5, // 5 days ago
28
- };
29
- const onDefaultBranchData = {
30
- id: 'repo-3',
31
- name: 'my-org/my-project',
32
- repositoryPath: '/home/user/my-org/my-project',
33
- branch: 'main',
34
- commitMessage: 'chore: bump dependencies to latest versions',
35
- committer: 'John Smith',
36
- behindCount: null,
37
- createdAt: Date.now() - 1000 * 60 * 60 * 24 * 30, // 1 month ago
38
- };
39
19
  function DrawerTrigger({ data, label }) {
40
20
  const [selected, setSelected] = useState(null);
41
21
  return (_jsxs("div", { className: "flex h-screen items-start p-4", children: [_jsx(Button, { variant: "outline", onClick: () => setSelected(data), children: label }), _jsx(RepositoryDrawer, { data: selected, onClose: () => setSelected(null) })] }));
42
22
  }
43
- /* ---------------------------------------------------------------------------
44
- * Shell template — full page context, starts open (matches ReviewDrawerShell pattern)
45
- * ------------------------------------------------------------------------- */
46
- function RepositoryDrawerShellTemplate({ data }) {
47
- const [selected, setSelected] = useState(data);
48
- return (_jsxs("div", { style: { height: '100vh', background: '#f8fafc', padding: '2rem' }, children: [_jsx("button", { type: "button", onClick: () => setSelected(data), style: { padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }, children: "Open Drawer" }), _jsx(RepositoryDrawer, { data: selected, onClose: () => setSelected(null) })] }));
49
- }
50
- /** Basic drawer — no git info, just path and actions. */
51
23
  export const Default = {
52
24
  render: () => _jsx(RepositoryDrawerShellTemplate, { data: repoData }),
53
25
  };
54
- /** Full enriched drawer — branch, commit, committer, behind count, metadata. */
55
- export const WithGitInfo = {
56
- render: () => _jsx(RepositoryDrawerShellTemplate, { data: enrichedRepoData }),
57
- };
58
- /** On default branch — no behind count shown. */
59
- export const OnDefaultBranch = {
60
- render: () => _jsx(RepositoryDrawerShellTemplate, { data: onDefaultBranchData }),
61
- };
62
26
  export const LongPath = {
63
27
  render: () => (_jsx(DrawerTrigger, { data: {
64
- ...enrichedRepoData,
28
+ ...repoData,
65
29
  repositoryPath: '/home/user/projects/company/some-very-long-path/shep-ai/cli',
66
30
  }, label: "Open Long Path" })),
67
31
  };
68
32
  export const WithoutPath = {
69
33
  render: () => (_jsx(DrawerTrigger, { data: { ...repoData, repositoryPath: undefined }, label: "Open Without Path" })),
70
34
  };
35
+ /* ---------------------------------------------------------------------------
36
+ * Shell template — full page context, starts open (matches ReviewDrawerShell pattern)
37
+ * ------------------------------------------------------------------------- */
38
+ function RepositoryDrawerShellTemplate({ data }) {
39
+ const [selected, setSelected] = useState(data);
40
+ return (_jsxs("div", { style: { height: '100vh', background: '#f8fafc', padding: '2rem' }, children: [_jsx("button", { type: "button", onClick: () => setSelected(data), style: { padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }, children: "Open Drawer" }), _jsx(RepositoryDrawer, { data: selected, onClose: () => setSelected(null) })] }));
41
+ }
71
42
  /** Repository drawer rendered inside a full-page context — starts open. */
72
43
  export const InDrawer = {
73
- render: () => _jsx(RepositoryDrawerShellTemplate, { data: enrichedRepoData }),
44
+ render: () => _jsx(RepositoryDrawerShellTemplate, { data: repoData }),
74
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAmBpF,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,wBAAgB,2BAA2B,CAAC,EAAE,aAAa,EAAE,EAAE,gCAAgC,2CAkJ9F"}
1
+ {"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAmBpF,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,wBAAgB,2BAA2B,CAAC,EAAE,aAAa,EAAE,EAAE,gCAAgC,2CAsH9F"}
@@ -25,8 +25,6 @@ const PR_EVENT_TOGGLES = [
25
25
  ];
26
26
  export function NotificationSettingsSection({ notifications }) {
27
27
  const [inApp, setInApp] = useState(notifications.inApp.enabled);
28
- const [browser, setBrowser] = useState(notifications.browser.enabled);
29
- const [desktop, setDesktop] = useState(notifications.desktop.enabled);
30
28
  const [events, setEvents] = useState({ ...notifications.events });
31
29
  const [isPending, startTransition] = useTransition();
32
30
  const [showSaved, setShowSaved] = useState(false);
@@ -51,20 +49,18 @@ export function NotificationSettingsSection({ notifications }) {
51
49
  return {
52
50
  notifications: {
53
51
  inApp: { enabled: overrides.inApp ?? inApp },
54
- browser: { enabled: overrides.browser ?? browser },
55
- desktop: { enabled: overrides.desktop ?? desktop },
56
52
  events: overrides.events ?? events,
57
53
  },
58
54
  };
59
55
  }
60
- function handleChannelChange(channel, setter, value) {
61
- setter(value);
62
- save(buildFullPayload({ [channel]: value }));
56
+ function handleInAppChange(value) {
57
+ setInApp(value);
58
+ save(buildFullPayload({ inApp: value }));
63
59
  }
64
60
  function handleEventChange(key, value) {
65
61
  const newEvents = { ...events, [key]: value };
66
62
  setEvents(newEvents);
67
63
  save(buildFullPayload({ events: newEvents }));
68
64
  }
69
- return (_jsxs(Card, { id: "notifications", className: "scroll-mt-6", "data-testid": "notification-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Bell, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Notifications" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure notification channels and event preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Channels" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-in-app", children: "In-App" }), _jsx(Switch, { id: "notif-in-app", "data-testid": "switch-in-app", checked: inApp, onCheckedChange: (v) => handleChannelChange('inApp', setInApp, v) })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-browser", children: "Browser" }), _jsx(Switch, { id: "notif-browser", "data-testid": "switch-browser", checked: browser, onCheckedChange: (v) => handleChannelChange('browser', setBrowser, v) })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-desktop", children: "Desktop" }), _jsx(Switch, { id: "notif-desktop", "data-testid": "switch-desktop", checked: desktop, onCheckedChange: (v) => handleChannelChange('desktop', setDesktop, v) })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Agent Events" }), AGENT_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "PR Events" }), PR_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] })] })] }));
65
+ return (_jsxs(Card, { id: "notifications", className: "scroll-mt-6", "data-testid": "notification-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Bell, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Notifications" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure notification channels and event preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Channels" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-in-app", children: "In-App" }), _jsx(Switch, { id: "notif-in-app", "data-testid": "switch-in-app", checked: inApp, onCheckedChange: handleInAppChange })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Agent Events" }), AGENT_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "PR Events" }), PR_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] })] })] }));
70
66
  }
@@ -38,7 +38,7 @@ export const Default = {
38
38
  args: {
39
39
  notifications: {
40
40
  inApp: { enabled: true },
41
- browser: { enabled: true },
41
+ browser: { enabled: false },
42
42
  desktop: { enabled: false },
43
43
  events: allEvents,
44
44
  },
@@ -48,8 +48,8 @@ export const AllEnabled = {
48
48
  args: {
49
49
  notifications: {
50
50
  inApp: { enabled: true },
51
- browser: { enabled: true },
52
- desktop: { enabled: true },
51
+ browser: { enabled: false },
52
+ desktop: { enabled: false },
53
53
  events: allEvents,
54
54
  },
55
55
  },
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAgC/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAyqCzB"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA2B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAulCzB"}
@@ -1,24 +1,17 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useTransition, useRef, useEffect, useCallback } from 'react';
4
- import { Eye, EyeOff, Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Minus, Plus, ExternalLink, Settings2, Timer, } from 'lucide-react';
4
+ import { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Minus, Plus, ExternalLink, Settings2, Timer, } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
6
  import { cn } from '../../../lib/utils.js';
7
7
  import { Label } from '../../ui/label.js';
8
- import { Input } from '../../ui/input.js';
9
- import { Button } from '../../ui/button.js';
10
8
  import { Switch } from '../../ui/switch.js';
11
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
12
9
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
13
10
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
14
- import { AgentAuthMethod, EditorType, TerminalType, } from '../../../../../../packages/core/src/domain/generated/output.js';
11
+ import { EditorType, TerminalType } from '../../../../../../packages/core/src/domain/generated/output.js';
15
12
  import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
16
13
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
17
14
  import { TimeoutSlider } from '../../features/settings/timeout-slider.js';
18
- const AUTH_METHOD_OPTIONS = [
19
- { value: AgentAuthMethod.Session, label: 'Session' },
20
- { value: AgentAuthMethod.Token, label: 'Token' },
21
- ];
22
15
  const EDITOR_OPTIONS = [
23
16
  { value: EditorType.VsCode, label: 'VS Code' },
24
17
  { value: EditorType.Cursor, label: 'Cursor' },
@@ -125,9 +118,6 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
125
118
  const featureFlags = settings.featureFlags ?? { skills: false, envDeploy: false, debug: false };
126
119
  // Agent state
127
120
  const [agentType, setAgentType] = useState(settings.agent.type);
128
- const authMethod = settings.agent.authMethod;
129
- const [token, setToken] = useState(settings.agent.token ?? '');
130
- const [showToken, setShowToken] = useState(false);
131
121
  // Environment state
132
122
  const [editor, setEditor] = useState(settings.environment.defaultEditor);
133
123
  const [shell, setShell] = useState(settings.environment.shellPreference);
@@ -167,8 +157,6 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
167
157
  const [analyzeRepoTimeout, setAnalyzeRepoTimeout] = useState(String(Math.round((analyzeRepoConfig?.analyzeMs ?? 600_000) / 1000)));
168
158
  // Notification state
169
159
  const [inApp, setInApp] = useState(settings.notifications.inApp.enabled);
170
- const [browser, setBrowser] = useState(settings.notifications.browser.enabled);
171
- const [desktop, setDesktop] = useState(settings.notifications.desktop.enabled);
172
160
  const [events, setEvents] = useState({ ...settings.notifications.events });
173
161
  // Feature flags state
174
162
  const [flags, setFlags] = useState({ ...featureFlags });
@@ -208,15 +196,6 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
208
196
  const n = parseInt(value, 10);
209
197
  return Number.isNaN(n) || n <= 0 ? undefined : n;
210
198
  }
211
- // Agent helpers
212
- function buildAgentPayload(overrides = {}) {
213
- const merged = { type: agentType, authMethod, ...overrides };
214
- const result = { type: merged.type, authMethod: merged.authMethod };
215
- if (merged.authMethod === AgentAuthMethod.Token) {
216
- result.token = overrides.token ?? token;
217
- }
218
- return { agent: result };
219
- }
220
199
  function secondsToMs(val) {
221
200
  if (val === undefined)
222
201
  return undefined;
@@ -261,8 +240,6 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
261
240
  return {
262
241
  notifications: {
263
242
  inApp: { enabled: overrides.inApp ?? inApp },
264
- browser: { enabled: overrides.browser ?? browser },
265
- desktop: { enabled: overrides.desktop ?? desktop },
266
243
  events: overrides.events ?? events,
267
244
  },
268
245
  };
@@ -301,11 +278,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
301
278
  return (_jsxs("button", { type: "button", onClick: () => scrollToSection(s.id), className: cn('flex cursor-pointer items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-all', isActive
302
279
  ? 'bg-accent text-foreground font-medium'
303
280
  : 'text-muted-foreground/60 hover:text-foreground hover:bg-accent/50'), children: [_jsx(SectionIcon, { className: "h-3 w-3" }), _jsx("span", { className: "hidden sm:inline", children: s.label })] }, s.id));
304
- }) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bot, title: "Agent", description: "AI coding agent and authentication", testId: "agent-settings-section", children: [_jsx(SettingsRow, { label: "Agent & Model", description: "Provider and model for all operations", htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }), _jsx(SettingsRow, { label: "Authentication", description: "How the agent authenticates", htmlFor: "auth-method", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("div", { children: _jsxs(Select, { value: authMethod, disabled: true, children: [_jsx(SelectTrigger, { id: "auth-method", "data-testid": "auth-method-select", className: "w-55 cursor-not-allowed text-xs opacity-60", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: AUTH_METHOD_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }) }), _jsx(TooltipContent, { children: "Coming soon" })] }) }) }), authMethod === AgentAuthMethod.Token && (_jsx(SettingsRow, { label: "API Token", htmlFor: "agent-token", children: _jsxs("div", { className: "relative w-45", children: [_jsx(Input, { id: "agent-token", "data-testid": "agent-token-input", type: showToken ? 'text' : 'password', value: token, onChange: (e) => setToken(e.target.value), onBlur: () => {
305
- if (token !== (settings.agent.token ?? '')) {
306
- save(buildAgentPayload({ token }));
307
- }
308
- }, placeholder: "Enter token", className: "pr-8" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "absolute top-0 right-0 h-full px-2 hover:bg-transparent", onClick: () => setShowToken(!showToken), "data-testid": "toggle-token-visibility", "aria-label": showToken ? 'Hide token' : 'Show token', children: showToken ? _jsx(EyeOff, { className: "h-3 w-3" }) : _jsx(Eye, { className: "h-3 w-3" }) })] }) }))] }), _jsx(SectionHint, { links: [
281
+ }) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Bot, title: "Agent", description: "AI coding agent and authentication", testId: "agent-settings-section", children: _jsx(SettingsRow, { label: "Agent & Model", description: "Provider and model for all operations", htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }) }), _jsx(SectionHint, { links: [
309
282
  {
310
283
  label: 'Agent system',
311
284
  href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/agent-system.md',
@@ -443,12 +416,6 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
443
416
  }, defaultSeconds: 600 }) })] }), _jsx(SectionHint, { children: "Each agent has independently configurable stage timeouts. When a stage exceeds its timeout, the agent is terminated. Longer timeouts are useful for complex implementations. Feature agent defaults to 30 minutes per stage. Analyze repository agent defaults to 10 minutes." })] }), _jsxs("div", { id: "section-notifications", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bell, title: "Notifications", description: "How and when you get notified", testId: "notification-settings-section", children: [_jsx(SubsectionLabel, { children: "Channels" }), _jsx(SwitchRow, { label: "In-app", description: "Notifications inside the Shep UI", id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
444
417
  setInApp(v);
445
418
  save(buildNotificationPayload({ inApp: v }));
446
- } }), _jsx(SwitchRow, { label: "Browser", description: "Push notifications via the browser", id: "notif-browser", testId: "switch-browser", checked: browser, onChange: (v) => {
447
- setBrowser(v);
448
- save(buildNotificationPayload({ browser: v }));
449
- } }), _jsx(SwitchRow, { label: "Desktop", description: "Native OS notifications", id: "notif-desktop", testId: "switch-desktop", checked: desktop, onChange: (v) => {
450
- setDesktop(v);
451
- save(buildNotificationPayload({ desktop: v }));
452
419
  } }), _jsx(SubsectionLabel, { children: "Agent Events" }), _jsx(SwitchRow, { label: "Agent started", id: "notif-event-agentStarted", testId: "switch-event-agentStarted", checked: events.agentStarted, onChange: (v) => {
453
420
  const newEvents = { ...events, agentStarted: v };
454
421
  setEvents(newEvents);
@@ -485,12 +452,20 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
485
452
  const newEvents = { ...events, prChecksFailed: v };
486
453
  setEvents(newEvents);
487
454
  save(buildNotificationPayload({ events: newEvents }));
455
+ } }), _jsx(SwitchRow, { label: "PR blocked", id: "notif-event-prBlocked", testId: "switch-event-prBlocked", checked: events.prBlocked, onChange: (v) => {
456
+ const newEvents = { ...events, prBlocked: v };
457
+ setEvents(newEvents);
458
+ save(buildNotificationPayload({ events: newEvents }));
459
+ } }), _jsx(SwitchRow, { label: "Merge review ready", id: "notif-event-mergeReviewReady", testId: "switch-event-mergeReviewReady", checked: events.mergeReviewReady, onChange: (v) => {
460
+ const newEvents = { ...events, mergeReviewReady: v };
461
+ setEvents(newEvents);
462
+ save(buildNotificationPayload({ events: newEvents }));
488
463
  } })] }), _jsx(SectionHint, { links: [
489
464
  {
490
465
  label: 'Notification system',
491
466
  href: 'https://github.com/shep-ai/cli/blob/main/specs/021-agent-notifications/spec.yaml',
492
467
  },
493
- ], children: "Three notification channels keep you in the loop: in-app toasts, browser push notifications, and native desktop alerts. Fine-tune which agent lifecycle events trigger a notification." })] }), _jsxs("div", { id: "section-feature-flags", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Flag, title: "Feature Flags", description: "Enable or disable experimental features", badge: "Experimental", testId: "feature-flags-settings-section", children: [_jsx(SwitchRow, { label: "Skills", description: "Enable the skills system for agent capabilities", id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
468
+ ], children: "In-app toast notifications keep you in the loop. Fine-tune which agent lifecycle events trigger a notification." })] }), _jsxs("div", { id: "section-feature-flags", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Flag, title: "Feature Flags", description: "Enable or disable experimental features", badge: "Experimental", testId: "feature-flags-settings-section", children: [_jsx(SwitchRow, { label: "Skills", description: "Enable the skills system for agent capabilities", id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
494
469
  const newFlags = { ...flags, skills: v };
495
470
  setFlags(newFlags);
496
471
  save({ featureFlags: newFlags });
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAkBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAsB5B,CAAC"}
1
+ {"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAiBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAsB5B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { SettingsPageClient } from './settings-page-client.js';
2
2
  import { createDefaultSettings } from '../../../../../../packages/core/src/domain/factories/settings-defaults.factory.js';
3
- import { AgentType, AgentAuthMethod } from '../../../../../../packages/core/src/domain/generated/output.js';
3
+ import { AgentType } from '../../../../../../packages/core/src/domain/generated/output.js';
4
4
  const defaultSettings = createDefaultSettings();
5
5
  const meta = {
6
6
  title: 'Features/Settings/SettingsPageClient',
@@ -23,9 +23,8 @@ export const AllSections = {
23
23
  settings: {
24
24
  ...defaultSettings,
25
25
  agent: {
26
+ ...defaultSettings.agent,
26
27
  type: AgentType.GeminiCli,
27
- authMethod: AgentAuthMethod.Token,
28
- token: 'sk-test-token-12345',
29
28
  },
30
29
  featureFlags: {
31
30
  skills: true,