@knpkv/codecommit-core 0.3.0 → 0.5.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 (210) hide show
  1. package/README.md +66 -0
  2. package/dist/AwsClient/createPullRequest.d.ts +1 -6
  3. package/dist/AwsClient/createPullRequest.d.ts.map +1 -1
  4. package/dist/AwsClient/createPullRequest.js +3 -11
  5. package/dist/AwsClient/createPullRequest.js.map +1 -1
  6. package/dist/AwsClient/getCallerIdentity.d.ts +5 -6
  7. package/dist/AwsClient/getCallerIdentity.d.ts.map +1 -1
  8. package/dist/AwsClient/getCallerIdentity.js +7 -12
  9. package/dist/AwsClient/getCallerIdentity.js.map +1 -1
  10. package/dist/AwsClient/getCommentsForPullRequest.d.ts +1 -6
  11. package/dist/AwsClient/getCommentsForPullRequest.d.ts.map +1 -1
  12. package/dist/AwsClient/getCommentsForPullRequest.js +9 -16
  13. package/dist/AwsClient/getCommentsForPullRequest.js.map +1 -1
  14. package/dist/AwsClient/getPullRequest.d.ts +2 -7
  15. package/dist/AwsClient/getPullRequest.d.ts.map +1 -1
  16. package/dist/AwsClient/getPullRequest.js +15 -28
  17. package/dist/AwsClient/getPullRequest.js.map +1 -1
  18. package/dist/AwsClient/getPullRequests.d.ts.map +1 -1
  19. package/dist/AwsClient/getPullRequests.js +18 -15
  20. package/dist/AwsClient/getPullRequests.js.map +1 -1
  21. package/dist/AwsClient/index.d.ts +3 -2
  22. package/dist/AwsClient/index.d.ts.map +1 -1
  23. package/dist/AwsClient/index.js.map +1 -1
  24. package/dist/AwsClient/internal.d.ts +47 -11
  25. package/dist/AwsClient/internal.d.ts.map +1 -1
  26. package/dist/AwsClient/internal.js +38 -9
  27. package/dist/AwsClient/internal.js.map +1 -1
  28. package/dist/AwsClient/listBranches.d.ts +1 -6
  29. package/dist/AwsClient/listBranches.d.ts.map +1 -1
  30. package/dist/AwsClient/listBranches.js +3 -11
  31. package/dist/AwsClient/listBranches.js.map +1 -1
  32. package/dist/AwsClient/updatePullRequestDescription.d.ts +1 -6
  33. package/dist/AwsClient/updatePullRequestDescription.d.ts.map +1 -1
  34. package/dist/AwsClient/updatePullRequestDescription.js +3 -11
  35. package/dist/AwsClient/updatePullRequestDescription.js.map +1 -1
  36. package/dist/AwsClient/updatePullRequestTitle.d.ts +1 -6
  37. package/dist/AwsClient/updatePullRequestTitle.d.ts.map +1 -1
  38. package/dist/AwsClient/updatePullRequestTitle.js +3 -11
  39. package/dist/AwsClient/updatePullRequestTitle.js.map +1 -1
  40. package/dist/CacheService/CacheError.d.ts +21 -0
  41. package/dist/CacheService/CacheError.d.ts.map +1 -0
  42. package/dist/CacheService/CacheError.js +17 -0
  43. package/dist/CacheService/CacheError.js.map +1 -0
  44. package/dist/CacheService/Database.d.ts +13 -0
  45. package/dist/CacheService/Database.d.ts.map +1 -0
  46. package/dist/CacheService/Database.js +38 -0
  47. package/dist/CacheService/Database.js.map +1 -0
  48. package/dist/CacheService/EventsHub.d.ts +183 -0
  49. package/dist/CacheService/EventsHub.d.ts.map +1 -0
  50. package/dist/CacheService/EventsHub.js +22 -0
  51. package/dist/CacheService/EventsHub.js.map +1 -0
  52. package/dist/CacheService/diff.d.ts +28 -0
  53. package/dist/CacheService/diff.d.ts.map +1 -0
  54. package/dist/CacheService/diff.js +102 -0
  55. package/dist/CacheService/diff.js.map +1 -0
  56. package/dist/CacheService/index.d.ts +19 -0
  57. package/dist/CacheService/index.d.ts.map +1 -0
  58. package/dist/CacheService/index.js +16 -0
  59. package/dist/CacheService/index.js.map +1 -0
  60. package/dist/CacheService/migrations/0001_initial.d.ts +5 -0
  61. package/dist/CacheService/migrations/0001_initial.d.ts.map +1 -0
  62. package/dist/CacheService/migrations/0001_initial.js +72 -0
  63. package/dist/CacheService/migrations/0001_initial.js.map +1 -0
  64. package/dist/CacheService/migrations/0002_indexes.d.ts +5 -0
  65. package/dist/CacheService/migrations/0002_indexes.d.ts.map +1 -0
  66. package/dist/CacheService/migrations/0002_indexes.js +7 -0
  67. package/dist/CacheService/migrations/0002_indexes.js.map +1 -0
  68. package/dist/CacheService/migrations/0003_add_health_score.d.ts +5 -0
  69. package/dist/CacheService/migrations/0003_add_health_score.d.ts.map +1 -0
  70. package/dist/CacheService/migrations/0003_add_health_score.js +4 -0
  71. package/dist/CacheService/migrations/0003_add_health_score.js.map +1 -0
  72. package/dist/CacheService/migrations/0004_unify_notifications.d.ts +5 -0
  73. package/dist/CacheService/migrations/0004_unify_notifications.d.ts.map +1 -0
  74. package/dist/CacheService/migrations/0004_unify_notifications.js +7 -0
  75. package/dist/CacheService/migrations/0004_unify_notifications.js.map +1 -0
  76. package/dist/CacheService/migrations/0005_add_sandboxes.d.ts +5 -0
  77. package/dist/CacheService/migrations/0005_add_sandboxes.d.ts.map +1 -0
  78. package/dist/CacheService/migrations/0005_add_sandboxes.js +23 -0
  79. package/dist/CacheService/migrations/0005_add_sandboxes.js.map +1 -0
  80. package/dist/CacheService/migrations/0006_sandbox_logs.d.ts +5 -0
  81. package/dist/CacheService/migrations/0006_sandbox_logs.d.ts.map +1 -0
  82. package/dist/CacheService/migrations/0006_sandbox_logs.js +7 -0
  83. package/dist/CacheService/migrations/0006_sandbox_logs.js.map +1 -0
  84. package/dist/CacheService/repos/CommentRepo.d.ts +16 -0
  85. package/dist/CacheService/repos/CommentRepo.d.ts.map +1 -0
  86. package/dist/CacheService/repos/CommentRepo.js +42 -0
  87. package/dist/CacheService/repos/CommentRepo.js.map +1 -0
  88. package/dist/CacheService/repos/NotificationRepo.d.ts +48 -0
  89. package/dist/CacheService/repos/NotificationRepo.d.ts.map +1 -0
  90. package/dist/CacheService/repos/NotificationRepo.js +128 -0
  91. package/dist/CacheService/repos/NotificationRepo.js.map +1 -0
  92. package/dist/CacheService/repos/PullRequestRepo.d.ts +112 -0
  93. package/dist/CacheService/repos/PullRequestRepo.d.ts.map +1 -0
  94. package/dist/CacheService/repos/PullRequestRepo.js +146 -0
  95. package/dist/CacheService/repos/PullRequestRepo.js.map +1 -0
  96. package/dist/CacheService/repos/SandboxRepo.d.ts +116 -0
  97. package/dist/CacheService/repos/SandboxRepo.d.ts.map +1 -0
  98. package/dist/CacheService/repos/SandboxRepo.js +88 -0
  99. package/dist/CacheService/repos/SandboxRepo.js.map +1 -0
  100. package/dist/CacheService/repos/SubscriptionRepo.d.ts +20 -0
  101. package/dist/CacheService/repos/SubscriptionRepo.d.ts.map +1 -0
  102. package/dist/CacheService/repos/SubscriptionRepo.js +49 -0
  103. package/dist/CacheService/repos/SubscriptionRepo.js.map +1 -0
  104. package/dist/CacheService/repos/SyncMetadataRepo.d.ts +14 -0
  105. package/dist/CacheService/repos/SyncMetadataRepo.d.ts.map +1 -0
  106. package/dist/CacheService/repos/SyncMetadataRepo.js +36 -0
  107. package/dist/CacheService/repos/SyncMetadataRepo.js.map +1 -0
  108. package/dist/ConfigService/backup.d.ts +1 -1
  109. package/dist/ConfigService/detectProfiles.d.ts +1 -1
  110. package/dist/ConfigService/index.d.ts +3 -2
  111. package/dist/ConfigService/index.d.ts.map +1 -1
  112. package/dist/ConfigService/index.js +4 -2
  113. package/dist/ConfigService/index.js.map +1 -1
  114. package/dist/ConfigService/internal.d.ts +104 -0
  115. package/dist/ConfigService/internal.d.ts.map +1 -1
  116. package/dist/ConfigService/internal.js +18 -1
  117. package/dist/ConfigService/internal.js.map +1 -1
  118. package/dist/ConfigService/load.d.ts +18 -1
  119. package/dist/ConfigService/load.d.ts.map +1 -1
  120. package/dist/ConfigService/load.js +12 -3
  121. package/dist/ConfigService/load.js.map +1 -1
  122. package/dist/ConfigService/reset.d.ts.map +1 -1
  123. package/dist/ConfigService/reset.js +5 -2
  124. package/dist/ConfigService/reset.js.map +1 -1
  125. package/dist/ConfigService/save.d.ts +1 -1
  126. package/dist/ConfigService/validate.d.ts +1 -1
  127. package/dist/DateUtils.d.ts +1 -1
  128. package/dist/DateUtils.d.ts.map +1 -1
  129. package/dist/DateUtils.js +2 -2
  130. package/dist/DateUtils.js.map +1 -1
  131. package/dist/Domain.d.ts +251 -10
  132. package/dist/Domain.d.ts.map +1 -1
  133. package/dist/Domain.js +55 -5
  134. package/dist/Domain.js.map +1 -1
  135. package/dist/Errors.d.ts +28 -1
  136. package/dist/Errors.d.ts.map +1 -1
  137. package/dist/Errors.js +22 -1
  138. package/dist/Errors.js.map +1 -1
  139. package/dist/HealthScore.d.ts.map +1 -1
  140. package/dist/HealthScore.js +1 -3
  141. package/dist/HealthScore.js.map +1 -1
  142. package/dist/PRService/index.d.ts +46 -18
  143. package/dist/PRService/index.d.ts.map +1 -1
  144. package/dist/PRService/index.js +58 -27
  145. package/dist/PRService/index.js.map +1 -1
  146. package/dist/PRService/internal.d.ts +86 -1
  147. package/dist/PRService/internal.d.ts.map +1 -1
  148. package/dist/PRService/internal.js +106 -1
  149. package/dist/PRService/internal.js.map +1 -1
  150. package/dist/PRService/refresh.d.ts +10 -4
  151. package/dist/PRService/refresh.d.ts.map +1 -1
  152. package/dist/PRService/refresh.js +30 -89
  153. package/dist/PRService/refresh.js.map +1 -1
  154. package/dist/PRService/refreshEnrich.d.ts +15 -0
  155. package/dist/PRService/refreshEnrich.d.ts.map +1 -0
  156. package/dist/PRService/refreshEnrich.js +72 -0
  157. package/dist/PRService/refreshEnrich.js.map +1 -0
  158. package/dist/PRService/refreshFetch.d.ts +20 -0
  159. package/dist/PRService/refreshFetch.d.ts.map +1 -0
  160. package/dist/PRService/refreshFetch.js +78 -0
  161. package/dist/PRService/refreshFetch.js.map +1 -0
  162. package/dist/PRService/refreshResolve.d.ts +29 -0
  163. package/dist/PRService/refreshResolve.d.ts.map +1 -0
  164. package/dist/PRService/refreshResolve.js +84 -0
  165. package/dist/PRService/refreshResolve.js.map +1 -0
  166. package/dist/PRService/refreshScore.d.ts +9 -0
  167. package/dist/PRService/refreshScore.d.ts.map +1 -0
  168. package/dist/PRService/refreshScore.js +24 -0
  169. package/dist/PRService/refreshScore.js.map +1 -0
  170. package/dist/PRService/refreshSinglePR.d.ts +13 -0
  171. package/dist/PRService/refreshSinglePR.d.ts.map +1 -0
  172. package/dist/PRService/refreshSinglePR.js +102 -0
  173. package/dist/PRService/refreshSinglePR.js.map +1 -0
  174. package/dist/PRService/setAllAccounts.d.ts +1 -3
  175. package/dist/PRService/setAllAccounts.d.ts.map +1 -1
  176. package/dist/PRService/setAllAccounts.js +2 -2
  177. package/dist/PRService/setAllAccounts.js.map +1 -1
  178. package/dist/PRService/toggleAccount.d.ts +1 -3
  179. package/dist/PRService/toggleAccount.d.ts.map +1 -1
  180. package/dist/PRService/toggleAccount.js +2 -2
  181. package/dist/PRService/toggleAccount.js.map +1 -1
  182. package/dist/SandboxService/DockerService.d.ts +57 -0
  183. package/dist/SandboxService/DockerService.d.ts.map +1 -0
  184. package/dist/SandboxService/DockerService.js +83 -0
  185. package/dist/SandboxService/DockerService.js.map +1 -0
  186. package/dist/SandboxService/PluginService.d.ts +38 -0
  187. package/dist/SandboxService/PluginService.d.ts.map +1 -0
  188. package/dist/SandboxService/PluginService.js +26 -0
  189. package/dist/SandboxService/PluginService.js.map +1 -0
  190. package/dist/SandboxService/SandboxService.d.ts +102 -0
  191. package/dist/SandboxService/SandboxService.d.ts.map +1 -0
  192. package/dist/SandboxService/SandboxService.js +272 -0
  193. package/dist/SandboxService/SandboxService.js.map +1 -0
  194. package/dist/SandboxService/index.d.ts +13 -0
  195. package/dist/SandboxService/index.d.ts.map +1 -0
  196. package/dist/SandboxService/index.js +10 -0
  197. package/dist/SandboxService/index.js.map +1 -0
  198. package/dist/SandboxService/plugins/ClaudeCodePlugin.d.ts +18 -0
  199. package/dist/SandboxService/plugins/ClaudeCodePlugin.d.ts.map +1 -0
  200. package/dist/SandboxService/plugins/ClaudeCodePlugin.js +24 -0
  201. package/dist/SandboxService/plugins/ClaudeCodePlugin.js.map +1 -0
  202. package/dist/index.d.ts +2 -1
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +2 -1
  205. package/dist/index.js.map +1 -1
  206. package/package.json +4 -1
  207. package/dist/NotificationsService.d.ts +0 -46
  208. package/dist/NotificationsService.d.ts.map +0 -1
  209. package/dist/NotificationsService.js +0 -57
  210. package/dist/NotificationsService.js.map +0 -1
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Sandbox orchestration service.
3
+ *
4
+ * Ties together DockerService, PluginService, SandboxRepo
5
+ * to manage sandbox lifecycle: create → run → stop → cleanup.
6
+ *
7
+ * @module
8
+ */
9
+ import { FileSystem } from "@effect/platform";
10
+ import { Duration, Effect } from "effect";
11
+ import { SandboxRepo } from "../CacheService/repos/SandboxRepo.js";
12
+ import { ConfigService } from "../ConfigService/index.js";
13
+ import { SandboxId } from "../Domain.js";
14
+ import { SandboxError } from "../Errors.js";
15
+ import { DockerService } from "./DockerService.js";
16
+ import { PluginService } from "./PluginService.js";
17
+ export interface CreateSandboxParams {
18
+ readonly pullRequestId: string;
19
+ readonly awsAccountId: string;
20
+ readonly repositoryName: string;
21
+ readonly sourceBranch: string;
22
+ readonly profile: string;
23
+ readonly region: string;
24
+ }
25
+ declare const SandboxService_base: Effect.Service.Class<SandboxService, "SandboxService", {
26
+ readonly dependencies: readonly [import("effect/Layer").Layer<SandboxRepo, import("@effect/sql/SqlError").SqlError | import("effect/ConfigError").ConfigError | import("@effect/sql/Migrator").MigrationError, FileSystem.FileSystem>, import("effect/Layer").Layer<DockerService, never, import("@effect/platform/CommandExecutor").CommandExecutor>, import("effect/Layer").Layer<PluginService, never, never>];
27
+ readonly effect: Effect.Effect<{
28
+ readonly create: (params: CreateSandboxParams) => Effect.Effect<{
29
+ readonly error: string | null;
30
+ readonly awsAccountId: string;
31
+ readonly id: string;
32
+ readonly repositoryName: string;
33
+ readonly status: string;
34
+ readonly sourceBranch: string;
35
+ readonly pullRequestId: string;
36
+ readonly workspacePath: string;
37
+ readonly createdAt: string;
38
+ readonly lastActivityAt: string;
39
+ readonly containerId: string | null;
40
+ readonly port: number | null;
41
+ readonly statusDetail: string | null;
42
+ readonly logs: string | null;
43
+ }, SandboxError, FileSystem.FileSystem | import("effect/Scope").Scope | import("@effect/platform/CommandExecutor").CommandExecutor>;
44
+ readonly get: (id: SandboxId) => Effect.Effect<{
45
+ readonly error: string | null;
46
+ readonly awsAccountId: string;
47
+ readonly id: string;
48
+ readonly repositoryName: string;
49
+ readonly status: string;
50
+ readonly sourceBranch: string;
51
+ readonly pullRequestId: string;
52
+ readonly workspacePath: string;
53
+ readonly createdAt: string;
54
+ readonly lastActivityAt: string;
55
+ readonly containerId: string | null;
56
+ readonly port: number | null;
57
+ readonly statusDetail: string | null;
58
+ readonly logs: string | null;
59
+ }, SandboxError, never>;
60
+ readonly list: () => Effect.Effect<readonly {
61
+ readonly error: string | null;
62
+ readonly awsAccountId: string;
63
+ readonly id: string;
64
+ readonly repositoryName: string;
65
+ readonly status: string;
66
+ readonly sourceBranch: string;
67
+ readonly pullRequestId: string;
68
+ readonly workspacePath: string;
69
+ readonly createdAt: string;
70
+ readonly lastActivityAt: string;
71
+ readonly containerId: string | null;
72
+ readonly port: number | null;
73
+ readonly statusDetail: string | null;
74
+ readonly logs: string | null;
75
+ }[], import("../CacheService/CacheError.ts").CacheError, never>;
76
+ readonly listAll: () => Effect.Effect<readonly {
77
+ readonly error: string | null;
78
+ readonly awsAccountId: string;
79
+ readonly id: string;
80
+ readonly repositoryName: string;
81
+ readonly status: string;
82
+ readonly sourceBranch: string;
83
+ readonly pullRequestId: string;
84
+ readonly workspacePath: string;
85
+ readonly createdAt: string;
86
+ readonly lastActivityAt: string;
87
+ readonly containerId: string | null;
88
+ readonly port: number | null;
89
+ readonly statusDetail: string | null;
90
+ readonly logs: string | null;
91
+ }[], import("../CacheService/CacheError.ts").CacheError, never>;
92
+ readonly stop: (id: SandboxId) => Effect.Effect<void, SandboxError, never>;
93
+ readonly restart: (id: SandboxId) => Effect.Effect<undefined, SandboxError, never>;
94
+ readonly cleanup: (id: SandboxId) => Effect.Effect<void, SandboxError, FileSystem.FileSystem>;
95
+ readonly reconcile: () => Effect.Effect<void, never, never>;
96
+ readonly gcIdle: (idleTimeout?: Duration.Duration, cleanupDelay?: Duration.Duration) => Effect.Effect<void, never, FileSystem.FileSystem>;
97
+ }, never, SandboxRepo | ConfigService | DockerService | PluginService>;
98
+ }>;
99
+ export declare class SandboxService extends SandboxService_base {
100
+ }
101
+ export {};
102
+ //# sourceMappingURL=SandboxService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SandboxService.d.ts","sourceRoot":"","sources":["../../src/SandboxService/SandboxService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAW,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAwB,QAAQ,EAAE,MAAM,EAAoC,MAAM,QAAQ,CAAA;AACjG,OAAO,EAAE,WAAW,EAAmB,MAAM,sCAAsC,CAAA;AACnF,OAAO,EAAE,aAAa,EAA4C,MAAM,2BAA2B,CAAA;AACnG,OAAO,EAAiC,SAAS,EAAsB,MAAM,cAAc,CAAA;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAwB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAExE,OAAO,EAAE,aAAa,EAAuB,MAAM,oBAAoB,CAAA;AAEvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;;;;kCA6GsB,mBAAmB;;;;;;;;;;;;;;;;2BAgL1B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BASR,SAAS;+BAiBN,SAAS;+BAiCT,SAAS;;;;;AAvS7B,qBAAa,cAAe,SAAQ,mBAyXlC;CAAG"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Sandbox orchestration service.
3
+ *
4
+ * Ties together DockerService, PluginService, SandboxRepo
5
+ * to manage sandbox lifecycle: create → run → stop → cleanup.
6
+ *
7
+ * @module
8
+ */
9
+ import { Command, FileSystem } from "@effect/platform";
10
+ import { Cause, Clock, Config, Duration, Effect, Option, Random, Schedule, Stream } from "effect";
11
+ import { SandboxRepo } from "../CacheService/repos/SandboxRepo.js";
12
+ import { ConfigService, defaultSandboxConfig } from "../ConfigService/index.js";
13
+ import { PullRequestId, RepositoryName, SandboxId } from "../Domain.js";
14
+ import { SandboxError } from "../Errors.js";
15
+ import { DockerService } from "./DockerService.js";
16
+ import { makeClaudeCodePlugin } from "./plugins/ClaudeCodePlugin.js";
17
+ import { PluginService } from "./PluginService.js";
18
+ const SANDBOX_BASE_PORT = 18080;
19
+ const homeDir = Config.string("HOME").pipe(Config.orElse(() => Config.string("USERPROFILE")));
20
+ const sandboxesDir = homeDir.pipe(Config.map((h) => `${h}/.codecommit/sandboxes`));
21
+ const anthropicApiKey = Config.string("ANTHROPIC_API_KEY").pipe(Config.option);
22
+ const expandHome = (p, home) => p.startsWith("~/") ? `${home}${p.slice(1)}` : p;
23
+ const makeContainerConfig = (workspacePath, port, sandboxId, pullRequestId, apiKey, sandboxConfig, homePath) => ({
24
+ Image: sandboxConfig.image,
25
+ Cmd: ["--bind-addr", "0.0.0.0:8080", "--auth", "none", "/workspace"],
26
+ ExposedPorts: { "8080/tcp": {} },
27
+ HostConfig: {
28
+ Binds: [
29
+ `${workspacePath}:/workspace`,
30
+ ...sandboxConfig.volumeMounts.map((m) => `${expandHome(m.hostPath, homePath)}:${m.containerPath}${m.readonly ? ":ro" : ""}`)
31
+ ],
32
+ PortBindings: { "8080/tcp": [{ HostPort: String(port) }] }
33
+ },
34
+ Env: [
35
+ ...(Option.isSome(apiKey) ? [`ANTHROPIC_API_KEY=${apiKey.value}`] : []),
36
+ ...Object.entries(sandboxConfig.env).map(([k, v]) => `${k}=${v}`)
37
+ ],
38
+ Labels: {
39
+ "codecommit.sandbox.id": sandboxId,
40
+ "codecommit.sandbox.pr": pullRequestId
41
+ }
42
+ });
43
+ export class SandboxService extends Effect.Service()("SandboxService", {
44
+ dependencies: [SandboxRepo.Default, DockerService.Default, PluginService.Default],
45
+ effect: Effect.gen(function* () {
46
+ const repo = yield* SandboxRepo;
47
+ const docker = yield* DockerService;
48
+ const plugins = yield* PluginService;
49
+ const configService = yield* ConfigService;
50
+ const homePath = yield* homeDir.pipe(Effect.orDie);
51
+ const basePath = yield* sandboxesDir.pipe(Effect.orDie);
52
+ const apiKey = yield* anthropicApiKey.pipe(Effect.orDie);
53
+ const loadSandboxConfig = configService.load.pipe(Effect.map((c) => c.sandbox), Effect.catchAll(() => Effect.succeed(defaultSandboxConfig)));
54
+ // Register built-in plugins conditionally based on config
55
+ yield* Effect.gen(function* () {
56
+ const sandboxCfg = yield* loadSandboxConfig;
57
+ if (sandboxCfg.enableClaudeCode) {
58
+ yield* plugins.register(makeClaudeCodePlugin((containerId, cmd) => docker.exec(containerId, cmd).pipe(Effect.catchAll(() => Effect.void))));
59
+ }
60
+ });
61
+ const updateStatus = (id, status, extra) => repo.updateStatus(id, status, extra);
62
+ const progress = (id, detail) => Clock.currentTimeMillis.pipe(Effect.flatMap((ms) => {
63
+ const ts = new Date(ms).toISOString();
64
+ return repo.updateDetail(id, detail).pipe(Effect.tap(() => repo.appendLog(id, `[${ts}] ${detail}`)), Effect.tap(() => Effect.logInfo(`Sandbox ${id}: ${detail}`)));
65
+ }));
66
+ const allocatePort = () => Random.nextIntBetween(SANDBOX_BASE_PORT, SANDBOX_BASE_PORT + 1000);
67
+ const makeSandboxContext = (row) => ({
68
+ sandboxId: SandboxId.make(row.id),
69
+ containerId: row.containerId ?? "",
70
+ workspacePath: row.workspacePath,
71
+ port: row.port ?? 0,
72
+ pr: {
73
+ id: PullRequestId.make(row.pullRequestId),
74
+ repositoryName: RepositoryName.make(row.repositoryName),
75
+ sourceBranch: row.sourceBranch
76
+ }
77
+ });
78
+ return {
79
+ create: (params) => Effect.gen(function* () {
80
+ // Singleton check — one active sandbox per PR
81
+ const existing = yield* repo.findByPr(params.awsAccountId, params.pullRequestId);
82
+ if (Option.isSome(existing)) {
83
+ return existing.value;
84
+ }
85
+ const nowMs = yield* Clock.currentTimeMillis;
86
+ const rand = yield* Random.nextIntBetween(0, 2176782336);
87
+ const id = SandboxId.make(`sbx-${nowMs}-${rand.toString(36).padStart(6, "0")}`);
88
+ const port = yield* allocatePort();
89
+ const workspacePath = `${basePath}/${id}`;
90
+ const now = new Date(nowMs).toISOString();
91
+ yield* repo.insert({
92
+ id,
93
+ pullRequestId: params.pullRequestId,
94
+ awsAccountId: params.awsAccountId,
95
+ repositoryName: params.repositoryName,
96
+ sourceBranch: params.sourceBranch,
97
+ workspacePath,
98
+ status: "creating",
99
+ createdAt: now,
100
+ lastActivityAt: now
101
+ });
102
+ // Fork daemon for async lifecycle
103
+ yield* Effect.forkDaemon(Effect.gen(function* () {
104
+ const fs = yield* FileSystem.FileSystem;
105
+ const log = (detail) => progress(id, detail);
106
+ // Load config at creation time
107
+ yield* log("Loading sandbox config");
108
+ const sandboxCfg = yield* loadSandboxConfig;
109
+ // Clone via HTTPS + AWS credential helper
110
+ yield* updateStatus(id, "cloning");
111
+ yield* fs.makeDirectory(workspacePath, { recursive: true });
112
+ const cloneUrl = `https://git-codecommit.${params.region}.amazonaws.com/v1/repos/${params.repositoryName}`;
113
+ const branch = params.sourceBranch.replace(/^refs\/heads\//, "");
114
+ const depthLabel = sandboxCfg.cloneDepth > 0 ? ` (depth ${sandboxCfg.cloneDepth})` : "";
115
+ yield* log(`Cloning ${params.repositoryName}/${branch}${depthLabel}`);
116
+ const depthArgs = sandboxCfg.cloneDepth > 0
117
+ ? ["--depth", String(sandboxCfg.cloneDepth)]
118
+ : [];
119
+ const cloneProc = yield* Command.make("git", "-c", "credential.helper=!aws codecommit credential-helper $@", "-c", "credential.UseHttpPath=true", "clone", ...depthArgs, "-b", branch, cloneUrl, workspacePath).pipe(Command.env({ AWS_PROFILE: params.profile, AWS_DEFAULT_REGION: params.region }), Command.stderr("pipe"), Command.start);
120
+ const exitCode = yield* cloneProc.exitCode;
121
+ if (exitCode !== 0) {
122
+ const stderrChunks = yield* Stream.runCollect(cloneProc.stderr);
123
+ const stderrText = Array.from(stderrChunks).map((c) => new TextDecoder().decode(c)).join("").trim();
124
+ yield* log(`Clone failed: ${stderrText}`);
125
+ yield* updateStatus(id, "error", { error: stderrText || `git clone failed (exit ${exitCode})` });
126
+ return;
127
+ }
128
+ yield* log("Clone complete");
129
+ // Pull image
130
+ yield* updateStatus(id, "starting");
131
+ yield* log(`Pulling image ${sandboxCfg.image}`);
132
+ yield* docker.pullImage(sandboxCfg.image).pipe(Effect.tap(() => log("Image ready")), Effect.catchAll(() => log("Image pull skipped (using cached)")));
133
+ // Create + start container
134
+ yield* log("Creating container");
135
+ const containerConfig = makeContainerConfig(workspacePath, port, id, params.pullRequestId, apiKey, sandboxCfg, homePath);
136
+ const containerId = yield* docker.createContainer(containerConfig);
137
+ const cid = containerId.trim();
138
+ yield* log(`Container ${cid.slice(0, 12)} created, starting`);
139
+ yield* docker.startContainer(cid);
140
+ yield* updateStatus(id, "starting", { containerId: cid, port });
141
+ yield* log(`Container started on port ${port}`);
142
+ // Fix ownership of dirs that Docker may have created as root (from volume mounts)
143
+ yield* docker.exec(cid, [
144
+ "sudo",
145
+ "chown",
146
+ "-R",
147
+ "coder:coder",
148
+ "/home/coder/.local"
149
+ ]).pipe(Effect.catchAll(() => Effect.void));
150
+ // Wait for code-server to be ready (poll health)
151
+ yield* log("Waiting for code-server health check");
152
+ yield* docker.exec(cid, ["curl", "-sf", "http://localhost:8080/healthz"]).pipe(Effect.retry(Schedule.recurs(30).pipe(Schedule.intersect(Schedule.spaced(Duration.seconds(1))))), Effect.tap(() => log("code-server ready")), Effect.tapError((e) => log(`Health check failed: ${String(e)}`)), Effect.catchAll(() => Effect.void));
153
+ // Run plugin hooks
154
+ const row = yield* repo.findById(id);
155
+ const ctx = makeSandboxContext(row);
156
+ yield* log("Running plugin hooks");
157
+ yield* plugins.executeHook("onSandboxCreate", ctx);
158
+ yield* plugins.executeHook("onSandboxReady", ctx);
159
+ // Install configured extensions
160
+ if (sandboxCfg.extensions.length > 0) {
161
+ yield* log(`Installing ${sandboxCfg.extensions.length} extension(s)`);
162
+ yield* Effect.forEach(sandboxCfg.extensions, (ext) => log(`Installing extension: ${ext}`).pipe(Effect.zipRight(docker.exec(cid, ["code-server", "--install-extension", ext])), Effect.tap((output) => log(`Extension installed: ${ext}${output ? `\n${output.trim()}` : ""}`)), Effect.tapError((e) => log(`Extension failed: ${ext} — ${String(e)}`)), Effect.catchAll(() => Effect.void)), { discard: true });
163
+ }
164
+ // Run configured setup commands
165
+ if (sandboxCfg.setupCommands.length > 0) {
166
+ yield* log(`Running ${sandboxCfg.setupCommands.length} setup command(s)`);
167
+ yield* Effect.forEach(sandboxCfg.setupCommands, (cmd, i) => log(`[${i + 1}/${sandboxCfg.setupCommands.length}] ${cmd}`).pipe(Effect.zipRight(docker.exec(cid, ["sh", "-c", cmd])), Effect.tap((output) => log(`Command done: ${cmd.slice(0, 60)}${output ? `\n${output.trim()}` : ""}`)), Effect.tapError((e) => log(`Command failed: ${cmd.slice(0, 60)} — ${String(e)}`)), Effect.catchAll(() => Effect.void)), { discard: true });
168
+ }
169
+ yield* updateStatus(id, "running");
170
+ yield* log("Sandbox ready");
171
+ }).pipe(Effect.catchAllCause((cause) => Effect.gen(function* () {
172
+ yield* Effect.logError(`Sandbox ${id} creation failed`, cause);
173
+ const squashed = Cause.squash(cause);
174
+ const errorDetail = squashed instanceof Error ? squashed.message : String(squashed);
175
+ yield* updateStatus(id, "error", { error: errorDetail.slice(0, 500) }).pipe(Effect.catchAll((statusErr) => Effect.logError("Failed to update sandbox error status", statusErr)));
176
+ }))));
177
+ return yield* repo.findById(id);
178
+ }).pipe(Effect.mapError((cause) => new SandboxError({ message: "Failed to create sandbox", cause }))),
179
+ get: (id) => repo.findById(id).pipe(Effect.mapError((cause) => new SandboxError({ sandboxId: id, message: "Sandbox not found", cause }))),
180
+ list: () => repo.findActive(),
181
+ listAll: () => repo.findAll(),
182
+ stop: (id) => Effect.gen(function* () {
183
+ const row = yield* repo.findById(id);
184
+ yield* updateStatus(id, "stopping");
185
+ if (row.containerId) {
186
+ const ctx = makeSandboxContext(row);
187
+ yield* plugins.executeHook("onSandboxDestroy", ctx);
188
+ yield* docker.stopContainer(row.containerId).pipe(Effect.catchAll(() => Effect.void));
189
+ }
190
+ yield* updateStatus(id, "stopped");
191
+ yield* Effect.logInfo(`Sandbox ${id} stopped`);
192
+ }).pipe(Effect.mapError((cause) => new SandboxError({ sandboxId: id, message: "Failed to stop sandbox", cause }))),
193
+ restart: (id) => Effect.gen(function* () {
194
+ const row = yield* repo.findById(id);
195
+ if (!row.containerId) {
196
+ return yield* Effect.fail(new SandboxError({ sandboxId: id, message: "No container to restart" }));
197
+ }
198
+ yield* updateStatus(id, "starting");
199
+ yield* progress(id, "Restarting container");
200
+ yield* docker.startContainer(row.containerId);
201
+ yield* updateStatus(id, "starting", row.port ? { port: row.port } : {});
202
+ yield* progress(id, "Waiting for code-server health check");
203
+ yield* docker.exec(row.containerId, ["curl", "-sf", "http://localhost:8080/healthz"]).pipe(Effect.retry(Schedule.recurs(30).pipe(Schedule.intersect(Schedule.spaced(Duration.seconds(1))))), Effect.tap(() => progress(id, "code-server ready")), Effect.catchAll(() => Effect.void));
204
+ const ctx = makeSandboxContext(yield* repo.findById(id));
205
+ yield* plugins.executeHook("onSandboxReady", ctx);
206
+ yield* updateStatus(id, "running");
207
+ yield* progress(id, "Sandbox restarted");
208
+ yield* Effect.logInfo(`Sandbox ${id} restarted`);
209
+ }).pipe(Effect.mapError((cause) => new SandboxError({ sandboxId: id, message: "Failed to restart sandbox", cause }))),
210
+ cleanup: (id) => Effect.gen(function* () {
211
+ const row = yield* repo.findById(id);
212
+ const fs = yield* FileSystem.FileSystem;
213
+ if (row.containerId) {
214
+ yield* docker.removeContainer(row.containerId).pipe(Effect.catchAll(() => Effect.void));
215
+ }
216
+ yield* fs.remove(row.workspacePath, { recursive: true }).pipe(Effect.catchAll(() => Effect.void));
217
+ yield* repo.delete(id);
218
+ yield* Effect.logInfo(`Sandbox ${id} cleaned up`);
219
+ }).pipe(Effect.mapError((cause) => new SandboxError({ sandboxId: id, message: "Failed to cleanup sandbox", cause }))),
220
+ reconcile: () => Effect.gen(function* () {
221
+ const active = yield* repo.findActive();
222
+ yield* Effect.forEach(active, (row) => Effect.gen(function* () {
223
+ if (!row.containerId) {
224
+ yield* updateStatus(SandboxId.make(row.id), "error", { error: "Orphaned (no container)" });
225
+ return;
226
+ }
227
+ const info = yield* docker.inspectContainer(row.containerId).pipe(Effect.catchAll(() => Effect.succeed(null)));
228
+ if (!info || !info.State.Running) {
229
+ yield* updateStatus(SandboxId.make(row.id), "stopped");
230
+ yield* Effect.logInfo(`Reconciled orphaned sandbox ${row.id}`);
231
+ }
232
+ }), { discard: true });
233
+ }).pipe(Effect.catchAllCause((cause) => Effect.logWarning("Sandbox reconcile failed", cause))),
234
+ gcIdle: (idleTimeout = Duration.minutes(30), cleanupDelay = Duration.hours(24)) => Effect.gen(function* () {
235
+ const all = yield* repo.findAll();
236
+ const now = yield* Clock.currentTimeMillis;
237
+ // Stop idle running sandboxes
238
+ yield* Effect.forEach(all.filter((r) => r.status === "running"), (row) => {
239
+ const lastActivity = new Date(row.lastActivityAt).getTime();
240
+ if (now - lastActivity > Duration.toMillis(idleTimeout)) {
241
+ return Effect.gen(function* () {
242
+ yield* Effect.logInfo(`GC: stopping idle sandbox ${row.id}`);
243
+ if (row.containerId) {
244
+ yield* docker.stopContainer(row.containerId).pipe(Effect.catchAll(() => Effect.void));
245
+ }
246
+ yield* updateStatus(SandboxId.make(row.id), "stopped");
247
+ });
248
+ }
249
+ return Effect.void;
250
+ }, { discard: true });
251
+ // Cleanup stopped sandboxes past delay
252
+ const fs = yield* FileSystem.FileSystem;
253
+ yield* Effect.forEach(all.filter((r) => r.status === "stopped" || r.status === "error"), (row) => {
254
+ const lastActivity = new Date(row.lastActivityAt).getTime();
255
+ if (now - lastActivity > Duration.toMillis(cleanupDelay)) {
256
+ return Effect.gen(function* () {
257
+ yield* Effect.logInfo(`GC: cleaning up sandbox ${row.id}`);
258
+ if (row.containerId) {
259
+ yield* docker.removeContainer(row.containerId).pipe(Effect.catchAll(() => Effect.void));
260
+ }
261
+ yield* fs.remove(row.workspacePath, { recursive: true }).pipe(Effect.catchAll(() => Effect.void));
262
+ yield* repo.delete(SandboxId.make(row.id));
263
+ });
264
+ }
265
+ return Effect.void;
266
+ }, { discard: true });
267
+ }).pipe(Effect.catchAllCause((cause) => Effect.logWarning("Sandbox GC failed", cause)))
268
+ };
269
+ })
270
+ }) {
271
+ }
272
+ //# sourceMappingURL=SandboxService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SandboxService.js","sourceRoot":"","sources":["../../src/SandboxService/SandboxService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Sandbox service — lifecycle management for code sandboxes.
3
+ *
4
+ * @module
5
+ */
6
+ export { DockerService } from "./DockerService.js";
7
+ export type { ContainerConfig, ContainerInfo } from "./DockerService.js";
8
+ export { makeClaudeCodePlugin } from "./plugins/ClaudeCodePlugin.js";
9
+ export { PluginService } from "./PluginService.js";
10
+ export type { SandboxContext, SandboxPlugin } from "./PluginService.js";
11
+ export { SandboxService } from "./SandboxService.js";
12
+ export type { CreateSandboxParams } from "./SandboxService.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/SandboxService/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Sandbox service — lifecycle management for code sandboxes.
3
+ *
4
+ * @module
5
+ */
6
+ export { DockerService } from "./DockerService.js";
7
+ export { makeClaudeCodePlugin } from "./plugins/ClaudeCodePlugin.js";
8
+ export { PluginService } from "./PluginService.js";
9
+ export { SandboxService } from "./SandboxService.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/SandboxService/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Claude Code sandbox plugin.
3
+ *
4
+ * Installs Claude Code CLI inside the sandbox container on ready.
5
+ * Depends on DockerService being available in the sandbox context.
6
+ *
7
+ * @module
8
+ */
9
+ import { Effect } from "effect";
10
+ import type { SandboxPlugin } from "../PluginService.js";
11
+ /**
12
+ * Creates the Claude Code plugin.
13
+ *
14
+ * Takes a docker exec function to avoid dependency resolution issues —
15
+ * the plugin runs inside SandboxService which already has DockerService.
16
+ */
17
+ export declare const makeClaudeCodePlugin: (dockerExec: (containerId: string, cmd: ReadonlyArray<string>) => Effect.Effect<void>) => SandboxPlugin;
18
+ //# sourceMappingURL=ClaudeCodePlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCodePlugin.d.ts","sourceRoot":"","sources":["../../../src/SandboxService/plugins/ClaudeCodePlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KACnF,aAYD,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Claude Code sandbox plugin.
3
+ *
4
+ * Installs Claude Code CLI inside the sandbox container on ready.
5
+ * Depends on DockerService being available in the sandbox context.
6
+ *
7
+ * @module
8
+ */
9
+ import { Effect } from "effect";
10
+ /**
11
+ * Creates the Claude Code plugin.
12
+ *
13
+ * Takes a docker exec function to avoid dependency resolution issues —
14
+ * the plugin runs inside SandboxService which already has DockerService.
15
+ */
16
+ export const makeClaudeCodePlugin = (dockerExec) => ({
17
+ name: "claude-code",
18
+ onSandboxReady: (ctx) => Effect.gen(function* () {
19
+ yield* Effect.logInfo(`Installing Claude Code CLI in sandbox ${ctx.sandboxId}`);
20
+ yield* dockerExec(ctx.containerId, ["npm", "install", "-g", "@anthropic-ai/claude-code"]);
21
+ yield* Effect.logInfo(`Claude Code CLI installed in sandbox ${ctx.sandboxId}`);
22
+ }).pipe(Effect.catchAllCause((cause) => Effect.logWarning(`Claude Code plugin install failed for sandbox ${ctx.sandboxId}`, cause)))
23
+ });
24
+ //# sourceMappingURL=ClaudeCodePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCodePlugin.js","sourceRoot":"","sources":["../../../src/SandboxService/plugins/ClaudeCodePlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,UAAoF,EACrE,EAAE,CAAC,CAAC;IACnB,IAAI,EAAE,aAAa;IACnB,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yCAAyC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/E,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAA;QACzF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,wCAAwC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;IAChF,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,MAAM,CAAC,UAAU,CAAC,iDAAiD,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAC3F,CACF;CACJ,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -15,12 +15,13 @@
15
15
  */
16
16
  export * as AwsClient from "./AwsClient/index.js";
17
17
  export * as AwsClientConfig from "./AwsClientConfig.js";
18
+ export * as CacheService from "./CacheService/index.js";
18
19
  export * as ConfigService from "./ConfigService/index.js";
19
20
  export * as DateUtils from "./DateUtils.js";
20
21
  export * as Domain from "./Domain.js";
21
22
  export * as Errors from "./Errors.js";
22
- export * as NotificationsService from "./NotificationsService.js";
23
23
  export * as PRService from "./PRService/index.js";
24
+ export * as SandboxService from "./SandboxService/index.js";
24
25
  export { Registry } from "@effect-atom/atom";
25
26
  export { Reactivity } from "@effect/experimental";
26
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,oBAAoB,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAGjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAG3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -15,12 +15,13 @@
15
15
  */
16
16
  export * as AwsClient from "./AwsClient/index.js";
17
17
  export * as AwsClientConfig from "./AwsClientConfig.js";
18
+ export * as CacheService from "./CacheService/index.js";
18
19
  export * as ConfigService from "./ConfigService/index.js";
19
20
  export * as DateUtils from "./DateUtils.js";
20
21
  export * as Domain from "./Domain.js";
21
22
  export * as Errors from "./Errors.js";
22
- export * as NotificationsService from "./NotificationsService.js";
23
23
  export * as PRService from "./PRService/index.js";
24
+ export * as SandboxService from "./SandboxService/index.js";
24
25
  // Re-export Effect dependencies for convenience
25
26
  export { Registry } from "@effect-atom/atom";
26
27
  export { Reactivity } from "@effect/experimental";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,oBAAoB,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD,gDAAgD;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAE3D,gDAAgD;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/codecommit-core",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Core logic for CodeCommit PR browser",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,6 +20,9 @@
20
20
  "@effect/experimental": "latest",
21
21
  "@effect/platform": "latest",
22
22
  "@effect/schema": "latest",
23
+ "@effect/sql": "latest",
24
+ "@effect/sql-libsql": "latest",
25
+ "@libsql/client": "^0.14.0",
23
26
  "distilled-aws": "0.0.21",
24
27
  "effect": "latest"
25
28
  },
