@shepai/cli 1.135.2-pr437.64c56e0 → 1.135.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +0 -5
  2. package/dist/packages/core/src/application/ports/output/services/index.d.ts +0 -1
  3. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  4. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  5. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +0 -1
  6. package/dist/packages/core/src/domain/generated/output.d.ts +0 -4
  7. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/di/container.js +0 -10
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +0 -1
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +0 -2
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +2 -3
  15. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +0 -3
  17. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +0 -3
  19. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +0 -5
  21. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +0 -1
  23. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +0 -1
  25. package/dist/src/presentation/web/dev-server.js +1 -62
  26. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  27. package/dist/src/presentation/web/hooks/feature-flags-context.js +0 -1
  28. package/dist/src/presentation/web/lib/feature-flags.d.ts +0 -2
  29. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  30. package/dist/src/presentation/web/lib/feature-flags.js +0 -5
  31. package/dist/tsconfig.build.tsbuildinfo +1 -1
  32. package/package.json +1 -2
  33. package/web/.next/BUILD_ID +1 -1
  34. package/web/.next/build-manifest.json +2 -2
  35. package/web/.next/fallback-build-manifest.json +2 -2
  36. package/web/.next/prerender-manifest.json +3 -3
  37. package/web/.next/required-server-files.js +3 -3
  38. package/web/.next/required-server-files.json +3 -3
  39. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +24 -24
  40. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +24 -24
  43. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +30 -30
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
  52. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +24 -24
  55. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +30 -30
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +22 -22
  64. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
  67. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/_global-error.html +2 -2
  70. package/web/.next/server/app/_global-error.rsc +1 -1
  71. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  76. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  77. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  79. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  80. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  81. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  82. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  83. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  85. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  86. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  88. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  89. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  91. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  93. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  94. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +1 -1
  96. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  98. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +1 -1
  100. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +1 -1
  102. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__31bc28da._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__31bc28da._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__32ecbed9._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__32ecbed9._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__90ce4b6d._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__90ce4b6d._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__90f9ae71._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__90f9ae71._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js +2 -2
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  125. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  127. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/{_dc7a5354._.js → _1f958cbc._.js} +2 -2
  129. package/web/.next/server/chunks/ssr/{_dc7a5354._.js.map → _1f958cbc._.js.map} +1 -1
  130. package/web/.next/server/chunks/ssr/{_8b23e6e2._.js → _69699ffe._.js} +2 -2
  131. package/web/.next/server/chunks/ssr/{_8b23e6e2._.js.map → _69699ffe._.js.map} +1 -1
  132. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  133. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  137. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/_b6960ca0._.js +2 -2
  139. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  141. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  143. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  145. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/src_presentation_web_731afe96._.js +3 -0
  147. package/web/.next/server/chunks/ssr/{src_presentation_web_36c89258._.js.map → src_presentation_web_731afe96._.js.map} +1 -1
  148. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +2 -2
  149. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +1 -1
  151. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +2 -2
  157. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  162. package/web/.next/server/pages/500.html +2 -2
  163. package/web/.next/server/server-reference-manifest.js +1 -1
  164. package/web/.next/server/server-reference-manifest.json +38 -38
  165. package/web/.next/static/chunks/{18616dda443b7ed1.js → 0b7fe2ac4f078f54.js} +7 -7
  166. package/web/.next/static/chunks/{30bd89fd01b119a2.js → 321178bb6199a3e1.js} +2 -2
  167. package/web/.next/static/chunks/{5a01342d617cd58f.js → 39302cb19904d221.js} +1 -1
  168. package/web/.next/static/chunks/3d1b728f59ca0ae6.js +1 -0
  169. package/web/.next/static/chunks/{1547f0a22212eeb3.css → 3e2d7d07926b05bf.css} +1 -1
  170. package/web/.next/static/chunks/{3159d1f9416e896d.js → 52bbd5a4f8ff74bd.js} +1 -1
  171. package/web/.next/static/chunks/{6ed7881d7545daae.js → 52d2796a174182a7.js} +1 -1
  172. package/web/.next/static/chunks/{1ca8c882e9cf102c.js → 567a5fd9bc141bde.js} +1 -1
  173. package/web/.next/static/chunks/6709ec190dbf8098.js +1 -0
  174. package/web/.next/static/chunks/{4b0275fb3340cd3e.js → 88a7aed01a628019.js} +1 -1
  175. package/web/.next/static/chunks/9e13ad97d9c1c52a.js +2 -0
  176. package/web/.next/static/chunks/{636fe3836aae4006.js → d4fbedd39504661f.js} +1 -1
  177. package/web/.next/static/chunks/{dc04db51bba7bd03.js → d54a9af6cc2a0c58.js} +1 -1
  178. package/web/.next/static/chunks/{86e23100e2c7061e.js → ddb9106ee55ddb62.js} +1 -1
  179. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts +0 -132
  180. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts.map +0 -1
  181. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.js +0 -12
  182. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts +0 -11
  183. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts.map +0 -1
  184. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.js +0 -17
  185. package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts +0 -42
  186. package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts.map +0 -1
  187. package/dist/packages/core/src/infrastructure/services/coasts.service.js +0 -185
  188. package/dist/src/presentation/web/coasts-dev-server.d.ts +0 -34
  189. package/dist/src/presentation/web/coasts-dev-server.d.ts.map +0 -1
  190. package/dist/src/presentation/web/coasts-dev-server.js +0 -68
  191. package/web/.next/server/chunks/ssr/src_presentation_web_36c89258._.js +0 -3
  192. package/web/.next/static/chunks/17fa4fac14853191.js +0 -1
  193. package/web/.next/static/chunks/7661244c2b96e166.js +0 -2
  194. package/web/.next/static/chunks/b739a4f78673e414.js +0 -1
  195. /package/web/.next/static/{QoGS79JLywbDT2qUt3YvL → yv0Tq9-BtqVnENafaiFF6}/_buildManifest.js +0 -0
  196. /package/web/.next/static/{QoGS79JLywbDT2qUt3YvL → yv0Tq9-BtqVnENafaiFF6}/_clientMiddlewareManifest.json +0 -0
  197. /package/web/.next/static/{QoGS79JLywbDT2qUt3YvL → yv0Tq9-BtqVnENafaiFF6}/_ssgManifest.js +0 -0
