@shepai/cli 1.138.0 → 1.139.0

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 (151) hide show
  1. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +8 -6
  3. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +2 -0
  4. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +61 -1
  6. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +0 -10
  7. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +273 -166
  9. package/dist/tsconfig.build.tsbuildinfo +1 -1
  10. package/package.json +1 -1
  11. package/web/.next/BUILD_ID +1 -1
  12. package/web/.next/build-manifest.json +2 -2
  13. package/web/.next/fallback-build-manifest.json +2 -2
  14. package/web/.next/prerender-manifest.json +3 -3
  15. package/web/.next/required-server-files.js +2 -2
  16. package/web/.next/required-server-files.json +2 -2
  17. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  18. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  21. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  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 +26 -26
  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 +28 -28
  33. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  42. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  45. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/_global-error.html +2 -2
  48. package/web/.next/server/app/_global-error.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  54. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  55. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  57. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  58. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  60. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  62. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  64. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  66. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  67. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  68. package/web/.next/server/chunks/ssr/[root-of-the-server]__2c703b78._.js +1 -1
  69. package/web/.next/server/chunks/ssr/[root-of-the-server]__2c703b78._.js.map +1 -1
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__59a3897b._.js +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__59a3897b._.js.map +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__78aecdd5._.js +1 -1
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__78aecdd5._.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__f222995d._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__f222995d._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  88. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  90. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  92. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  94. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  96. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  98. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  100. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/{_1c296899._.js → _a3a344a8._.js} +2 -2
  102. package/web/.next/server/chunks/ssr/{_1c296899._.js.map → _a3a344a8._.js.map} +1 -1
  103. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  104. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  106. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  108. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/_ebd0ef7f._.js +3 -0
  110. package/web/.next/server/chunks/ssr/{_2119691d._.js.map → _ebd0ef7f._.js.map} +1 -1
  111. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  112. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  114. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web_582e5037._.js +3 -0
  116. package/web/.next/server/chunks/ssr/{src_presentation_web_844c9657._.js.map → src_presentation_web_582e5037._.js.map} +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  123. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  125. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  126. package/web/.next/server/pages/500.html +2 -2
  127. package/web/.next/server/server-reference-manifest.js +1 -1
  128. package/web/.next/server/server-reference-manifest.json +44 -44
  129. package/web/.next/static/chunks/{6c097d096a289e07.js → 13451dd1c5eb854a.js} +1 -1
  130. package/web/.next/static/chunks/{ec01c627aae92366.js → 1a46d832fb5dbb4d.js} +1 -1
  131. package/web/.next/static/chunks/{a2a9cfdc7ff45d62.js → 26f8c1dc8e8d3a85.js} +1 -1
  132. package/web/.next/static/chunks/284bdcf374b23190.js +1 -0
  133. package/web/.next/static/chunks/{c581e1010c5c217e.js → 2a318598dee02204.js} +1 -1
  134. package/web/.next/static/chunks/4d521e80c86070db.js +1 -0
  135. package/web/.next/static/chunks/{4c760047d0972f96.js → 5aac1b0e10edc3d4.js} +2 -2
  136. package/web/.next/static/chunks/7d4461c2f06d2cb9.js +1 -0
  137. package/web/.next/static/chunks/{ad74ee85368e7d04.js → 9d59552a1eb58b20.js} +1 -1
  138. package/web/.next/static/chunks/{f15f1f16948e7263.js → add583b93a6e62ef.js} +1 -1
  139. package/web/.next/static/chunks/ba967f7de77cd5ee.css +1 -0
  140. package/web/.next/static/chunks/c4c3d56eac00b6a3.js +2 -0
  141. package/web/.next/static/chunks/{2e9491b73bcb5948.js → d14b401b9ac6b439.js} +1 -1
  142. package/web/.next/server/chunks/ssr/_2119691d._.js +0 -3
  143. package/web/.next/server/chunks/ssr/src_presentation_web_844c9657._.js +0 -3
  144. package/web/.next/static/chunks/0e9ca746aadf6c8d.js +0 -1
  145. package/web/.next/static/chunks/3722a9f53d9069d1.js +0 -2
  146. package/web/.next/static/chunks/47ae402c9d3ad1ca.js +0 -1
  147. package/web/.next/static/chunks/ce8197531c98b4ea.js +0 -1
  148. package/web/.next/static/chunks/eb35e98c31806836.css +0 -1
  149. /package/web/.next/static/{0zlf5ntHpnR5YfkgEsA-1 → dDoTmkPtcr9knH6GiOhGo}/_buildManifest.js +0 -0
  150. /package/web/.next/static/{0zlf5ntHpnR5YfkgEsA-1 → dDoTmkPtcr9knH6GiOhGo}/_clientMiddlewareManifest.json +0 -0
  151. /package/web/.next/static/{0zlf5ntHpnR5YfkgEsA-1 → dDoTmkPtcr9knH6GiOhGo}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA4CnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CA+bA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA4CnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAgcA"}