@@ -1,46 +0,0 @@
1
- /**
2
- * Notification state management service.
3
- *
4
- * Manages application notifications using `SubscriptionRef` for reactive state
5
- * and `Clock.currentTimeMillis` for timestamps (testable with `TestClock`).
6
- *
7
- * @example
8
- * ```typescript
9
- * import { NotificationsService } from "@knpkv/codecommit-core"
10
- *
11
- * const program = Effect.gen(function* () {
12
- * const notifications = yield* NotificationsService
13
- * yield* notifications.add({ type: "info", title: "Refresh", message: "Complete" })
14
- * })
15
- * ```
16
- *
17
- * @category Service
18
- * @module
19
- */
20
- import { Context, Effect, Layer, SubscriptionRef } from "effect";
21
- import type { NotificationsState, NotificationType } from "./Domain.js";
22
- declare const NotificationsService_base: Context.TagClass<NotificationsService, "@knpkv/codecommit-core/NotificationsService", {
23
- readonly state: SubscriptionRef.SubscriptionRef<NotificationsState>;
24
- readonly add: (item: {
25
- readonly type: NotificationType;
26
- readonly title: string;
27
- readonly message: string;
28
- readonly profile?: string;
29
- }) => Effect.Effect<void>;
30
- readonly clear: Effect.Effect<void>;
31
- }>;
32
- /**
33
- * Notifications service.
34
- *
35
- * @category Service
36
- */
37
- export declare class NotificationsService extends NotificationsService_base {
38
- }
39
- /**
40
- * Live notifications service using Clock for timestamps.
41
- *
42
- * @category Service
43
- */
44
- export declare const NotificationsServiceLive: Layer.Layer<NotificationsService, never, never>;
45
- export {};
46
- //# sourceMappingURL=NotificationsService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NotificationsService.d.ts","sourceRoot":"","sources":["../src/NotificationsService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAS,OAAO,EAAY,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AACjF,OAAO,KAAK,EAAoB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;;oBAcrE,eAAe,CAAC,eAAe,CAAC,kBAAkB,CAAC;kBACrD,CAAC,IAAI,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;QAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAC1B,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACT,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;AAfvC;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,yBAYvC;CAAG;AAMN;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,iDA6BpC,CAAA"}