@@ -1,132 +0,0 @@
1
- /**
2
- * Coasts Service Interface
3
- *
4
- * Output port for managing Coasts containerized runtime isolation.
5
- * Implementations wrap the coast CLI binary via subprocess invocation
6
- * and integrate with the AI agent system for Coastfile generation.
7
- *
8
- * Following Clean Architecture:
9
- * - Application layer depends on this interface
10
- * - Infrastructure layer provides concrete implementations
11
- */
12
- /**
13
- * Result of checking Coasts prerequisites.
14
- * Each boolean indicates whether a specific prerequisite is met.
15
- */
16
- export interface PrerequisiteCheckResult {
17
- /** Whether the `coast` binary is available on PATH. */
18
- coastBinary: boolean;
19
- /** Whether the Docker daemon is reachable. */
20
- docker: boolean;
21
- /** Whether the coastd daemon is running and responding. */
22
- coastdRunning: boolean;
23
- /** Convenience AND of all prerequisite checks. */
24
- allMet: boolean;
25
- /** Human-readable messages for each missing prerequisite with fix instructions. */
26
- missingMessages: string[];
27
- }
28
- /**
29
- * Information about a running Coasts instance.
30
- */
31
- export interface CoastInstance {
32
- /** Port the coast instance is listening on. */
33
- port: number;
34
- /** URL to access the coast instance. */
35
- url: string;
36
- }
37
- /**
38
- * Port interface for managing Coasts containerized runtime isolation.
39
- *
40
- * Implementations must:
41
- * - Invoke the coast CLI binary via subprocess (not the coastd HTTP API)
42
- * - Support concurrent operations across different worktrees via workDir scoping
43
- * - Cache the installation prompt for the process lifetime
44
- * - Delegate Coastfile generation to the AI agent system
45
- */
46
- export interface ICoastsService {
47
- /**
48
- * Check whether all Coasts prerequisites are met.
49
- * Validates coast binary on PATH, Docker daemon reachable, and coastd running.
50
- * On Windows, fails immediately with a platform-not-supported message.
51
- *
52
- * @param workDir - Working directory for the check (used as cwd for subprocess calls)
53
- * @returns Result with individual check statuses and actionable messages for failures
54
- */
55
- checkPrerequisites(workDir: string): Promise<PrerequisiteCheckResult>;
56
- /**
57
- * Build the Coasts container image for the given directory.
58
- * Invokes `coast build` in the specified working directory.
59
- * Safe to call when the image is already built (idempotent).
60
- *
61
- * @param workDir - Directory containing the Coastfile
62
- * @throws Error if coast build fails (exit code non-zero)
63
- */
64
- build(workDir: string): Promise<void>;
65
- /**
66
- * Start a Coasts instance for the given directory.
67
- * Invokes `coast run` and returns instance info (port, URL).
68
- * Safe to call when the instance is already running (idempotent).
69
- *
70
- * @param workDir - Directory containing the Coastfile
71
- * @returns Information about the running coast instance
72
- * @throws Error if coast run fails
73
- */
74
- run(workDir: string): Promise<CoastInstance>;
75
- /**
76
- * Stop the Coasts instance for the given directory.
77
- * Invokes `coast stop` for the specified working directory.
78
- * No-op if no instance is running.
79
- *
80
- * @param workDir - Directory whose coast instance should be stopped
81
- */
82
- stop(workDir: string): Promise<void>;
83
- /**
84
- * Look up a running Coasts instance for the given directory.
85
- *
86
- * @param workDir - Directory to look up
87
- * @returns Instance info if running, null if not found
88
- */
89
- lookup(workDir: string): Promise<CoastInstance | null>;
90
- /**
91
- * Check if a Coasts instance is currently running for the given directory.
92
- *
93
- * @param workDir - Directory to check
94
- * @returns True if an instance is running
95
- */
96
- isRunning(workDir: string): Promise<boolean>;
97
- /**
98
- * Assign canonical ports to this worktree's coast instance.
99
- * Invokes `coast checkout` in the specified working directory.
100
- *
101
- * @param workDir - Directory whose coast instance should be checked out
102
- */
103
- checkout(workDir: string): Promise<void>;
104
- /**
105
- * Get the Coasts installation prompt for Coastfile generation.
106
- * Invokes `coast installation-prompt` and returns the full prompt text.
107
- * The result is cached for the process lifetime (FR-13).
108
- *
109
- * @returns The full installation prompt text from the coast CLI
110
- * @throws Error if the coast binary is not available
111
- */
112
- getInstallationPrompt(): Promise<string>;
113
- /**
114
- * Generate a Coastfile for the given directory using the AI agent system.
115
- * Runs `coast installation-prompt` to obtain the generation prompt,
116
- * passes it to the AI agent system with repo context, and writes the
117
- * generated Coastfile to the directory.
118
- *
119
- * @param workDir - Directory where the Coastfile should be generated
120
- * @returns Absolute path to the generated Coastfile
121
- * @throws Error if prompt retrieval or agent execution fails
122
- */
123
- generateCoastfile(workDir: string): Promise<string>;
124
- /**
125
- * Check if a Coastfile exists in the given directory.
126
- *
127
- * @param workDir - Directory to check for a Coastfile
128
- * @returns True if a Coastfile exists
129
- */
130
- hasCoastfile(workDir: string): Promise<boolean>;
131
- }
132
- //# sourceMappingURL=coasts-service.interface.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coasts-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/coasts-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,aAAa,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,MAAM,EAAE,OAAO,CAAC;IAChB,mFAAmF;IACnF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEtE;;;;;;;OAOG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;;;;;OAQG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE7C;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAEvD;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;;;;;OAOG;IACH,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpD;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Coasts Service Interface
3
- *
4
- * Output port for managing Coasts containerized runtime isolation.
5
- * Implementations wrap the coast CLI binary via subprocess invocation
6
- * and integrate with the AI agent system for Coastfile generation.
7
- *
8
- * Following Clean Architecture:
9
- * - Application layer depends on this interface
10
- * - Infrastructure layer provides concrete implementations
11
- */
12
- export {};
@@ -1,11 +0,0 @@
1
- /**
2
- * Migration 044: Add feature_flag_coasts_dev_server column to settings table.
3
- *
4
- * Adds a boolean (INTEGER 0/1) column for the Coasts dev server feature flag.
5
- * Defaults to 0 (disabled).
6
- */
7
- import type { MigrationParams } from 'umzug';
8
- import type Database from 'better-sqlite3';
9
- export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
10
- export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
11
- //# sourceMappingURL=044-add-feature-flag-coasts-dev-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"044-add-feature-flag-coasts-dev-server.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7F"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Migration 044: Add feature_flag_coasts_dev_server column to settings table.
3
- *
4
- * Adds a boolean (INTEGER 0/1) column for the Coasts dev server feature flag.
5
- * Defaults to 0 (disabled).
6
- */
7
- export async function up({ context: db }) {
8
- const columns = db.pragma('table_info(settings)');
9
- const existing = new Set(columns.map((c) => c.name));
10
- if (!existing.has('feature_flag_coasts_dev_server')) {
11
- db.exec('ALTER TABLE settings ADD COLUMN feature_flag_coasts_dev_server INTEGER NOT NULL DEFAULT 0');
12
- }
13
- }
14
- export async function down({ context: db }) {
15
- // SQLite does not support DROP COLUMN before 3.35.0; column remains but is unused after rollback.
16
- void db;
17
- }
@@ -1,42 +0,0 @@
1
- /**
2
- * Coasts Service Implementation
3
- *
4
- * Infrastructure adapter wrapping the coast CLI binary for containerized
5
- * runtime isolation. Uses constructor-injected ExecFunction for subprocess
6
- * invocation and IStructuredAgentCaller for AI-powered Coastfile generation.
7
- *
8
- * Following Clean Architecture:
9
- * - Implements the ICoastsService application port
10
- * - Lives in the infrastructure layer
11
- * - No direct child_process imports (injected via ExecFunction)
12
- */
13
- import type { ICoastsService, PrerequisiteCheckResult, CoastInstance } from '../../application/ports/output/services/coasts-service.interface.js';
14
- import type { IStructuredAgentCaller } from '../../application/ports/output/agents/structured-agent-caller.interface.js';
15
- import type { ExecFunction } from './git/worktree.service.js';
16
- export declare class CoastsService implements ICoastsService {
17
- private readonly execFile;
18
- private readonly structuredCaller;
19
- private cachedInstallationPrompt;
20
- private readonly isWindows;
21
- constructor(execFile: ExecFunction, structuredCaller: IStructuredAgentCaller, isWindows?: boolean);
22
- checkPrerequisites(workDir: string): Promise<PrerequisiteCheckResult>;
23
- build(workDir: string): Promise<void>;
24
- run(workDir: string): Promise<CoastInstance>;
25
- stop(workDir: string): Promise<void>;
26
- lookup(workDir: string): Promise<CoastInstance | null>;
27
- isRunning(workDir: string): Promise<boolean>;
28
- checkout(workDir: string): Promise<void>;
29
- getInstallationPrompt(): Promise<string>;
30
- generateCoastfile(workDir: string): Promise<string>;
31
- hasCoastfile(workDir: string): Promise<boolean>;
32
- private checkCoastBinary;
33
- private checkDocker;
34
- private checkCoastdRunning;
35
- private execCoast;
36
- /**
37
- * Parse coast CLI output to extract port and URL from stdout.
38
- * Looks for patterns like "port 3000" and "http://localhost:3000".
39
- */
40
- private parseCoastInstance;
41
- }
42
- //# sourceMappingURL=coasts.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coasts.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/coasts.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,aAAa,EACd,MAAM,qEAAqE,CAAC;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4EAA4E,CAAC;AACzH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAgC9D,qBACa,aAAc,YAAW,cAAc;IAKxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACf,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IALrE,OAAO,CAAC,wBAAwB,CAAuB;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAGO,QAAQ,EAAE,YAAY,EACZ,gBAAgB,EAAE,sBAAsB,EAC3F,SAAS,CAAC,EAAE,OAAO;IAKf,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiDrE,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAK5C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAStD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAaxC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBnD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAMvC,gBAAgB;YAIhB,WAAW;YAIX,kBAAkB;YAIlB,SAAS;IAQvB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAS3B"}
@@ -1,185 +0,0 @@
1
- /**
2
- * Coasts Service Implementation
3
- *
4
- * Infrastructure adapter wrapping the coast CLI binary for containerized
5
- * runtime isolation. Uses constructor-injected ExecFunction for subprocess
6
- * invocation and IStructuredAgentCaller for AI-powered Coastfile generation.
7
- *
8
- * Following Clean Architecture:
9
- * - Implements the ICoastsService application port
10
- * - Lives in the infrastructure layer
11
- * - No direct child_process imports (injected via ExecFunction)
12
- */
13
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
14
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
15
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
16
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
17
- return c > 3 && r && Object.defineProperty(target, key, r), r;
18
- };
19
- var __metadata = (this && this.__metadata) || function (k, v) {
20
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
21
- };
22
- var __param = (this && this.__param) || function (paramIndex, decorator) {
23
- return function (target, key) { decorator(target, key, paramIndex); }
24
- };
25
- import { existsSync, writeFileSync } from 'node:fs';
26
- import path from 'node:path';
27
- import { injectable, inject } from 'tsyringe';
28
- import { IS_WINDOWS } from '../platform.js';
29
- /** Timeout for coast build (may need to pull Docker images). */
30
- const BUILD_TIMEOUT_MS = 30_000;
31
- /** Timeout for all other coast CLI commands. */
32
- const DEFAULT_TIMEOUT_MS = 10_000;
33
- /** JSON schema for Coastfile generation via structured agent caller. */
34
- const COASTFILE_SCHEMA = {
35
- type: 'object',
36
- properties: {
37
- content: {
38
- type: 'string',
39
- description: 'The complete Coastfile content in TOML format',
40
- },
41
- warnings: {
42
- type: 'array',
43
- items: { type: 'string' },
44
- description: 'Any warnings or notes about the generated Coastfile',
45
- },
46
- },
47
- required: ['content'],
48
- additionalProperties: false,
49
- };
50
- let CoastsService = class CoastsService {
51
- execFile;
52
- structuredCaller;
53
- cachedInstallationPrompt = null;
54
- isWindows;
55
- constructor(execFile, structuredCaller, isWindows) {
56
- this.execFile = execFile;
57
- this.structuredCaller = structuredCaller;
58
- this.isWindows = isWindows ?? IS_WINDOWS;
59
- }
60
- async checkPrerequisites(workDir) {
61
- if (this.isWindows) {
62
- return {
63
- coastBinary: false,
64
- docker: false,
65
- coastdRunning: false,
66
- allMet: false,
67
- missingMessages: [
68
- 'Coasts dev server is not supported on Windows. See https://coasts.dev/docs for platform support.',
69
- ],
70
- };
71
- }
72
- const [coastResult, dockerResult, coastdResult] = await Promise.allSettled([
73
- this.checkCoastBinary(),
74
- this.checkDocker(),
75
- this.checkCoastdRunning(workDir),
76
- ]);
77
- const coastBinary = coastResult.status === 'fulfilled';
78
- const docker = dockerResult.status === 'fulfilled';
79
- const coastdRunning = coastdResult.status === 'fulfilled';
80
- const missingMessages = [];
81
- if (!coastBinary) {
82
- missingMessages.push('coast binary not found on PATH. Install it with: curl -fsSL https://coasts.dev/install | sh. See https://coasts.dev/docs');
83
- }
84
- if (!docker) {
85
- missingMessages.push('Docker daemon is not reachable. Start Docker Desktop or run: sudo systemctl start docker');
86
- }
87
- if (!coastdRunning) {
88
- missingMessages.push('coastd daemon is not running. Start it with: coastd &. See https://coasts.dev/docs/daemon');
89
- }
90
- return {
91
- coastBinary,
92
- docker,
93
- coastdRunning,
94
- allMet: coastBinary && docker && coastdRunning,
95
- missingMessages,
96
- };
97
- }
98
- async build(workDir) {
99
- await this.execCoast(['build'], workDir, BUILD_TIMEOUT_MS);
100
- }
101
- async run(workDir) {
102
- const { stdout } = await this.execCoast(['run'], workDir);
103
- return this.parseCoastInstance(stdout);
104
- }
105
- async stop(workDir) {
106
- try {
107
- await this.execCoast(['stop'], workDir);
108
- }
109
- catch {
110
- // No-op if no instance is running
111
- }
112
- }
113
- async lookup(workDir) {
114
- try {
115
- const { stdout } = await this.execCoast(['lookup'], workDir);
116
- return this.parseCoastInstance(stdout);
117
- }
118
- catch {
119
- return null;
120
- }
121
- }
122
- async isRunning(workDir) {
123
- const instance = await this.lookup(workDir);
124
- return instance !== null;
125
- }
126
- async checkout(workDir) {
127
- await this.execCoast(['checkout'], workDir);
128
- }
129
- async getInstallationPrompt() {
130
- if (this.cachedInstallationPrompt !== null) {
131
- return this.cachedInstallationPrompt;
132
- }
133
- const { stdout } = await this.execFile('coast', ['installation-prompt'], {
134
- timeout: DEFAULT_TIMEOUT_MS,
135
- });
136
- this.cachedInstallationPrompt = stdout;
137
- return stdout;
138
- }
139
- async generateCoastfile(workDir) {
140
- const installationPrompt = await this.getInstallationPrompt();
141
- const prompt = `${installationPrompt}\n\nAnalyze the project at the working directory and generate a Coastfile.\nReturn the complete Coastfile content as valid TOML in the "content" field.`;
142
- const result = await this.structuredCaller.call(prompt, COASTFILE_SCHEMA, {
143
- allowedTools: [],
144
- silent: true,
145
- maxTurns: 10,
146
- });
147
- const coastfilePath = path.join(workDir, 'Coastfile');
148
- writeFileSync(coastfilePath, result.content, 'utf-8');
149
- return coastfilePath;
150
- }
151
- async hasCoastfile(workDir) {
152
- return existsSync(path.join(workDir, 'Coastfile'));
153
- }
154
- // --- Private helpers ---
155
- async checkCoastBinary() {
156
- await this.execFile('coast', ['--version'], { timeout: 500 });
157
- }
158
- async checkDocker() {
159
- await this.execFile('docker', ['info'], { timeout: 500 });
160
- }
161
- async checkCoastdRunning(workDir) {
162
- await this.execFile('coast', ['ls'], { cwd: workDir, timeout: 500 });
163
- }
164
- async execCoast(args, workDir, timeout = DEFAULT_TIMEOUT_MS) {
165
- return this.execFile('coast', args, { cwd: workDir, timeout });
166
- }
167
- /**
168
- * Parse coast CLI output to extract port and URL from stdout.
169
- * Looks for patterns like "port 3000" and "http://localhost:3000".
170
- */
171
- parseCoastInstance(stdout) {
172
- const portMatch = stdout.match(/port\s+(\d+)/i);
173
- const urlMatch = stdout.match(/(https?:\/\/[^\s]+)/i);
174
- const port = portMatch ? parseInt(portMatch[1], 10) : 3000;
175
- const url = urlMatch ? urlMatch[1] : `http://localhost:${port}`;
176
- return { port, url };
177
- }
178
- };
179
- CoastsService = __decorate([
180
- injectable(),
181
- __param(0, inject('ExecFunction')),
182
- __param(1, inject('IStructuredAgentCaller')),
183
- __metadata("design:paramtypes", [Function, Object, Boolean])
184
- ], CoastsService);
185
- export { CoastsService };
@@ -1,34 +0,0 @@
1
- /**
2
- * Coasts Dev Server Startup & Shutdown
3
- *
4
- * Extracted from dev-server.ts for testability. Provides the Coasts startup
5
- * sequence (prerequisite checks, Coastfile generation, build, run) and
6
- * graceful shutdown logic.
7
- *
8
- * All log messages use [dev-server:coasts] prefix per NFR-10.
9
- */
10
- import type { ICoastsService, CoastInstance } from '../../../packages/core/src/application/ports/output/services/coasts-service.interface.js';
11
- /**
12
- * Start the dev server in Coasts mode.
13
- *
14
- * Sequence:
15
- * 1. Check prerequisites (coast binary, Docker, coastd daemon)
16
- * 2. Check for Coastfile — generate if missing
17
- * 3. Build the coast container image
18
- * 4. Run the coast instance
19
- *
20
- * @param coastsService - Resolved ICoastsService from the DI container
21
- * @param workDir - Working directory (repo/worktree root)
22
- * @returns The running CoastInstance with port and URL
23
- * @throws Error if prerequisites are not met or any step fails
24
- */
25
- export declare function startCoastsDevServer(coastsService: ICoastsService, workDir: string): Promise<CoastInstance>;
26
- /**
27
- * Gracefully shut down the Coasts instance.
28
- * Catches and logs errors to prevent shutdown failures.
29
- *
30
- * @param coastsService - The ICoastsService instance, or null if not in Coasts mode
31
- * @param workDir - Working directory for the coast instance
32
- */
33
- export declare function shutdownCoasts(coastsService: ICoastsService | null, workDir: string): Promise<void>;
34
- //# sourceMappingURL=coasts-dev-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coasts-dev-server.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/coasts-dev-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,yEAAyE,CAAC;AAEjF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,cAAc,EAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CA8BxB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,cAAc,GAAG,IAAI,EACpC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -1,68 +0,0 @@
1
- /**
2
- * Coasts Dev Server Startup & Shutdown
3
- *
4
- * Extracted from dev-server.ts for testability. Provides the Coasts startup
5
- * sequence (prerequisite checks, Coastfile generation, build, run) and
6
- * graceful shutdown logic.
7
- *
8
- * All log messages use [dev-server:coasts] prefix per NFR-10.
9
- */
10
- /**
11
- * Start the dev server in Coasts mode.
12
- *
13
- * Sequence:
14
- * 1. Check prerequisites (coast binary, Docker, coastd daemon)
15
- * 2. Check for Coastfile — generate if missing
16
- * 3. Build the coast container image
17
- * 4. Run the coast instance
18
- *
19
- * @param coastsService - Resolved ICoastsService from the DI container
20
- * @param workDir - Working directory (repo/worktree root)
21
- * @returns The running CoastInstance with port and URL
22
- * @throws Error if prerequisites are not met or any step fails
23
- */
24
- export async function startCoastsDevServer(coastsService, workDir) {
25
- // Step 1: Check prerequisites
26
- console.log('[dev-server:coasts] Checking prerequisites...');
27
- const prereqs = await coastsService.checkPrerequisites(workDir);
28
- if (!prereqs.allMet) {
29
- const messages = prereqs.missingMessages.map((m) => ` - ${m}`).join('\n');
30
- throw new Error(`[dev-server:coasts] Prerequisites not met:\n${messages}`);
31
- }
32
- console.log('[dev-server:coasts] All prerequisites met.');
33
- // Step 2: Check for Coastfile — generate if missing
34
- const hasCoastfile = await coastsService.hasCoastfile(workDir);
35
- if (!hasCoastfile) {
36
- console.log('[dev-server:coasts] No Coastfile found. Generating via AI agent...');
37
- const coastfilePath = await coastsService.generateCoastfile(workDir);
38
- console.log(`[dev-server:coasts] Coastfile generated at ${coastfilePath}`);
39
- }
40
- // Step 3: Build the coast container image
41
- console.log('[dev-server:coasts] Building coast container...');
42
- await coastsService.build(workDir);
43
- console.log('[dev-server:coasts] Build complete.');
44
- // Step 4: Run the coast instance
45
- console.log('[dev-server:coasts] Starting coast instance...');
46
- const instance = await coastsService.run(workDir);
47
- console.log(`[dev-server:coasts] Ready at ${instance.url}`);
48
- return instance;
49
- }
50
- /**
51
- * Gracefully shut down the Coasts instance.
52
- * Catches and logs errors to prevent shutdown failures.
53
- *
54
- * @param coastsService - The ICoastsService instance, or null if not in Coasts mode
55
- * @param workDir - Working directory for the coast instance
56
- */
57
- export async function shutdownCoasts(coastsService, workDir) {
58
- if (!coastsService)
59
- return;
60
- try {
61
- console.log('[dev-server:coasts] Stopping coast instance...');
62
- await coastsService.stop(workDir);
63
- console.log('[dev-server:coasts] Coast instance stopped.');
64
- }
65
- catch (error) {
66
- console.warn('[dev-server:coasts] Failed to stop coast instance:', error);
67
- }
68
- }
@@ -1,3 +0,0 @@
1
- module.exports=[80646,a=>{"use strict";var b=a.i(10973),c=a.i(96960),d=a.i(59653),e=a.i(6175),f=a.i(7420),g=a.i(58761),h=a.i(51473),i=a.i(59675),j=a.i(5472),k=a.i(75988),l=a.i(80930),m=a.i(14272),n=a.i(66873),o=a.i(90986),p=a.i(17329),q=a.i(16164),r=a.i(45291),s="Popover",[t,u]=(0,f.createContextScope)(s,[k.createPopperScope]),v=(0,k.createPopperScope)(),[w,x]=t(s),y=a=>{let{__scopePopover:d,children:e,open:f,defaultOpen:g,onOpenChange:h,modal:i=!1}=a,l=v(d),m=c.useRef(null),[n,o]=c.useState(!1),[q,r]=(0,p.useControllableState)({prop:f,defaultProp:g??!1,onChange:h,caller:s});return(0,b.jsx)(k.Root,{...l,children:(0,b.jsx)(w,{scope:d,contentId:(0,j.useId)(),triggerRef:m,open:q,onOpenChange:r,onOpenToggle:c.useCallback(()=>r(a=>!a),[r]),hasCustomAnchor:n,onCustomAnchorAdd:c.useCallback(()=>o(!0),[]),onCustomAnchorRemove:c.useCallback(()=>o(!1),[]),modal:i,children:e})})};y.displayName=s;var z="PopoverAnchor",A=c.forwardRef((a,d)=>{let{__scopePopover:e,...f}=a,g=x(z,e),h=v(e),{onCustomAnchorAdd:i,onCustomAnchorRemove:j}=g;return c.useEffect(()=>(i(),()=>j()),[i,j]),(0,b.jsx)(k.Anchor,{...h,...f,ref:d})});A.displayName=z;var B="PopoverTrigger",C=c.forwardRef((a,c)=>{let{__scopePopover:f,...g}=a,h=x(B,f),i=v(f),j=(0,e.useComposedRefs)(c,h.triggerRef),l=(0,b.jsx)(n.Primitive.button,{type:"button","aria-haspopup":"dialog","aria-expanded":h.open,"aria-controls":h.contentId,"data-state":Q(h.open),...g,ref:j,onClick:(0,d.composeEventHandlers)(a.onClick,h.onOpenToggle)});return h.hasCustomAnchor?l:(0,b.jsx)(k.Anchor,{asChild:!0,...i,children:l})});C.displayName=B;var D="PopoverPortal",[E,F]=t(D,{forceMount:void 0}),G=a=>{let{__scopePopover:c,forceMount:d,children:e,container:f}=a,g=x(D,c);return(0,b.jsx)(E,{scope:c,forceMount:d,children:(0,b.jsx)(m.Presence,{present:d||g.open,children:(0,b.jsx)(l.Portal,{asChild:!0,container:f,children:e})})})};G.displayName=D;var H="PopoverContent",I=c.forwardRef((a,c)=>{let d=F(H,a.__scopePopover),{forceMount:e=d.forceMount,...f}=a,g=x(H,a.__scopePopover);return(0,b.jsx)(m.Presence,{present:e||g.open,children:g.modal?(0,b.jsx)(K,{...f,ref:c}):(0,b.jsx)(L,{...f,ref:c})})});I.displayName=H;var J=(0,o.createSlot)("PopoverContent.RemoveScroll"),K=c.forwardRef((a,f)=>{let g=x(H,a.__scopePopover),h=c.useRef(null),i=(0,e.useComposedRefs)(f,h),j=c.useRef(!1);return c.useEffect(()=>{let a=h.current;if(a)return(0,q.hideOthers)(a)},[]),(0,b.jsx)(r.RemoveScroll,{as:J,allowPinchZoom:!0,children:(0,b.jsx)(M,{...a,ref:i,trapFocus:g.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:(0,d.composeEventHandlers)(a.onCloseAutoFocus,a=>{a.preventDefault(),j.current||g.triggerRef.current?.focus()}),onPointerDownOutside:(0,d.composeEventHandlers)(a.onPointerDownOutside,a=>{let b=a.detail.originalEvent,c=0===b.button&&!0===b.ctrlKey;j.current=2===b.button||c},{checkForDefaultPrevented:!1}),onFocusOutside:(0,d.composeEventHandlers)(a.onFocusOutside,a=>a.preventDefault(),{checkForDefaultPrevented:!1})})})}),L=c.forwardRef((a,d)=>{let e=x(H,a.__scopePopover),f=c.useRef(!1),g=c.useRef(!1);return(0,b.jsx)(M,{...a,ref:d,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:b=>{a.onCloseAutoFocus?.(b),b.defaultPrevented||(f.current||e.triggerRef.current?.focus(),b.preventDefault()),f.current=!1,g.current=!1},onInteractOutside:b=>{a.onInteractOutside?.(b),b.defaultPrevented||(f.current=!0,"pointerdown"===b.detail.originalEvent.type&&(g.current=!0));let c=b.target;e.triggerRef.current?.contains(c)&&b.preventDefault(),"focusin"===b.detail.originalEvent.type&&g.current&&b.preventDefault()}})}),M=c.forwardRef((a,c)=>{let{__scopePopover:d,trapFocus:e,onOpenAutoFocus:f,onCloseAutoFocus:j,disableOutsidePointerEvents:l,onEscapeKeyDown:m,onPointerDownOutside:n,onFocusOutside:o,onInteractOutside:p,...q}=a,r=x(H,d),s=v(d);return(0,h.useFocusGuards)(),(0,b.jsx)(i.FocusScope,{asChild:!0,loop:!0,trapped:e,onMountAutoFocus:f,onUnmountAutoFocus:j,children:(0,b.jsx)(g.DismissableLayer,{asChild:!0,disableOutsidePointerEvents:l,onInteractOutside:p,onEscapeKeyDown:m,onPointerDownOutside:n,onFocusOutside:o,onDismiss:()=>r.onOpenChange(!1),children:(0,b.jsx)(k.Content,{"data-state":Q(r.open),role:"dialog",id:r.contentId,...s,...q,ref:c,style:{...q.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),N="PopoverClose",O=c.forwardRef((a,c)=>{let{__scopePopover:e,...f}=a,g=x(N,e);return(0,b.jsx)(n.Primitive.button,{type:"button",...f,ref:c,onClick:(0,d.composeEventHandlers)(a.onClick,()=>g.onOpenChange(!1))})});O.displayName=N;var P=c.forwardRef((a,c)=>{let{__scopePopover:d,...e}=a,f=v(d);return(0,b.jsx)(k.Arrow,{...f,...e,ref:c})});function Q(a){return a?"open":"closed"}P.displayName="PopoverArrow",a.s(["Anchor",()=>A,"Arrow",()=>P,"Close",()=>O,"Content",()=>I,"Popover",()=>y,"PopoverAnchor",()=>A,"PopoverArrow",()=>P,"PopoverClose",()=>O,"PopoverContent",()=>I,"PopoverPortal",()=>G,"PopoverTrigger",()=>C,"Portal",()=>G,"Root",()=>y,"Trigger",()=>C,"createPopoverScope",()=>u],61452);var R=a.i(61452),R=R,S=a.i(85536);let T=R.Root,U=R.Trigger;R.Anchor;let V=c.forwardRef(({className:a,align:c="center",sideOffset:d=4,...e},f)=>(0,b.jsx)(R.Portal,{children:(0,b.jsx)(R.Content,{ref:f,align:c,sideOffset:d,className:(0,S.cn)("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-none",a),...e})}));V.displayName=R.Content.displayName,a.s(["Popover",()=>T,"PopoverContent",()=>V,"PopoverTrigger",()=>U],80646)},1948,7770,a=>{"use strict";var b=a.i(25674);let c=(0,b.createServerReference)("0063388d573da9be58d3df7501a50a92812a385134",b.callServer,void 0,b.findSourceMapURL,"getAllAgentModels");a.s(["getAllAgentModels",()=>c],1948);let d=(0,b.createServerReference)("6021fa428269a55fd780da44bed9bc78a099500818",b.callServer,void 0,b.findSourceMapURL,"updateAgentAndModel");a.s(["updateAgentAndModel",()=>d],7770)},96867,61781,a=>{"use strict";var b=a.i(10973),c=a.i(96960),d=a.i(59653),e=a.i(6175),f=a.i(7420),g=a.i(17329),h=a.i(64005),i=a.i(74432),j=a.i(66873),k="Switch",[l,m]=(0,f.createContextScope)(k),[n,o]=l(k),p=c.forwardRef((a,f)=>{let{__scopeSwitch:h,name:i,checked:l,defaultChecked:m,required:o,disabled:p,value:q="on",onCheckedChange:r,form:u,...v}=a,[w,x]=c.useState(null),y=(0,e.useComposedRefs)(f,a=>x(a)),z=c.useRef(!1),A=!w||u||!!w.closest("form"),[B,C]=(0,g.useControllableState)({prop:l,defaultProp:m??!1,onChange:r,caller:k});return(0,b.jsxs)(n,{scope:h,checked:B,disabled:p,children:[(0,b.jsx)(j.Primitive.button,{type:"button",role:"switch","aria-checked":B,"aria-required":o,"data-state":t(B),"data-disabled":p?"":void 0,disabled:p,value:q,...v,ref:y,onClick:(0,d.composeEventHandlers)(a.onClick,a=>{C(a=>!a),A&&(z.current=a.isPropagationStopped(),z.current||a.stopPropagation())})}),A&&(0,b.jsx)(s,{control:w,bubbles:!z.current,name:i,value:q,checked:B,required:o,disabled:p,form:u,style:{transform:"translateX(-100%)"}})]})});p.displayName=k;var q="SwitchThumb",r=c.forwardRef((a,c)=>{let{__scopeSwitch:d,...e}=a,f=o(q,d);return(0,b.jsx)(j.Primitive.span,{"data-state":t(f.checked),"data-disabled":f.disabled?"":void 0,...e,ref:c})});r.displayName=q;var s=c.forwardRef(({__scopeSwitch:a,control:d,checked:f,bubbles:g=!0,...j},k)=>{let l=c.useRef(null),m=(0,e.useComposedRefs)(l,k),n=(0,h.usePrevious)(f),o=(0,i.useSize)(d);return c.useEffect(()=>{let a=l.current;if(!a)return;let b=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"checked").set;if(n!==f&&b){let c=new Event("click",{bubbles:g});b.call(a,f),a.dispatchEvent(c)}},[n,f,g]),(0,b.jsx)("input",{type:"checkbox","aria-hidden":!0,defaultChecked:f,...j,tabIndex:-1,ref:m,style:{...j.style,...o,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});function t(a){return a?"checked":"unchecked"}s.displayName="SwitchBubbleInput",a.s(["Root",()=>p,"Switch",()=>p,"SwitchThumb",()=>r,"Thumb",()=>r,"createSwitchScope",()=>m],91918);var u=a.i(91918),u=u,v=a.i(85536);function w({className:a,size:c="default",...d}){return(0,b.jsx)(u.Root,{"data-slot":"switch","data-size":c,className:(0,v.cn)("peer group/switch focus-visible:border-ring focus-visible:ring-ring/50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80 inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6",a),...d,children:(0,b.jsx)(u.Thumb,{"data-slot":"switch-thumb",className:(0,v.cn)("bg-background dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0")})})}a.s(["Switch",()=>w],96867);var x=a.i(72016),y=a.i(94132),z=a.i(3410),A=a.i(1948),B=a.i(7770),C=a.i(17606),D=a.i(83852),E=a.i(18948),F=a.i(80646);function G({initialAgentType:a,initialModel:d,onAgentModelChange:e,disabled:f,className:g,mode:h}){let[i,j]=c.useState(!1),[k,l]=c.useState([]),[m,n]=c.useState(!0),[o,p]=c.useState(a),[q,r]=c.useState(d),[s,t]=c.useState(null),[u,w]=c.useState(0),[G,H]=c.useState(null);c.useEffect(()=>{(0,A.getAllAgentModels)().then(l).finally(()=>n(!1))},[]),c.useEffect(()=>{if(!i){let a=setTimeout(()=>{w(0),H(null)},150);return()=>clearTimeout(a)}},[i]);let I=async(a,b)=>{if(j(!1),a!==o||b!==q){if("override"===h){p(a),r(b),e?.(a,b);return}p(a),r(b),e?.(a,b),t(null);try{let c=await (0,B.updateAgentAndModel)(a,b||null);c.ok||(p(o),r(q),e?.(o,q),t(c.error??"Failed to save"))}catch{p(o),r(q),e?.(o,q),t("Failed to save")}}},J=(0,C.getAgentTypeIcon)(o),K=k.find(a=>a.agentType===o)?.label??o,L=q?(0,D.getModelMeta)(q).displayName||q:null,M=G?k.find(a=>a.agentType===G):null;return(0,b.jsxs)("div",{className:(0,v.cn)("flex flex-col gap-1",g),children:[(0,b.jsxs)(F.Popover,{open:i,onOpenChange:j,children:[(0,b.jsx)(F.PopoverTrigger,{asChild:!0,children:(0,b.jsx)(E.Button,{variant:"outline",role:"combobox","aria-expanded":i,disabled:(f??!1)||m,className:"w-auto cursor-pointer justify-start font-normal hover:border-violet-300 hover:bg-violet-50/50 dark:hover:border-violet-700 dark:hover:bg-violet-950/30",children:(0,b.jsxs)("span",{className:"flex items-center gap-2 truncate",children:[(0,b.jsx)(J,{className:"h-4 w-4 shrink-0"}),m?"Loading…":(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:K}),L?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"text-muted-foreground/50 text-xs",children:"·"}),(0,b.jsx)("span",{className:"text-xs font-medium",children:L})]}):null]})]})})}),(0,b.jsx)(F.PopoverContent,{className:"w-(--radix-popover-trigger-width) overflow-hidden p-0",align:"start",children:(0,b.jsxs)("div",{className:"flex transition-transform duration-200 ease-in-out",style:{transform:`translateX(${1===u?"-50%":"0%"})`,width:"200%"},children:[(0,b.jsxs)("div",{className:"w-1/2 shrink-0",children:[(0,b.jsx)("div",{className:"text-muted-foreground border-b px-3 py-2 text-xs font-medium",children:"Select agent"}),k.map(a=>{let c=(0,C.getAgentTypeIcon)(a.agentType),d=o===a.agentType,e=a.models.length>0;return(0,b.jsxs)("button",{type:"button",className:(0,v.cn)("flex w-full cursor-pointer items-center gap-2.5 px-3 py-2 text-xs transition-colors","hover:bg-accent hover:text-accent-foreground",d&&"bg-accent/50"),onClick:()=>{e?(H(a.agentType),requestAnimationFrame(()=>{requestAnimationFrame(()=>w(1))})):I(a.agentType,"")},children:[(0,b.jsx)(c,{className:"h-4 w-4 shrink-0"}),(0,b.jsx)("span",{className:"flex-1 text-left",children:a.label}),d&&!e?(0,b.jsx)(x.Check,{className:"text-primary h-3.5 w-3.5 shrink-0"}):null,e?(0,b.jsx)(z.ChevronRight,{className:"text-muted-foreground h-3.5 w-3.5 shrink-0"}):null]},a.agentType)})]}),(0,b.jsx)("div",{className:"w-1/2 shrink-0",children:M?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("button",{type:"button",className:"text-muted-foreground hover:text-foreground flex w-full cursor-pointer items-center gap-1.5 border-b px-3 py-2 text-xs font-medium transition-colors",onClick:()=>{w(0),setTimeout(()=>H(null),220)},children:[(0,b.jsx)(y.ChevronLeft,{className:"h-3.5 w-3.5"}),M.label]}),M.models.map(a=>{let c=o===M.agentType&&q===a.id;return(0,b.jsxs)("button",{type:"button",className:(0,v.cn)("flex w-full cursor-pointer items-center gap-3 px-3 py-2 text-left transition-colors","hover:bg-accent hover:text-accent-foreground",c&&"bg-accent/50"),onClick:()=>I(M.agentType,a.id),children:[(0,b.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("span",{className:"text-xs font-medium",children:a.displayName}),(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:a.description})]}),c?(0,b.jsx)(x.Check,{className:"text-primary h-3.5 w-3.5 shrink-0"}):null]},a.id)})]}):null})]})})]}),!!s&&(0,b.jsx)("p",{className:"text-destructive text-sm",children:s})]})}a.s(["AgentModelPicker",()=>G],61781)}];
2
-
3
- //# sourceMappingURL=src_presentation_web_36c89258._.js.map