@shepai/cli 1.162.0-pr509.4102877 → 1.163.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 (347) hide show
  1. package/apis/json-schema/FabLayoutConfig.yaml +11 -0
  2. package/apis/json-schema/Settings.yaml +3 -0
  3. package/apis/json-schema/WorkflowConfig.yaml +0 -3
  4. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +20 -0
  5. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -2
  7. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +1 -3
  9. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +3 -16
  11. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +0 -2
  12. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  13. package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts +13 -0
  14. package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts.map +1 -0
  15. package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js +35 -0
  16. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  17. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -30
  18. package/dist/packages/core/src/domain/generated/output.d.ts +13 -42
  19. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  20. package/dist/packages/core/src/domain/generated/output.js +0 -5
  21. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/di/container.js +5 -2
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -2
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +6 -24
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.d.ts +15 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.d.ts.map +1 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.js +20 -0
  29. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +2 -1
  30. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +20 -0
  32. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  33. package/dist/src/presentation/cli/commands/feat/new.command.js +0 -3
  34. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
  35. package/dist/src/presentation/cli/commands/repo/add.command.js +3 -1
  36. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +5 -2
  37. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
  38. package/dist/src/presentation/tui/wizards/github-import.wizard.js +38 -6
  39. package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts +6 -0
  40. package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts.map +1 -0
  41. package/dist/src/presentation/web/app/actions/list-github-organizations.js +17 -0
  42. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +1 -0
  43. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -1
  44. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  45. package/dist/src/presentation/web/app/layout.js +3 -1
  46. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +8 -1
  47. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +37 -7
  49. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +1 -0
  50. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +35 -0
  52. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +22 -2
  54. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +15 -1
  56. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  57. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +9 -2
  58. package/dist/src/presentation/web/hooks/fab-layout-context.d.ts +18 -0
  59. package/dist/src/presentation/web/hooks/fab-layout-context.d.ts.map +1 -0
  60. package/dist/src/presentation/web/hooks/fab-layout-context.js +19 -0
  61. package/dist/src/presentation/web/lib/fab-layout.d.ts +11 -0
  62. package/dist/src/presentation/web/lib/fab-layout.d.ts.map +1 -0
  63. package/dist/src/presentation/web/lib/fab-layout.js +21 -0
  64. package/dist/translations/ar/cli.json +0 -2
  65. package/dist/translations/ar/web.json +8 -0
  66. package/dist/translations/de/cli.json +0 -2
  67. package/dist/translations/de/web.json +8 -0
  68. package/dist/translations/en/cli.json +0 -2
  69. package/dist/translations/en/web.json +8 -0
  70. package/dist/translations/es/cli.json +0 -2
  71. package/dist/translations/es/web.json +8 -0
  72. package/dist/translations/fr/cli.json +0 -2
  73. package/dist/translations/fr/web.json +8 -0
  74. package/dist/translations/he/cli.json +0 -2
  75. package/dist/translations/he/web.json +8 -0
  76. package/dist/translations/pt/cli.json +0 -2
  77. package/dist/translations/pt/web.json +8 -0
  78. package/dist/translations/ru/cli.json +0 -2
  79. package/dist/translations/ru/web.json +8 -0
  80. package/dist/tsconfig.build.tsbuildinfo +1 -1
  81. package/package.json +1 -1
  82. package/web/.next/BUILD_ID +1 -1
  83. package/web/.next/build-manifest.json +2 -2
  84. package/web/.next/fallback-build-manifest.json +2 -2
  85. package/web/.next/prerender-manifest.json +3 -3
  86. package/web/.next/required-server-files.js +2 -2
  87. package/web/.next/required-server-files.json +2 -2
  88. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +71 -56
  89. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  90. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +67 -52
  93. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +2 -2
  94. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +73 -58
  97. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  98. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
  101. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  102. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +87 -72
  105. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  106. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  109. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +2 -2
  110. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  113. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  114. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +67 -52
  117. package/web/.next/server/app/(dashboard)/chat/page.js +2 -2
  118. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +73 -58
  121. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  122. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  123. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
  125. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  126. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +87 -72
  129. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  130. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +67 -52
  133. package/web/.next/server/app/(dashboard)/page.js +2 -2
  134. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  135. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  137. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +2 -2
  138. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  141. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  142. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  143. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/_global-error.html +2 -2
  145. package/web/.next/server/app/_global-error.rsc +1 -1
  146. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  147. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  148. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  149. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  150. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  151. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +25 -10
  152. package/web/.next/server/app/_not-found/page.js +2 -2
  153. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  154. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  156. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  157. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  158. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  159. package/web/.next/server/app/settings/page/server-reference-manifest.json +31 -16
  160. package/web/.next/server/app/settings/page.js +2 -2
  161. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  162. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  163. package/web/.next/server/app/skills/page/server-reference-manifest.json +35 -20
  164. package/web/.next/server/app/skills/page.js +2 -2
  165. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  166. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app/tools/page/server-reference-manifest.json +35 -20
  168. package/web/.next/server/app/tools/page.js +2 -2
  169. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  170. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/version/page/server-reference-manifest.json +25 -10
  172. package/web/.next/server/app/version/page.js +2 -2
  173. package/web/.next/server/app/version/page.js.nft.json +1 -1
  174. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  176. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +1 -1
  177. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
  178. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  179. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  181. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  183. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js +4 -0
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +4 -0
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js +4 -0
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js.map +1 -0
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +4 -0
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -0
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js +4 -0
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js.map +1 -0
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +1 -1
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js +4 -0
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js.map +1 -0
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +4 -0
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -0
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js +4 -0
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js.map +1 -0
  203. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
  204. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js +3 -0
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/{_9495d50b._.js → _0727935d._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/{_9495d50b._.js.map → _0727935d._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/_075fae20._.js +4 -0
  212. package/web/.next/server/chunks/ssr/_075fae20._.js.map +1 -0
  213. package/web/.next/server/chunks/ssr/_0dc06d07._.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/_125c55af._.js +4 -0
  215. package/web/.next/server/chunks/ssr/_125c55af._.js.map +1 -0
  216. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/{_bcaea66b._.js → _1879404a._.js} +2 -2
  219. package/web/.next/server/chunks/ssr/_1879404a._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/{_b9ba2473._.js → _1e08a336._.js} +2 -2
  221. package/web/.next/server/chunks/ssr/_1e08a336._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/_22e00a14._.js +4 -0
  223. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -0
  224. package/web/.next/server/chunks/ssr/_391e499a._.js +3 -0
  225. package/web/.next/server/chunks/ssr/_391e499a._.js.map +1 -0
  226. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  228. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/_628621c7._.js +4 -0
  230. package/web/.next/server/chunks/ssr/_628621c7._.js.map +1 -0
  231. package/web/.next/server/chunks/ssr/_68996e5b._.js +3 -0
  232. package/web/.next/server/chunks/ssr/_68996e5b._.js.map +1 -0
  233. package/web/.next/server/chunks/ssr/_9412b27f._.js +4 -0
  234. package/web/.next/server/chunks/ssr/_9412b27f._.js.map +1 -0
  235. package/web/.next/server/chunks/ssr/_a5a5901d._.js +4 -0
  236. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -0
  237. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  238. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
  239. package/web/.next/server/chunks/ssr/{_bf5fb52d._.js → _b881a389._.js} +2 -2
  240. package/web/.next/server/chunks/ssr/{_bf5fb52d._.js.map → _b881a389._.js.map} +1 -1
  241. package/web/.next/server/chunks/ssr/_c3f595c6._.js +4 -0
  242. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -0
  243. package/web/.next/server/chunks/ssr/{_1c309165._.js → _ce97386b._.js} +2 -2
  244. package/web/.next/server/chunks/ssr/_ce97386b._.js.map +1 -0
  245. package/web/.next/server/chunks/ssr/{_83fcc008._.js → _def82237._.js} +2 -2
  246. package/web/.next/server/chunks/ssr/{_83fcc008._.js.map → _def82237._.js.map} +1 -1
  247. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +6 -0
  248. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -0
  249. package/web/.next/server/chunks/ssr/_f33cd07e._.js +6 -0
  250. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -0
  251. package/web/.next/server/chunks/ssr/_f8b45233._.js +4 -0
  252. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -0
  253. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  254. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  255. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  256. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  257. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  258. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  259. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  260. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +3 -0
  261. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js.map +1 -0
  262. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
  263. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
  264. package/web/.next/server/pages/500.html +2 -2
  265. package/web/.next/server/server-reference-manifest.js +1 -1
  266. package/web/.next/server/server-reference-manifest.json +636 -495
  267. package/web/.next/static/chunks/{12d5e55a38f12556.js → 0613d3829ce90fe9.js} +1 -1
  268. package/web/.next/static/chunks/{08c7087402abe8dc.js → 0d9e3aa7e10cf6e6.js} +2 -2
  269. package/web/.next/static/chunks/28ae5046faef6cec.js +1 -0
  270. package/web/.next/static/chunks/{36979e6fc9b5420a.js → 4581eaf51543601d.js} +1 -1
  271. package/web/.next/static/chunks/{c0317639cd5742f0.js → 5f40b5c4f859b573.js} +1 -1
  272. package/web/.next/static/chunks/{b641dd8f011c38d3.js → 780f688b8568331d.js} +2 -2
  273. package/web/.next/static/chunks/{86182e0294e048b3.js → 8b64414cdb4a4dc7.js} +1 -1
  274. package/web/.next/static/chunks/{7bad183aabd2ea36.js → bf55fb50a69f7350.js} +3 -3
  275. package/web/.next/static/chunks/{a8f13257c999eff1.js → c04ada25ace6f30c.js} +1 -1
  276. package/web/.next/static/chunks/c3a67566f78b5bc3.js +1 -0
  277. package/web/.next/static/chunks/ca8752df0e809c1b.js +7 -0
  278. package/web/.next/static/chunks/{20c33aaf58bbe8a9.js → d39ae882d080aa52.js} +1 -1
  279. package/web/.next/static/chunks/dbfbd9d9ee5eb2d0.js +1 -0
  280. package/web/.next/static/chunks/dc39dd4276779dec.js +1 -0
  281. package/web/.next/static/chunks/e779296e738a812b.css +1 -0
  282. package/apis/json-schema/SkillInjectionConfig.yaml +0 -17
  283. package/apis/json-schema/SkillSource.yaml +0 -21
  284. package/apis/json-schema/SkillSourceType.yaml +0 -7
  285. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts +0 -39
  286. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts.map +0 -1
  287. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.js +0 -8
  288. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-skill-injection-config.d.ts +0 -15
  289. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-skill-injection-config.d.ts.map +0 -1
  290. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-skill-injection-config.js +0 -23
  291. package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts +0 -26
  292. package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts.map +0 -1
  293. package/dist/packages/core/src/infrastructure/services/skill-injector.service.js +0 -201
  294. package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +0 -4
  295. package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js.map +0 -1
  296. package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +0 -4
  297. package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js.map +0 -1
  298. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +0 -4
  299. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +0 -1
  300. package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +0 -4
  301. package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js.map +0 -1
  302. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +0 -4
  303. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +0 -1
  304. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +0 -4
  305. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js.map +0 -1
  306. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +0 -4
  307. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +0 -1
  308. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +0 -4
  309. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +0 -1
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js +0 -3
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js.map +0 -1
  312. package/web/.next/server/chunks/ssr/_1c309165._.js.map +0 -1
  313. package/web/.next/server/chunks/ssr/_3a0b989f._.js +0 -6
  314. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +0 -1
  315. package/web/.next/server/chunks/ssr/_5f69c13f._.js +0 -4
  316. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +0 -1
  317. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +0 -4
  318. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +0 -1
  319. package/web/.next/server/chunks/ssr/_82c57f10._.js +0 -4
  320. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +0 -1
  321. package/web/.next/server/chunks/ssr/_8797d9db._.js +0 -3
  322. package/web/.next/server/chunks/ssr/_8797d9db._.js.map +0 -1
  323. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +0 -4
  324. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +0 -1
  325. package/web/.next/server/chunks/ssr/_b9ba2473._.js.map +0 -1
  326. package/web/.next/server/chunks/ssr/_bcaea66b._.js.map +0 -1
  327. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +0 -4
  328. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +0 -1
  329. package/web/.next/server/chunks/ssr/_cb5a021e._.js +0 -4
  330. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +0 -1
  331. package/web/.next/server/chunks/ssr/_d86175ae._.js +0 -4
  332. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +0 -1
  333. package/web/.next/server/chunks/ssr/_d8bedf13._.js +0 -4
  334. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +0 -1
  335. package/web/.next/server/chunks/ssr/_d90b0a06._.js +0 -3
  336. package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +0 -1
  337. package/web/.next/server/chunks/ssr/_fa7efce3._.js +0 -6
  338. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +0 -1
  339. package/web/.next/static/chunks/0eaa69a37f6c9e36.js +0 -7
  340. package/web/.next/static/chunks/4864ff06a738d58b.js +0 -1
  341. package/web/.next/static/chunks/63b4954715fc3423.js +0 -1
  342. package/web/.next/static/chunks/6b84fca3729b6688.js +0 -1
  343. package/web/.next/static/chunks/86c476f04ff32e7b.css +0 -1
  344. package/web/.next/static/chunks/b97ea1a9a5e986e9.js +0 -1
  345. /package/web/.next/static/{4ltYFSvrDIWJmAqKzeUt7 → qfCnoWSr4qmt2_dT28B-O}/_buildManifest.js +0 -0
  346. /package/web/.next/static/{4ltYFSvrDIWJmAqKzeUt7 → qfCnoWSr4qmt2_dT28B-O}/_clientMiddlewareManifest.json +0 -0
  347. /package/web/.next/static/{4ltYFSvrDIWJmAqKzeUt7 → qfCnoWSr4qmt2_dT28B-O}/_ssgManifest.js +0 -0
@@ -8,6 +8,8 @@ import { Button } from '../../ui/button.js';
8
8
  import { ChatTab } from './ChatTab.js';
9
9
  import { ChatDotIndicator } from './ChatDotIndicator.js';
10
10
  import { useTurnStatus } from '../../../hooks/turn-statuses-provider.js';
11
+ import { useFabLayout } from '../../../hooks/fab-layout-context.js';
12
+ import { useSidebar } from '../../ui/sidebar.js';
11
13
  // ── Persistent global chat popup (draggable + resizable) ──────────────────
12
14
  const DEFAULT_W = 520;
13
15
  const DEFAULT_H_VH = 70; // percentage of viewport height
@@ -48,6 +50,8 @@ export function GlobalChatPopup() {
48
50
  const [hasOpened, setHasOpened] = useState(false);
49
51
  const [isMaximized, setIsMaximized] = useState(false);
50
52
  const globalChatTurnStatus = useTurnStatus('global');
53
+ const { swapPosition } = useFabLayout();
54
+ const { state: sidebarState } = useSidebar();
51
55
  // Position/size — initialized from localStorage
52
56
  // eslint-disable-next-line react/hook-use-state -- wrapped setters below
53
57
  const [pos, setPosRaw] = useState(() => loadPersistedState().pos);
@@ -229,7 +233,7 @@ export function GlobalChatPopup() {
229
233
  };
230
234
  return (_jsxs(_Fragment, { children: [hasOpened ? (_jsxs("div", { ref: panelRef, className: cn(isMaximized
231
235
  ? 'bg-background fixed inset-0 z-[60] flex flex-col overflow-hidden dark:bg-neutral-900'
232
- : cn(!pos && 'fixed end-8 bottom-24', 'z-[60] flex flex-col overflow-hidden rounded-lg', 'border-border/60 border dark:border-white/10', 'bg-background dark:bg-neutral-900', 'shadow-[0_8px_40px_-8px_rgba(0,0,0,0.2)] dark:shadow-[0_8px_40px_-8px_rgba(0,0,0,0.6)]'), 'transition-opacity duration-300 ease-out', isOpen ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'), style: panelStyle, children: [!isMaximized ? (_jsx("div", { className: "h-[2px] shrink-0 bg-gradient-to-r from-transparent via-violet-500/50 to-transparent" })) : null, !isMaximized ? (_jsx("div", { onMouseDown: onResizeStart, className: "absolute end-0 top-0 z-10 h-4 w-4 cursor-ne-resize" })) : null, _jsxs("div", { onMouseDown: isMaximized ? undefined : onDragStart, className: cn('relative flex h-11 shrink-0 items-center gap-2.5 border-b border-black/[0.06] px-3.5 dark:border-white/[0.06]', !isMaximized && 'cursor-grab active:cursor-grabbing'), children: [_jsx("div", { className: "from-foreground/[0.02] to-foreground/[0.02] pointer-events-none absolute inset-0 bg-gradient-to-r via-transparent" }), !isMaximized ? (_jsx(GripVertical, { className: "text-foreground/15 relative h-3.5 w-3.5 shrink-0" })) : null, _jsx("div", { className: "relative flex h-5 w-5 items-center justify-center", children: _jsx(Bot, { className: "text-foreground/50 h-4 w-4" }) }), _jsxs("div", { className: "relative flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground/90 text-base font-bold tracking-tight", children: "Shep" }), _jsx("span", { className: "text-foreground/30 text-xs font-medium tracking-widest uppercase", children: "global" })] }), _jsxs("div", { className: "relative ms-auto flex items-center gap-0.5", children: [_jsx("button", { type: "button", onClick: toggleMaximize, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: isMaximized ? 'Restore (⌘⇧M)' : 'Maximize (⌘⇧M)', children: isMaximized ? (_jsx(Minimize2, { className: "h-3.5 w-3.5" })) : (_jsx(Maximize2, { className: "h-3.5 w-3.5" })) }), _jsx("button", { type: "button", onClick: handleClose, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: "Close (\u2318\u21E7K)", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: "global" }) }), !isMaximized ? (_jsx("div", { onMouseDown: (e) => {
236
+ : cn(!pos && (swapPosition ? 'fixed start-8 bottom-24' : 'fixed end-8 bottom-24'), 'z-[60] flex flex-col overflow-hidden rounded-lg', 'border-border/60 border dark:border-white/10', 'bg-background dark:bg-neutral-900', 'shadow-[0_8px_40px_-8px_rgba(0,0,0,0.2)] dark:shadow-[0_8px_40px_-8px_rgba(0,0,0,0.6)]'), 'transition-opacity duration-300 ease-out', isOpen ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'), style: panelStyle, children: [!isMaximized ? (_jsx("div", { className: "h-[2px] shrink-0 bg-gradient-to-r from-transparent via-violet-500/50 to-transparent" })) : null, !isMaximized ? (_jsx("div", { onMouseDown: onResizeStart, className: "absolute end-0 top-0 z-10 h-4 w-4 cursor-ne-resize" })) : null, _jsxs("div", { onMouseDown: isMaximized ? undefined : onDragStart, className: cn('relative flex h-11 shrink-0 items-center gap-2.5 border-b border-black/[0.06] px-3.5 dark:border-white/[0.06]', !isMaximized && 'cursor-grab active:cursor-grabbing'), children: [_jsx("div", { className: "from-foreground/[0.02] to-foreground/[0.02] pointer-events-none absolute inset-0 bg-gradient-to-r via-transparent" }), !isMaximized ? (_jsx(GripVertical, { className: "text-foreground/15 relative h-3.5 w-3.5 shrink-0" })) : null, _jsx("div", { className: "relative flex h-5 w-5 items-center justify-center", children: _jsx(Bot, { className: "text-foreground/50 h-4 w-4" }) }), _jsxs("div", { className: "relative flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground/90 text-base font-bold tracking-tight", children: "Shep" }), _jsx("span", { className: "text-foreground/30 text-xs font-medium tracking-widest uppercase", children: "global" })] }), _jsxs("div", { className: "relative ms-auto flex items-center gap-0.5", children: [_jsx("button", { type: "button", onClick: toggleMaximize, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: isMaximized ? 'Restore (⌘⇧M)' : 'Maximize (⌘⇧M)', children: isMaximized ? (_jsx(Minimize2, { className: "h-3.5 w-3.5" })) : (_jsx(Maximize2, { className: "h-3.5 w-3.5" })) }), _jsx("button", { type: "button", onClick: handleClose, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: "Close (\u2318\u21E7K)", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: "global" }) }), !isMaximized ? (_jsx("div", { onMouseDown: (e) => {
233
237
  e.preventDefault();
234
238
  e.stopPropagation();
235
239
  const panel = panelRef.current;
@@ -255,7 +259,23 @@ export function GlobalChatPopup() {
255
259
  };
256
260
  document.addEventListener('mousemove', onMove);
257
261
  document.addEventListener('mouseup', onUp);
258
- }, className: "absolute end-0 bottom-0 z-10 h-4 w-4 cursor-se-resize" })) : null] })) : null, _jsxs("div", { className: cn('group/fab fixed end-8 bottom-6 z-30', isMaximized && 'hidden'), children: [_jsxs(Button, { size: "icon", onClick: toggle, className: cn('relative h-14 w-14 rounded-full shadow-lg', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95', isOpen
262
+ }, className: "absolute end-0 bottom-0 z-10 h-4 w-4 cursor-se-resize" })) : null] })) : null, _jsxs(ChatFabWrapper, { swapPosition: swapPosition, sidebarState: sidebarState, isMaximized: isMaximized, children: [_jsxs(Button, { size: "icon", onClick: toggle, className: cn('relative h-14 w-14 rounded-full shadow-lg', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95', isOpen
259
263
  ? 'bg-violet-600 text-white hover:bg-violet-500'
260
264
  : 'bg-violet-500 text-white hover:bg-violet-400 dark:bg-violet-500 dark:hover:bg-violet-400'), children: [_jsx(MessageSquare, { className: cn('absolute h-7 w-7 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100') }), _jsx(X, { className: cn('absolute h-6 w-6 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0') }), !isOpen && _jsx(ChatDotIndicator, { status: globalChatTurnStatus, className: "end-0 top-0" })] }), _jsx("div", { className: "pointer-events-none absolute bottom-[calc(100%+8px)] left-1/2 -translate-x-1/2 translate-y-1 opacity-0 transition-all duration-200 group-hover/fab:translate-y-0 group-hover/fab:opacity-100", children: _jsxs("div", { className: "bg-foreground rounded-lg px-3 py-1.5 text-center shadow-lg", children: [_jsx("p", { className: "text-background text-xs font-medium whitespace-nowrap", children: t('chat.shepChat') }), _jsxs("p", { className: "text-background/50 mt-0.5 flex items-center justify-center gap-1 text-[10px]", children: [_jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u2318" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u21E7" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "K" })] })] }) })] })] }));