@@ -4,6 +4,7 @@ import { useState } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
5
  import { Plus, Trash2, Zap, Loader2, Globe, RotateCcw, Play, Eye, Archive, ArchiveRestore, } from 'lucide-react';
6
6
  import { cn } from '../../../lib/utils.js';
7
+ import { Button } from '../../ui/button.js';
7
8
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
8
9
  import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '../../ui/alert-dialog.js';
9
10
  import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
@@ -75,7 +76,8 @@ export function FeatureNode({ data, selected, }) {
75
76
  data.state !== 'archived' ? (_jsx(AlertDialog, { open: archiveConfirmOpen, onOpenChange: setArchiveConfirmOpen, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Archive feature?" }), _jsxs(AlertDialogDescription, { children: [_jsx("strong", { children: data.name }), " will be hidden from the canvas. You can unarchive it later to restore it."] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { onClick: () => setArchiveConfirmOpen(false), children: "Cancel" }), _jsx(AlertDialogAction, { onClick: () => {
76
77
  setArchiveConfirmOpen(false);
77
78
  data.onArchive?.(data.featureId);
78
- }, children: "Archive" })] })] }) })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm dark:bg-neutral-800/80', data.state === 'action-required' && 'border-amber-300/60 dark:border-amber-700/40', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "bottom", className: "max-w-56 bg-white text-neutral-900 shadow-lg dark:bg-neutral-100 dark:text-neutral-900", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : null, !config.showProgressBar &&
79
+ }, children: "Archive" })] })] }) })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm dark:bg-neutral-800/80', data.state === 'action-required' &&
80
+ 'border-l-[3px] border-l-rose-400 dark:border-l-amber-500', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "bottom", className: "max-w-56 bg-white text-neutral-900 shadow-lg dark:bg-neutral-100 dark:text-neutral-900 [&_svg]:!bg-white [&_svg]:!fill-white dark:[&_svg]:!bg-neutral-100 dark:[&_svg]:!fill-neutral-100", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5 pr-24", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : null, !config.showProgressBar &&
79
81
  ![
80
82
  'deleting',
81
83
  'creating',
@@ -102,21 +104,21 @@ export function FeatureNode({ data, selected, }) {
102
104
  ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
103
105
  : 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3 w-3 text-green-600" })) }) }), _jsx(TooltipContent, { side: "top", children: data.deployment.status === DeploymentState.Booting
104
106
  ? 'Deploying...'
105
- : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs("button", { type: "button", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
107
+ : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs(Button, { variant: "default", size: "xs", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
106
108
  // eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
107
- onClick: () => { }, className: "nodrag relative inline-flex shrink-0 cursor-pointer items-center gap-1.5 overflow-hidden rounded-md bg-gradient-to-b from-neutral-800 via-neutral-900 to-neutral-950 px-3 py-1.5 text-[11px] font-semibold transition-all hover:from-neutral-700 hover:via-neutral-800 hover:to-neutral-900 active:from-neutral-900 active:to-black", children: [_jsx("span", { className: "animate-shimmer pointer-events-none absolute inset-0 bg-gradient-to-r from-transparent via-white/15 to-transparent bg-[length:200%_100%]" }), _jsx(Eye, { className: "relative h-3 w-3 text-amber-400" }), _jsx("span", { className: "animate-shimmer relative bg-gradient-to-r from-amber-400 via-yellow-200 to-amber-400 bg-[length:200%_100%] bg-clip-text text-transparent", children: getActionRequiredLabel(data) })] })) : data.state === 'error' && data.onRetry ? (_jsxs("button", { type: "button", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
109
+ onClick: () => { }, className: "nodrag dark:bg-primary dark:text-primary-foreground dark:hover:bg-primary/90 cursor-pointer bg-neutral-900 text-[11px] text-white hover:bg-neutral-800", children: [_jsx(Eye, { className: "h-3 w-3" }), getActionRequiredLabel(data)] })) : data.state === 'error' && data.onRetry ? (_jsxs(Button, { variant: "outline", size: "xs", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
108
110
  e.stopPropagation();
109
111
  data.onRetry(data.featureId);
110
- }, className: "nodrag inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-md bg-neutral-800 px-2.5 py-1 text-[11px] font-medium text-white shadow-sm transition-all hover:bg-neutral-700 active:bg-neutral-900 dark:bg-neutral-200 dark:text-neutral-900 dark:hover:bg-neutral-300", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : data.state === 'blocked' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
112
+ }, className: "nodrag cursor-pointer text-[11px] font-medium", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : data.state === 'blocked' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
111
113
  const BadgeIcon = getBadgeIcon(data);
112
114
  return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
113
115
  })(), _jsx("span", { className: cn('truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'done' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
114
116
  const BadgeIcon = getBadgeIcon(data);
115
117
  return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
116
- })(), _jsx("span", { className: cn('text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'pending' && data.onStart ? (_jsxs("button", { type: "button", "aria-label": "Start", "data-testid": "feature-node-start-button", onClick: (e) => {
118
+ })(), _jsx("span", { className: cn('text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'pending' && data.onStart ? (_jsxs(Button, { variant: "outline", size: "xs", "aria-label": "Start", "data-testid": "feature-node-start-button", onClick: (e) => {
117
119
  e.stopPropagation();
118
120
  data.onStart(data.featureId);
119
- }, className: "nodrag inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-md bg-neutral-800 px-2.5 py-1 text-[11px] font-medium text-white shadow-sm transition-all hover:bg-neutral-700 active:bg-neutral-900 dark:bg-neutral-200 dark:text-neutral-900 dark:hover:bg-neutral-300", children: [_jsx(Play, { className: "h-3 w-3" }), "Start"] })) : null] })] })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", style: { top: 70 }, children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
121
+ }, className: "nodrag cursor-pointer text-[11px] font-medium", children: [_jsx(Play, { className: "h-3 w-3" }), "Start"] })) : null] })] })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", style: { top: 70 }, children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
120
122
  e.stopPropagation();