261
265
  }
266
+ /** Wrapper for the Chat FAB that handles position swapping. */
267
+ function ChatFabWrapper({ swapPosition, sidebarState, isMaximized, children, }) {
268
+ const { i18n } = useTranslation('web');
269
+ const isRtl = i18n.dir() === 'rtl';
270
+ if (!swapPosition) {
271
+ return (_jsx("div", { className: cn('group/fab fixed end-8 bottom-6 z-30', isMaximized && 'hidden'), children: children }));
272
+ }
273
+ // Swapped: chat FAB moves to start side, tracking sidebar width
274
+ const sidebarOffset = sidebarState === 'expanded'
275
+ ? 'calc(var(--sidebar-width) + 32px)'
276
+ : 'calc(var(--sidebar-width-icon) + 32px)';
277
+ const positionStyle = isRtl
278
+ ? { right: sidebarOffset, transition: 'right 200ms ease-in-out' }
279
+ : { left: sidebarOffset, transition: 'left 200ms ease-in-out' };
280
+ return (_jsx("div", { className: cn('group/fab fixed bottom-6 z-30', isMaximized && 'hidden'), style: positionStyle, children: children }));
281
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AA+B5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CA+czF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAgC5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CA+czF"}
@@ -16,6 +16,7 @@ import { useSoundAction } from '../../../hooks/use-sound-action.js';
16
16
  import { useDrawerCloseGuard } from '../../../hooks/drawer-close-guard.js';
17
17
  import { useViewportPersistence } from '../../../hooks/use-viewport-persistence.js';
18
18
  import { useSidebar } from '../../ui/sidebar.js';
19
+ import { useFabLayout } from '../../../hooks/fab-layout-context.js';
19
20
  import { ControlCenterEmptyState } from './control-center-empty-state.js';
20
21
  import { useControlCenterState } from './use-control-center-state.js';
21
22
  const AUTO_FOCUS_OPTIONS = {
@@ -353,11 +354,24 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
353
354
  const canvasToolbar = (_jsx(CanvasToolbar, { showArchived: showArchived, onToggleArchived: () => setShowArchived(!showArchived), onResetViewport: resetViewport }));
354
355
  return (_jsxs(_Fragment, { children: [_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, selectedRepository: selectedRepository, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, toolbar: canvasToolbar, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }), showCanvas ? _jsx(CreateFab, { actions: fabActions }) : null] }));
355
356
  }
356
- /** (+) FAB that tracks sidebar width via CSS var + transition. */
357
+ /** (+) FAB that tracks sidebar width via CSS var + transition.
358
+ * When fabLayout.swapPosition is true, moves to the end side (right in LTR). */
357
359
  function CreateFab({ actions }) {
358
360
  const { state } = useSidebar();
359
361
  const { i18n } = useTranslation('web');
362
+ const { swapPosition } = useFabLayout();
360
363
  const isRtl = i18n.dir() === 'rtl';
364
+ // Default: start side (left in LTR), tracking sidebar width
365
+ // Swapped: end side (right in LTR), fixed 32px from edge
366
+ if (swapPosition) {
367
+ const positionStyle = isRtl
368
+ ? {
369
+ left: 'calc(var(--sidebar-width-icon) + 32px)',
370
+ transition: 'left 200ms ease-in-out',
371
+ }
372
+ : { right: '32px', transition: 'right 200ms ease-in-out' };
373
+ return (_jsx(FloatingActionButton, { actions: actions, className: "!fixed bottom-6", style: positionStyle }));
374
+ }
361
375
  // Sidebar expanded = var(--sidebar-width) = 16rem, collapsed = var(--sidebar-width-icon) = 3rem
362
376
  // Position just outside the sidebar edge with 16px gap
363
377
  const offset = state === 'expanded'
@@ -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":"AA2CA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA6B/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;AA+QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAm1CzB"}
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,EAKT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA8B/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;AA+QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAi3CzB"}
@@ -1,7 +1,7 @@
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 { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Globe, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, } from 'lucide-react';
4
+ import { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Globe, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, LayoutGrid, } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
6
  import { useTranslation } from 'react-i18next';
7
7
  import { cn } from '../../../lib/utils.js';
@@ -36,6 +36,7 @@ const SECTIONS = [
36
36
  { id: 'notifications', labelKey: 'settings.sections.notifications', icon: Bell },
37
37
  { id: 'feature-flags', labelKey: 'settings.sections.flags', icon: Flag },
38
38
  { id: 'interactive-agent', labelKey: 'settings.sections.chat', icon: MessageSquare },
39
+ { id: 'fab-layout', labelKey: 'settings.sections.layout', icon: LayoutGrid },
39
40
  { id: 'database', labelKey: 'settings.sections.database', icon: Database },
40
41
  ];
41
42
  function useSaveIndicator() {
@@ -190,6 +191,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
190
191
  const [interactiveEnabled, setInteractiveEnabled] = useState(interactiveAgentConfig.enabled);
191
192
  const [interactiveTimeout, setInteractiveTimeout] = useState(String(interactiveAgentConfig.autoTimeoutMinutes));
192
193
  const [interactiveSessions, setInteractiveSessions] = useState(String(interactiveAgentConfig.maxConcurrentSessions));
194
+ // FAB layout state
195
+ const fabLayoutConfig = settings.fabLayout ?? { swapPosition: false };
196
+ const [fabSwapPosition, setFabSwapPosition] = useState(fabLayoutConfig.swapPosition);
193
197
  // Notification state
194
198
  const [inApp, setInApp] = useState(settings.notifications.inApp.enabled);
195
199
  const [events, setEvents] = useState({ ...settings.notifications.events });
@@ -588,7 +592,10 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
588
592
  maxConcurrentSessions: clamped,
589
593
  },
590
594
  });