121
123
  data.onAction?.();
122
124
  }, className: "nodrag absolute top-1/2 left-1/2 flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-blue-500 text-white opacity-0 shadow-md transition-opacity group-hover:opacity-100 hover:bg-blue-600", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) })) : data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: false, className: "opacity-0!", style: { top: 70 } })) : null] }));
@@ -31,4 +31,6 @@ export declare const ArchivedWithUnarchive: Story;
31
31
  export declare const DoneWithArchive: Story;
32
32
  /** Shows the archive confirmation dialog in its open state. */
33
33
  export declare const ArchiveConfirmationDialog: Story;
34
+ /** Side-by-side comparison of 10 highlight color options for action-required cards. */
35
+ export declare const HighlightColorExploration: Story;
34
36
  //# sourceMappingURL=feature-node.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAoCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAqB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA+LF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAWnC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,EAAE,KAyBvC,CAAC"}
1
+ {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAoCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAqB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA+LF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAWnC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,EAAE,KAyBvC,CAAC;AA0DF,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,EAAE,KAoCvC,CAAC"}
@@ -1,7 +1,8 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useMemo } from 'react';
3
3
  import { expect, fn, userEvent, waitFor, within } from '@storybook/test';
4
4
  import { ReactFlowProvider, ReactFlow, useNodesState } from '@xyflow/react';
5
+ import { Eye } from 'lucide-react';
5
6
  import { DeploymentState, PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
6
7
  import { FeatureNode } from './feature-node.js';
7
8
  const nodeTypes = { featureNode: FeatureNode };
@@ -668,3 +669,62 @@ export const ArchiveConfirmationDialog = {
668
669
  });
669
670
  },
670
671
  };