591
- } }) })] }), _jsx(SectionHint, { children: t('settings.interactiveAgent.hint') })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: t('settings.database.title'), description: t('settings.database.sectionDescription'), testId: "database-settings-section", children: [_jsx(SettingsRow, { label: t('settings.database.location'), description: t('settings.database.locationDescription'), children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: t('settings.database.size'), children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
595
+ } }) })] }), _jsx(SectionHint, { children: t('settings.interactiveAgent.hint') })] }), _jsxs("div", { id: "section-fab-layout", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: LayoutGrid, title: t('settings.fabLayout.title'), description: t('settings.fabLayout.description'), testId: "fab-layout-settings-section", children: _jsx(SwitchRow, { label: t('settings.fabLayout.swapPosition'), description: t('settings.fabLayout.swapPositionDescription'), id: "fab-swap-position", testId: "switch-fab-swap-position", checked: fabSwapPosition, onChange: (v) => {
596
+ setFabSwapPosition(v);
597
+ save({ fabLayout: { swapPosition: v } });
598
+ } }) }), _jsx(SectionHint, { children: t('settings.fabLayout.hint') })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: t('settings.database.title'), description: t('settings.database.sectionDescription'), testId: "database-settings-section", children: [_jsx(SettingsRow, { label: t('settings.database.location'), description: t('settings.database.locationDescription'), children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: t('settings.database.size'), children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
592
599
  {
593
600
  label: t('settings.database.links.settingsService'),
594
601
  href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/settings-service.md',
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { FabLayoutState } from '../lib/fab-layout.js';
3
+ interface FabLayoutProviderProps {
4
+ children: ReactNode;
5
+ layout: FabLayoutState;
6
+ }
7
+ /**
8
+ * Provides server-resolved FAB layout configuration to all client components.
9
+ * Initialized in the root layout with values from the DB singleton.
10
+ */
11
+ export declare function FabLayoutProvider({ children, layout }: FabLayoutProviderProps): import("react/jsx-runtime").JSX.Element;
12
+ /**
13
+ * Read FAB layout config from context. Returns default (not swapped)
14
+ * when used outside a FabLayoutProvider (e.g., Storybook, tests).
15
+ */
16
+ export declare function useFabLayout(): FabLayoutState;
17
+ export {};
18
+ //# sourceMappingURL=fab-layout-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fab-layout-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/fab-layout-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,sBAAsB,2CAE7E;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,cAAc,CAE7C"}
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext } from 'react';
4
+ const defaultLayout = { swapPosition: false };
5
+ const FabLayoutContext = createContext(defaultLayout);
6
+ /**
7
+ * Provides server-resolved FAB layout configuration to all client components.
8
+ * Initialized in the root layout with values from the DB singleton.
9
+ */
10
+ export function FabLayoutProvider({ children, layout }) {
11
+ return _jsx(FabLayoutContext.Provider, { value: layout, children: children });
12
+ }
13
+ /**
14
+ * Read FAB layout config from context. Returns default (not swapped)
15
+ * when used outside a FabLayoutProvider (e.g., Storybook, tests).
16
+ */
17
+ export function useFabLayout() {
18
+ return useContext(FabLayoutContext);
19
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * FAB layout configuration for the web UI.
3
+ *
4
+ * Reads from Settings.fabLayout when available, defaulting to
5
+ * swapPosition = false (Create FAB on start side, Chat FAB on end side).
6
+ */
7
+ export interface FabLayoutState {
8
+ swapPosition: boolean;
9
+ }
10
+ export declare function getFabLayout(): FabLayoutState;
11
+ //# sourceMappingURL=fab-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fab-layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/fab-layout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,IAAI,cAAc,CAa7C"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * FAB layout configuration for the web UI.
3
+ *
4
+ * Reads from Settings.fabLayout when available, defaulting to
5
+ * swapPosition = false (Create FAB on start side, Chat FAB on end side).
6
+ */
7
+ import { hasSettings, getSettings } from '../../../../packages/core/src/infrastructure/services/settings.service.js';
8
+ export function getFabLayout() {
9
+ try {
10
+ if (hasSettings()) {
11
+ const fabLayout = getSettings().fabLayout;
12
+ if (fabLayout) {
13
+ return { swapPosition: fabLayout.swapPosition };
14
+ }
15
+ }
16
+ }
17
+ catch {
18
+ // Settings not initialized (e.g., during build/SSG or client-side hydration)
19
+ }
20
+ return { swapPosition: false };
21
+ }
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "تشغيل جميع مراحل SDLC (تحليل → متطلبات → خطة → تنفيذ)",
207
207
  "modelOption": "معرّف نموذج LLM لهذا التشغيل (مثال: claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "إرفاق ملف (قابل للتكرار)",
212
210
  "parentNotFound": "الميزة الأصلية غير موجودة: {{id}}",
213
211
  "attachmentNotFound": "المرفق غير موجود: {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "الإشعارات",
15
15
  "flags": "العلامات",
16
16
  "chat": "المحادثة",
17
+ "layout": "التخطيط",
17
18
  "database": "قاعدة البيانات"
18
19
  },
19
20
  "language": {
@@ -212,6 +213,13 @@
212
213
  "maxConcurrentSessionsDescription": "الحد الأقصى لعدد جلسات الوكيل التفاعلية النشطة في وقت واحد (1–10)",
213
214
  "hint": "علامة المحادثة تُنشئ عملية وكيل مستمرة لكل ميزة. المهلة التلقائية تُوقف الجلسات الخاملة تلقائيًا لتوفير الموارد. حد الجلسات المتزامنة يمنع الاستخدام المفرط للموارد على أجهزة المطورين."
214
215
  },
216
+ "fabLayout": {
217
+ "title": "التخطيط",
218
+ "description": "التحكم في موضع أزرار الإجراء العائمة في مركز التحكم",
219
+ "swapPosition": "تبديل مواضع الأزرار العائمة",
220
+ "swapPositionDescription": "نقل زر المحادثة إلى اليسار وزر الإنشاء إلى اليمين",
221
+ "hint": "يوجد زران عائمان (إنشاء ومحادثة) في الزوايا السفلية لمركز التحكم. قم بتفعيل هذا الخيار لتبديل مواضعهما."
222
+ },
215
223
  "database": {
216
224
  "title": "قاعدة البيانات",
217
225
  "description": "مسار قاعدة البيانات وإدارتها",
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "Alle SDLC-Phasen durchlaufen (Analyse → Anforderungen → Plan → Implementierung)",
207
207
  "modelOption": "LLM-Modellbezeichnung für diesen Lauf (z.B. claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "Eine Datei anhängen (wiederholbar)",
212
210
  "parentNotFound": "Übergeordnetes Feature nicht gefunden: {{id}}",
213
211
  "attachmentNotFound": "Anhang nicht gefunden: {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "Benachrichtigungen",
15
15
  "flags": "Flags",
16
16
  "chat": "Chat",
17
+ "layout": "Layout",
17
18
  "database": "Datenbank"
18
19
  },
19
20
  "language": {
@@ -198,6 +199,13 @@
198
199
  "maxConcurrentSessionsDescription": "Maximale Anzahl aktiver interaktiver Agenten-Sitzungen gleichzeitig (1–10)",
199
200
  "hint": "Der Chat-Tab startet einen persistenten Agentenprozess pro Feature. Das Auto-Zeitlimit stoppt inaktive Sitzungen automatisch, um Ressourcen zu sparen. Das Limit für gleichzeitige Sitzungen verhindert unkontrollierten Ressourcenverbrauch auf Entwicklermaschinen."
200
201
  },
202
+ "fabLayout": {
203
+ "title": "Layout",
204
+ "description": "Position der schwebenden Aktionsschaltflächen im Kontrollzentrum steuern",
205
+ "swapPosition": "FAB-Positionen tauschen",
206
+ "swapPositionDescription": "Chat-Button nach links und Erstellen-Button nach rechts verschieben",
207
+ "hint": "Die zwei schwebenden Aktionsschaltflächen (Erstellen und Chat) befinden sich in den unteren Ecken des Kontrollzentrums. Aktivieren Sie diese Option, um ihre Positionen zu tauschen."
208
+ },
201
209
  "database": {
202
210
  "title": "Datenbank",
203
211
  "description": "Datenbankpfad und -verwaltung",
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "Run full SDLC phases (analyze → requirements → plan → implement)",
207
207
  "modelOption": "LLM model identifier for this run (e.g. claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "Attach a file (repeatable)",
212
210
  "parentNotFound": "Parent feature not found: {{id}}",
213
211
  "attachmentNotFound": "Attachment not found: {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "Notifications",
15
15
  "flags": "Flags",
16
16
  "chat": "Chat",
17
+ "layout": "Layout",
17
18
  "database": "Database"
18
19
  },
19
20
  "language": {
@@ -212,6 +213,13 @@
212
213
  "maxConcurrentSessionsDescription": "Maximum number of active interactive agent sessions at once (1–10)",
213
214
  "hint": "The Chat tab spawns a persistent agent process per feature. Auto-timeout stops idle sessions automatically to conserve resources. The concurrent session cap prevents runaway resource usage on developer machines."
214
215
  },
216
+ "fabLayout": {
217
+ "title": "Layout",
218
+ "description": "Control the position of floating action buttons in the control center",
219
+ "swapPosition": "Swap FAB positions",
220
+ "swapPositionDescription": "Move the Chat button to the left and the Create button to the right",
221
+ "hint": "The two floating action buttons (Create and Chat) sit in the bottom corners of the control center. Enable this toggle to swap their positions."
222
+ },
215
223
  "database": {
216
224
  "title": "Database",
217
225
  "description": "Database path and management",
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "Ejecutar todas las fases SDLC (analizar → requisitos → plan → implementar)",
207
207
  "modelOption": "Identificador del modelo LLM para esta ejecución (ej., claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "Adjuntar un archivo (repetible)",
212
210
  "parentNotFound": "Funcionalidad padre no encontrada: {{id}}",
213
211
  "attachmentNotFound": "Archivo adjunto no encontrado: {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "Notificaciones",
15
15
  "flags": "Opciones",
16
16
  "chat": "Chat",
17
+ "layout": "Diseño",
17
18
  "database": "Base de datos"
18
19
  },
19
20
  "language": {
@@ -212,6 +213,13 @@
212
213
  "maxConcurrentSessionsDescription": "Número máximo de sesiones de agente interactivo activas a la vez (1-10)",
213
214
  "hint": "La pestaña de chat genera un proceso de agente persistente por funcionalidad. El tiempo de espera automático detiene las sesiones inactivas automáticamente para conservar recursos. El límite de sesiones concurrentes previene el uso excesivo de recursos en las máquinas de los desarrolladores."
214
215
  },
216
+ "fabLayout": {
217
+ "title": "Diseño",
218
+ "description": "Controlar la posición de los botones de acción flotantes en el centro de control",
219
+ "swapPosition": "Intercambiar posiciones de FAB",
220
+ "swapPositionDescription": "Mover el botón de Chat a la izquierda y el de Crear a la derecha",
221
+ "hint": "Los dos botones de acción flotantes (Crear y Chat) se ubican en las esquinas inferiores del centro de control. Active esta opción para intercambiar sus posiciones."
222
+ },
215
223
  "database": {
216
224
  "title": "Base de datos",
217
225
  "description": "Ruta de la base de datos y administración",
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "Exécuter toutes les phases SDLC (analyser → exigences → plan → implémenter)",
207
207
  "modelOption": "Identifiant du modèle LLM pour cette exécution (par ex. claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "Joindre un fichier (répétable)",
212
210
  "parentNotFound": "Fonctionnalité parente introuvable : {{id}}",
213
211
  "attachmentNotFound": "Pièce jointe introuvable : {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "Notifications",
15
15
  "flags": "Drapeaux",
16
16
  "chat": "Chat",
17
+ "layout": "Disposition",
17
18
  "database": "Base de données"
18
19
  },
19
20
  "language": {
@@ -212,6 +213,13 @@
212
213
  "maxConcurrentSessionsDescription": "Nombre maximum de sessions d'agent interactif actives simultanément (1-10)",
213
214
  "hint": "L'onglet Chat lance un processus d'agent persistant par fonctionnalité. Le délai d'inactivité automatique arrête les sessions inactives pour économiser les ressources. Le plafond de sessions simultanées empêche l'utilisation incontrôlée des ressources sur les machines de développement."
214
215
  },
216
+ "fabLayout": {
217
+ "title": "Disposition",
218
+ "description": "Contrôler la position des boutons d'action flottants dans le centre de contrôle",
219
+ "swapPosition": "Inverser les positions des FAB",
220
+ "swapPositionDescription": "Déplacer le bouton Chat à gauche et le bouton Créer à droite",
221
+ "hint": "Les deux boutons d'action flottants (Créer et Chat) se trouvent dans les coins inférieurs du centre de contrôle. Activez cette option pour inverser leurs positions."
222
+ },
215
223
  "database": {
216
224
  "title": "Base de données",
217
225
  "description": "Chemin et gestion de la base de données",
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "הרץ את כל שלבי ה-SDLC (ניתוח → דרישות → תוכנית → מימוש)",
207
207
  "modelOption": "מזהה מודל LLM להרצה זו (לדוגמה claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "צרף קובץ (ניתן לחזור)",
212
210
  "parentNotFound": "פיצ'ר הורה לא נמצא: {{id}}",
213
211
  "attachmentNotFound": "קובץ מצורף לא נמצא: {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "התראות",
15
15
  "flags": "דגלים",
16
16
  "chat": "צ'אט",
17
+ "layout": "פריסה",
17
18
  "database": "מסד נתונים"
18
19
  },
19
20
  "language": {
@@ -212,6 +213,13 @@
212
213
  "maxConcurrentSessionsDescription": "מספר מרבי של סשנים אינטראקטיביים פעילים בו-זמנית (1-10)",
213
214
  "hint": "לשונית הצ'אט מפעילה תהליך סוכן מתמשך לכל פיצ'ר. תפוגת זמן אוטומטית עוצרת סשנים לא פעילים כדי לחסוך במשאבים. מגבלת הסשנים המקבילים מונעת שימוש מופרז במשאבים על מכונות מפתחים."
214
215
  },
216
+ "fabLayout": {
217
+ "title": "פריסה",
218
+ "description": "שליטה במיקום כפתורי הפעולה הצפים במרכז הבקרה",
219
+ "swapPosition": "החלפת מיקומי כפתורים צפים",
220
+ "swapPositionDescription": "העברת כפתור הצ'אט לשמאל וכפתור היצירה לימין",
221
+ "hint": "שני כפתורי הפעולה הצפים (יצירה וצ'אט) נמצאים בפינות התחתונות של מרכז הבקרה. הפעל את האפשרות הזו כדי להחליף את מיקומיהם."
222
+ },
215
223
  "database": {
216
224
  "title": "מסד נתונים",
217
225
  "description": "נתיב מסד הנתונים וניהול",
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "Executar todas as fases do SDLC (analisar → requisitos → plano → implementar)",
207
207
  "modelOption": "Identificador do modelo LLM para esta execução (ex: claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "Anexar um arquivo (repetível)",
212
210
  "parentNotFound": "Recurso pai não encontrado: {{id}}",
213
211
  "attachmentNotFound": "Anexo não encontrado: {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "Notificações",
15
15
  "flags": "Flags",
16
16
  "chat": "Chat",
17
+ "layout": "Layout",
17
18
  "database": "Banco de Dados"
18
19
  },
19
20
  "language": {
@@ -212,6 +213,13 @@
212
213
  "maxConcurrentSessionsDescription": "Número máximo de sessões de agente interativo ativas ao mesmo tempo (1-10)",
213
214
  "hint": "A aba Chat inicia um processo de agente persistente por recurso. O tempo limite automático para sessões ociosas automaticamente para economizar recursos. O limite de sessões simultâneas evita uso excessivo de recursos em máquinas de desenvolvimento."
214
215
  },
216
+ "fabLayout": {
217
+ "title": "Layout",
218
+ "description": "Controlar a posição dos botões de ação flutuantes no centro de controle",
219
+ "swapPosition": "Trocar posições dos FABs",
220
+ "swapPositionDescription": "Mover o botão de Chat para a esquerda e o de Criar para a direita",
221
+ "hint": "Os dois botões de ação flutuantes (Criar e Chat) ficam nos cantos inferiores do centro de controle. Ative esta opção para trocar suas posições."
222
+ },
215
223
  "database": {
216
224
  "title": "Banco de Dados",
217
225
  "description": "Caminho e gerenciamento do banco de dados",
@@ -206,8 +206,6 @@
206
206
  "noFastOption": "Выполнить все фазы SDLC (анализ → требования → план → реализация)",
207
207
  "modelOption": "Идентификатор модели LLM для этого запуска (например, claude-opus-4-6)",
208
208
  "noRebaseOption": "Skip syncing main from remote before creating the feature branch",
209
- "injectSkillsOption": "Inject curated skills into the worktree",
210
- "noInjectSkillsOption": "Skip skill injection for this invocation",
211
209
  "attachOption": "Прикрепить файл (можно повторять)",
212
210
  "parentNotFound": "Родительская функция не найдена: {{id}}",
213
211
  "attachmentNotFound": "Вложение не найдено: {{path}}",
@@ -14,6 +14,7 @@
14
14
  "notifications": "Уведомления",
15
15
  "flags": "Флаги",
16
16
  "chat": "Чат",
17
+ "layout": "Расположение",
17
18
  "database": "База данных"
18
19
  },
19
20
  "language": {
@@ -212,6 +213,13 @@
212
213
  "maxConcurrentSessionsDescription": "Максимальное количество активных интерактивных сессий агента одновременно (1-10)",
213
214
  "hint": "Вкладка чата запускает постоянный процесс агента для каждой функции. Автоматический таймаут останавливает неактивные сессии для экономии ресурсов. Ограничение параллельных сессий предотвращает чрезмерное использование ресурсов на машинах разработчиков."
214
215
  },
216
+ "fabLayout": {
217
+ "title": "Расположение",
218
+ "description": "Управление положением плавающих кнопок действий в центре управления",
219
+ "swapPosition": "Поменять местами кнопки",
220
+ "swapPositionDescription": "Переместить кнопку чата влево, а кнопку создания вправо",
221
+ "hint": "Две плавающие кнопки действий (Создать и Чат) расположены в нижних углах центра управления. Включите эту опцию, чтобы поменять их местами."
222
+ },
215
223
  "database": {
216
224
  "title": "База данных",
217
225
  "description": "Путь к базе данных и управление",