672
+ // ---------------------------------------------------------------------------
673
+ // Highlight color exploration — 10 candidate colors for action-required cards
674
+ // ---------------------------------------------------------------------------
675
+ const highlightColors = [
676
+ {
677
+ label: '1. Yellow (current)',
678
+ card: 'bg-[#fffef8]',
679
+ btn: 'bg-amber-50 text-amber-700 hover:bg-amber-100',
680
+ },
681
+ {
682
+ label: '2. Warm Peach',
683
+ card: 'bg-[#fff8f5]',
684
+ btn: 'bg-orange-50 text-orange-700 hover:bg-orange-100',
685
+ },
686
+ {
687
+ label: '3. Soft Rose',
688
+ card: 'bg-[#fff5f7]',
689
+ btn: 'bg-rose-50 text-rose-700 hover:bg-rose-100',
690
+ },
691
+ {
692
+ label: '4. Lavender',
693
+ card: 'bg-[#f8f5ff]',
694
+ btn: 'bg-violet-50 text-violet-700 hover:bg-violet-100',
695
+ },
696
+ {
697
+ label: '5. Ice Blue',
698
+ card: 'bg-[#f5f8ff]',
699
+ btn: 'bg-blue-50 text-blue-700 hover:bg-blue-100',
700
+ },
701
+ {
702
+ label: '6. Sky',
703
+ card: 'bg-[#f2f9ff]',
704
+ btn: 'bg-sky-50 text-sky-700 hover:bg-sky-100',
705
+ },
706
+ {
707
+ label: '7. Mint',
708
+ card: 'bg-[#f2fdf6]',
709
+ btn: 'bg-emerald-50 text-emerald-700 hover:bg-emerald-100',
710
+ },
711
+ {
712
+ label: '8. Teal',
713
+ card: 'bg-[#f0fdfa]',
714
+ btn: 'bg-teal-50 text-teal-700 hover:bg-teal-100',
715
+ },
716
+ {
717
+ label: '9. Neutral Warm',
718
+ card: 'bg-[#fdfcfa]',
719
+ btn: 'bg-stone-100 text-stone-700 hover:bg-stone-200',
720
+ },
721
+ {
722
+ label: '10. Pink',
723
+ card: 'bg-[#fef5ff]',
724
+ btn: 'bg-fuchsia-50 text-fuchsia-700 hover:bg-fuchsia-100',
725
+ },
726
+ ];
727
+ /** Side-by-side comparison of 10 highlight color options for action-required cards. */
728
+ export const HighlightColorExploration = {
729
+ render: () => (_jsx("div", { className: "flex flex-wrap gap-6 p-4", children: highlightColors.map(({ label, card, btn }) => (_jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsxs("div", { className: `${card} flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm`, children: [_jsx("div", { className: "flex items-center gap-1.5", children: _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: "Rate Limiter" }) }), _jsx("p", { className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: "Sliding window \u2014 awaiting merge approval" }), _jsx("div", { className: "mt-auto pt-2", children: _jsxs("div", { className: "mt-1.5 flex min-h-[26px] items-center justify-between gap-2", children: [_jsx("div", { className: "flex items-center gap-1.5", style: { transform: 'translateY(1px)' }, children: _jsxs("div", { className: "flex items-baseline gap-1", children: [_jsx("span", { className: "text-muted-foreground/50 text-[10px]", children: "ID" }), _jsx("span", { className: "text-muted-foreground/60 font-mono text-[10px]", children: "3b5d7f" })] }) }), _jsxs("button", { className: `${btn} inline-flex shrink-0 items-center gap-1 rounded-md border-0 px-2 py-1 text-[11px] font-normal shadow-none`, children: [_jsx(Eye, { className: "h-3 w-3" }), "Review Changes"] })] }) })] })] }, label))) })),
730
+ };
@@ -5,16 +5,6 @@ export default meta;
5
5
  type Story = StoryObj<typeof meta>;
6
6
  export declare const Empty: Story;
7
7
  export declare const WithFeatures: Story;
8
- export declare const WithToolbar: Story;
9
- export declare const WithNodeActions: Story;
10
- /**
11
- * Dagre auto-layout story — two repositories with interconnected feature trees.
12
- *
13
- * Demonstrates the Vertical / Horizontal toolbar buttons that re-layout the graph.
14
- * Initial layout is LR (horizontal). Click "Vertical" to switch to TB, or
15
- * "Horizontal" to switch back.
16
- */
17
- export declare const DagreLayout: Story;
18
8
  /**
19
9
  * Canvas with active and archived features.
20
10
  * The archive toggle button appears in the top-right corner ("Show archived").
@@ -1 +1 @@
1
- {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAkBpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0EnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAiIF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AA4DF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KASlC,CAAC"}
1
+ {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAejD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAoBpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAyVnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAK1B,CAAC;AA4DF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KASlC,CAAC"}