@mastra/factory 0.8.0-alpha.8 → 0.8.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 (182) hide show
  1. package/CHANGELOG.md +660 -0
  2. package/dist/factory.d.ts.map +1 -1
  3. package/dist/factory.js +42 -4
  4. package/dist/factory.js.map +1 -1
  5. package/dist/integrations/base.d.ts +8 -0
  6. package/dist/integrations/base.d.ts.map +1 -1
  7. package/dist/integrations/github/app-identity.d.ts +43 -0
  8. package/dist/integrations/github/app-identity.d.ts.map +1 -0
  9. package/dist/integrations/github/app-identity.js +62 -0
  10. package/dist/integrations/github/app-identity.js.map +1 -0
  11. package/dist/integrations/github/integration.d.ts +9 -0
  12. package/dist/integrations/github/integration.d.ts.map +1 -1
  13. package/dist/integrations/github/integration.js +9 -1
  14. package/dist/integrations/github/integration.js.map +1 -1
  15. package/dist/integrations/github/reconcile-worker.d.ts +5 -0
  16. package/dist/integrations/github/reconcile-worker.d.ts.map +1 -1
  17. package/dist/integrations/github/reconcile-worker.js +7 -0
  18. package/dist/integrations/github/reconcile-worker.js.map +1 -1
  19. package/dist/integrations/github/routes.d.ts.map +1 -1
  20. package/dist/integrations/github/routes.js +11 -6
  21. package/dist/integrations/github/routes.js.map +1 -1
  22. package/dist/integrations/github/rules.d.ts +8 -0
  23. package/dist/integrations/github/rules.d.ts.map +1 -1
  24. package/dist/integrations/github/rules.js +30 -8
  25. package/dist/integrations/github/rules.js.map +1 -1
  26. package/dist/integrations/github/sandbox.d.ts +39 -6
  27. package/dist/integrations/github/sandbox.d.ts.map +1 -1
  28. package/dist/integrations/github/sandbox.js +48 -14
  29. package/dist/integrations/github/sandbox.js.map +1 -1
  30. package/dist/integrations/github/webhook.d.ts +39 -0
  31. package/dist/integrations/github/webhook.d.ts.map +1 -1
  32. package/dist/integrations/github/webhook.js +74 -13
  33. package/dist/integrations/github/webhook.js.map +1 -1
  34. package/dist/integrations/linear/integration.d.ts.map +1 -1
  35. package/dist/integrations/linear/integration.js +1 -0
  36. package/dist/integrations/linear/integration.js.map +1 -1
  37. package/dist/integrations/linear/routes.d.ts +10 -0
  38. package/dist/integrations/linear/routes.d.ts.map +1 -1
  39. package/dist/integrations/linear/routes.js +35 -1
  40. package/dist/integrations/linear/routes.js.map +1 -1
  41. package/dist/integrations/linear/rules.d.ts.map +1 -1
  42. package/dist/integrations/linear/rules.js +2 -1
  43. package/dist/integrations/linear/rules.js.map +1 -1
  44. package/dist/integrations/platform/github/event-worker.d.ts +11 -0
  45. package/dist/integrations/platform/github/event-worker.d.ts.map +1 -1
  46. package/dist/integrations/platform/github/event-worker.js +64 -16
  47. package/dist/integrations/platform/github/event-worker.js.map +1 -1
  48. package/dist/integrations/platform/github/integration.d.ts +12 -0
  49. package/dist/integrations/platform/github/integration.d.ts.map +1 -1
  50. package/dist/integrations/platform/github/integration.js +47 -4
  51. package/dist/integrations/platform/github/integration.js.map +1 -1
  52. package/dist/integrations/platform/linear/integration.d.ts.map +1 -1
  53. package/dist/integrations/platform/linear/integration.js +1 -0
  54. package/dist/integrations/platform/linear/integration.js.map +1 -1
  55. package/dist/integrations/slack/slack.d.ts.map +1 -1
  56. package/dist/integrations/slack/slack.js +2 -1
  57. package/dist/integrations/slack/slack.js.map +1 -1
  58. package/dist/routes/config.d.ts +12 -6
  59. package/dist/routes/config.d.ts.map +1 -1
  60. package/dist/routes/config.js +97 -56
  61. package/dist/routes/config.js.map +1 -1
  62. package/dist/routes/fs.d.ts.map +1 -1
  63. package/dist/routes/fs.js +2 -0
  64. package/dist/routes/fs.js.map +1 -1
  65. package/dist/routes/intake.d.ts +15 -0
  66. package/dist/routes/intake.d.ts.map +1 -1
  67. package/dist/routes/intake.js +65 -2
  68. package/dist/routes/intake.js.map +1 -1
  69. package/dist/routes/knowledge.d.ts +152 -0
  70. package/dist/routes/knowledge.d.ts.map +1 -0
  71. package/dist/routes/knowledge.js +442 -0
  72. package/dist/routes/knowledge.js.map +1 -0
  73. package/dist/routes/projects.d.ts +9 -1
  74. package/dist/routes/projects.d.ts.map +1 -1
  75. package/dist/routes/projects.js +8 -0
  76. package/dist/routes/projects.js.map +1 -1
  77. package/dist/routes/surface.d.ts +6 -0
  78. package/dist/routes/surface.d.ts.map +1 -1
  79. package/dist/routes/surface.js +10 -0
  80. package/dist/routes/surface.js.map +1 -1
  81. package/dist/routes/work-items.d.ts.map +1 -1
  82. package/dist/routes/work-items.js +3 -1
  83. package/dist/routes/work-items.js.map +1 -1
  84. package/dist/rules/binding-context.d.ts.map +1 -1
  85. package/dist/rules/binding-context.js +4 -1
  86. package/dist/rules/binding-context.js.map +1 -1
  87. package/dist/rules/defaults.d.ts.map +1 -1
  88. package/dist/rules/defaults.js +87 -4
  89. package/dist/rules/defaults.js.map +1 -1
  90. package/dist/rules/dispatcher.d.ts +6 -0
  91. package/dist/rules/dispatcher.d.ts.map +1 -1
  92. package/dist/rules/dispatcher.js +118 -16
  93. package/dist/rules/dispatcher.js.map +1 -1
  94. package/dist/rules/processor.d.ts.map +1 -1
  95. package/dist/rules/processor.js +20 -7
  96. package/dist/rules/processor.js.map +1 -1
  97. package/dist/rules/resolve.d.ts +1 -0
  98. package/dist/rules/resolve.d.ts.map +1 -1
  99. package/dist/rules/resolve.js +3 -2
  100. package/dist/rules/resolve.js.map +1 -1
  101. package/dist/rules/start-coordinator.d.ts +2 -0
  102. package/dist/rules/start-coordinator.d.ts.map +1 -1
  103. package/dist/rules/start-coordinator.js +3 -1
  104. package/dist/rules/start-coordinator.js.map +1 -1
  105. package/dist/rules/terminal-cleanup.d.ts +23 -0
  106. package/dist/rules/terminal-cleanup.d.ts.map +1 -0
  107. package/dist/rules/terminal-cleanup.js +43 -0
  108. package/dist/rules/terminal-cleanup.js.map +1 -0
  109. package/dist/rules/tools.d.ts.map +1 -1
  110. package/dist/rules/tools.js +24 -2
  111. package/dist/rules/tools.js.map +1 -1
  112. package/dist/rules/transition-service.d.ts +3 -0
  113. package/dist/rules/transition-service.d.ts.map +1 -1
  114. package/dist/rules/transition-service.js +10 -6
  115. package/dist/rules/transition-service.js.map +1 -1
  116. package/dist/rules/types.d.ts +32 -3
  117. package/dist/rules/types.d.ts.map +1 -1
  118. package/dist/rules/types.js +2 -0
  119. package/dist/rules/types.js.map +1 -1
  120. package/dist/rules/validation.d.ts.map +1 -1
  121. package/dist/rules/validation.js +8 -3
  122. package/dist/rules/validation.js.map +1 -1
  123. package/dist/sandbox/base-checkpoint-triggers.d.ts +77 -0
  124. package/dist/sandbox/base-checkpoint-triggers.d.ts.map +1 -0
  125. package/dist/sandbox/base-checkpoint-triggers.js +137 -0
  126. package/dist/sandbox/base-checkpoint-triggers.js.map +1 -0
  127. package/dist/sandbox/base-checkpoint.d.ts +59 -0
  128. package/dist/sandbox/base-checkpoint.d.ts.map +1 -0
  129. package/dist/sandbox/base-checkpoint.js +145 -0
  130. package/dist/sandbox/base-checkpoint.js.map +1 -0
  131. package/dist/sandbox/fleet.d.ts +32 -0
  132. package/dist/sandbox/fleet.d.ts.map +1 -1
  133. package/dist/sandbox/fleet.js +39 -10
  134. package/dist/sandbox/fleet.js.map +1 -1
  135. package/dist/session/checkpoint-capture.d.ts +3 -2
  136. package/dist/session/checkpoint-capture.d.ts.map +1 -1
  137. package/dist/session/checkpoint-capture.js +3 -3
  138. package/dist/session/checkpoint-capture.js.map +1 -1
  139. package/dist/session/factory-session.d.ts.map +1 -1
  140. package/dist/session/factory-session.js +2 -1
  141. package/dist/session/factory-session.js.map +1 -1
  142. package/dist/session/filesystem-capture.d.ts +7 -0
  143. package/dist/session/filesystem-capture.d.ts.map +1 -1
  144. package/dist/session/filesystem-capture.js +41 -4
  145. package/dist/session/filesystem-capture.js.map +1 -1
  146. package/dist/session/model-pack-hydration.d.ts +55 -0
  147. package/dist/session/model-pack-hydration.d.ts.map +1 -0
  148. package/dist/session/model-pack-hydration.js +56 -0
  149. package/dist/session/model-pack-hydration.js.map +1 -0
  150. package/dist/skills/service.d.ts +9 -0
  151. package/dist/skills/service.d.ts.map +1 -1
  152. package/dist/skills/service.js +10 -1
  153. package/dist/skills/service.js.map +1 -1
  154. package/dist/storage/domains/intake/base.d.ts +36 -0
  155. package/dist/storage/domains/intake/base.d.ts.map +1 -1
  156. package/dist/storage/domains/intake/base.js +91 -2
  157. package/dist/storage/domains/intake/base.js.map +1 -1
  158. package/dist/storage/domains/model-packs/base.d.ts +26 -0
  159. package/dist/storage/domains/model-packs/base.d.ts.map +1 -1
  160. package/dist/storage/domains/model-packs/base.js +102 -13
  161. package/dist/storage/domains/model-packs/base.js.map +1 -1
  162. package/dist/storage/domains/source-control/base.d.ts +47 -1
  163. package/dist/storage/domains/source-control/base.d.ts.map +1 -1
  164. package/dist/storage/domains/source-control/base.js +78 -19
  165. package/dist/storage/domains/source-control/base.js.map +1 -1
  166. package/dist/storage/domains/source-control/inmemory.d.ts +11 -3
  167. package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -1
  168. package/dist/storage/domains/source-control/inmemory.js +10 -1
  169. package/dist/storage/domains/source-control/inmemory.js.map +1 -1
  170. package/dist/storage/domains/work-items/base.d.ts +67 -1
  171. package/dist/storage/domains/work-items/base.d.ts.map +1 -1
  172. package/dist/storage/domains/work-items/base.js +183 -12
  173. package/dist/storage/domains/work-items/base.js.map +1 -1
  174. package/dist/workspace.d.ts +31 -2
  175. package/dist/workspace.d.ts.map +1 -1
  176. package/dist/workspace.js +225 -54
  177. package/dist/workspace.js.map +1 -1
  178. package/factory-skills/factory-plan/SKILL.md +1 -1
  179. package/factory-skills/factory-rereview/SKILL.md +3 -3
  180. package/factory-skills/factory-review/SKILL.md +3 -3
  181. package/factory-skills/factory-triage/SKILL.md +2 -0
  182. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","names":[],"sources":["../../../../src/storage/domains/source-control/base.ts"],"sourcesContent":["import { FactoryStorageDomain, UniqueViolationError } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\nconst FACTORY_PROJECTS = 'factory_projects';\nconst INSTALLATIONS = 'source_control_installations';\nconst REPOSITORIES = 'source_control_repositories';\nconst CONNECTIONS = 'factory_project_source_control_connections';\nconst PROJECT_REPOSITORIES = 'factory_project_repositories';\nconst SANDBOXES = 'source_control_project_repository_sandboxes';\nconst SANDBOX_POOL = 'source_control_sandbox_pool';\nconst WORKTREES = 'source_control_worktrees';\nconst SESSIONS = 'source_control_sessions';\n\nexport const SOURCE_CONTROL_SCHEMAS: CollectionSchema[] = [\n {\n name: INSTALLATIONS,\n columns: {\n id: { type: 'uuid-pk' },\n integration_id: { type: 'text' },\n org_id: { type: 'text' },\n connected_by_user_id: { type: 'text' },\n external_id: { type: 'text' },\n account_name: { type: 'text', nullable: true },\n account_type: { type: 'text', nullable: true },\n provider_metadata: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_installations_integration_org_external_unique',\n columns: ['integration_id', 'org_id', 'external_id'],\n },\n ],\n },\n {\n name: REPOSITORIES,\n columns: {\n id: { type: 'uuid-pk' },\n installation_id: { type: 'text' },\n external_id: { type: 'text' },\n slug: { type: 'text' },\n default_branch: { type: 'text', default: 'main' },\n provider_metadata: { type: 'json' },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_repositories_installation_external_unique',\n columns: ['installation_id', 'external_id'],\n },\n ],\n indexes: [\n {\n name: 'source_control_repositories_installation_slug_idx',\n columns: ['installation_id', 'slug'],\n },\n ],\n },\n {\n name: CONNECTIONS,\n columns: {\n id: { type: 'uuid-pk' },\n factory_project_id: { type: 'text' },\n integration_id: { type: 'text' },\n installation_id: { type: 'text' },\n created_by_user_id: { type: 'text' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_project_source_control_connections_project_integration_installation_unique',\n columns: ['factory_project_id', 'integration_id', 'installation_id'],\n },\n ],\n indexes: [\n {\n name: 'factory_project_source_control_connections_project_idx',\n columns: ['factory_project_id'],\n },\n ],\n },\n {\n name: PROJECT_REPOSITORIES,\n columns: {\n id: { type: 'uuid-pk' },\n connection_id: { type: 'text' },\n repository_id: { type: 'text' },\n created_by_user_id: { type: 'text' },\n branch: { type: 'text', nullable: true },\n sandbox_provider: { type: 'text' },\n sandbox_workdir: { type: 'text' },\n setup_command: { type: 'text', nullable: true },\n teardown_command: { type: 'text', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_project_repositories_connection_repository_unique',\n columns: ['connection_id', 'repository_id'],\n },\n ],\n indexes: [\n {\n name: 'factory_project_repositories_connection_idx',\n columns: ['connection_id'],\n },\n ],\n },\n {\n name: SANDBOXES,\n columns: {\n id: { type: 'uuid-pk' },\n project_repository_id: { type: 'text' },\n user_id: { type: 'text' },\n sandbox_id: { type: 'text', nullable: true },\n sandbox_workdir: { type: 'text' },\n materialized_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_project_repository_sandboxes_link_user_unique',\n columns: ['project_repository_id', 'user_id'],\n },\n ],\n },\n {\n name: SANDBOX_POOL,\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n project_repository_id: { type: 'text' },\n user_id: { type: 'text' },\n sandbox_id: { type: 'text' },\n sandbox_workdir: { type: 'text' },\n released_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_sandbox_pool_sandbox_unique',\n columns: ['sandbox_id'],\n },\n ],\n indexes: [\n {\n name: 'source_control_sandbox_pool_repository_user_idx',\n columns: ['project_repository_id', 'user_id'],\n },\n ],\n },\n {\n name: WORKTREES,\n columns: {\n id: { type: 'uuid-pk' },\n project_repository_id: { type: 'text' },\n user_id: { type: 'text' },\n branch: { type: 'text' },\n base_branch: { type: 'text' },\n worktree_path: { type: 'text' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_worktrees_project_repository_user_branch_unique',\n columns: ['project_repository_id', 'user_id', 'branch'],\n },\n ],\n },\n {\n name: SESSIONS,\n columns: {\n id: { type: 'uuid-pk' },\n session_id: { type: 'text' },\n project_repository_id: { type: 'text' },\n org_id: { type: 'text' },\n user_id: { type: 'text' },\n branch: { type: 'text' },\n base_branch: { type: 'text' },\n title: { type: 'text', nullable: true },\n sandbox_id: { type: 'text', nullable: true },\n sandbox_workdir: { type: 'text', nullable: true },\n materialized_at: { type: 'timestamp', nullable: true },\n first_message_at: { type: 'timestamp', nullable: true },\n first_meaningful_exec_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n { name: 'source_control_sessions_session_id_unique', columns: ['session_id'] },\n {\n name: 'source_control_sessions_repository_user_branch_unique',\n columns: ['project_repository_id', 'user_id', 'branch'],\n },\n ],\n },\n];\n\nexport type SourceControlProviderMetadata = Record<string, unknown>;\n\nexport interface SourceControlInstallation {\n id: string;\n integrationId: string;\n orgId: string;\n connectedByUserId: string;\n externalId: string;\n accountName: string | null;\n accountType: string | null;\n providerMetadata: SourceControlProviderMetadata;\n createdAt: Date;\n}\n\nexport interface UpsertSourceControlInstallationInput {\n orgId: string;\n connectedByUserId: string;\n externalId: string;\n accountName?: string | null;\n accountType?: string | null;\n providerMetadata?: SourceControlProviderMetadata;\n}\n\nexport interface SourceControlRepository {\n id: string;\n installationId: string;\n externalId: string;\n slug: string;\n defaultBranch: string;\n providerMetadata: SourceControlProviderMetadata;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface UpsertSourceControlRepositoryInput {\n installationId: string;\n externalId: string;\n slug: string;\n defaultBranch: string;\n providerMetadata?: SourceControlProviderMetadata;\n}\n\nexport interface ProjectSourceControlConnection {\n id: string;\n factoryProjectId: string;\n integrationId: string;\n installationId: string;\n createdByUserId: string;\n createdAt: Date;\n}\n\nexport interface CreateProjectSourceControlConnectionInput {\n orgId: string;\n factoryProjectId: string;\n installationId: string;\n createdByUserId: string;\n}\n\nexport interface ProjectRepository {\n id: string;\n connectionId: string;\n repositoryId: string;\n createdByUserId: string;\n branch: string | null;\n sandboxProvider: string;\n sandboxWorkdir: string;\n setupCommand: string | null;\n teardownCommand: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface ExternalRepositoryProjectTarget {\n orgId: string;\n factoryProjectId: string;\n projectRepository: ProjectRepository;\n}\n\n/** External id pair identifying a repository linked to a factory project. */\nexport interface ConfiguredExternalRepositoryKey {\n installationExternalId: string;\n repositoryExternalId: string;\n}\n\nexport interface LinkProjectRepositoryInput {\n orgId: string;\n connectionId: string;\n repositoryId: string;\n createdByUserId: string;\n branch?: string | null;\n sandboxProvider: string;\n sandboxWorkdir: string;\n setupCommand?: string | null;\n teardownCommand?: string | null;\n}\n\nexport interface UpdateProjectRepositoryInput {\n branch?: string | null;\n sandboxProvider?: string;\n sandboxWorkdir?: string;\n setupCommand?: string | null;\n teardownCommand?: string | null;\n}\n\nexport interface ProjectRepositorySandbox {\n id: string;\n projectRepositoryId: string;\n userId: string;\n sandboxId: string | null;\n sandboxWorkdir: string;\n materializedAt: Date | null;\n createdAt: Date;\n}\n\n/**\n * A provider sandbox that is no longer bound to any session and can be handed\n * to the next session for the same project-repository link instead of\n * provisioning a fresh VM. Pooling is per-repository, not per-user: no\n * credentials are baked into the VM (tokens are injected per command), so any\n * user's session can safely claim it. `userId` records who released it,\n * purely as provenance.\n */\nexport interface PooledSandbox {\n id: string;\n orgId: string;\n projectRepositoryId: string;\n /** User whose session released this sandbox (provenance, not a claim key). */\n userId: string;\n sandboxId: string;\n sandboxWorkdir: string;\n releasedAt: Date;\n}\n\nexport interface ReleasePooledSandboxInput {\n orgId: string;\n projectRepositoryId: string;\n userId: string;\n sandboxId: string;\n sandboxWorkdir: string;\n}\n\nexport interface SourceControlWorktree {\n id: string;\n projectRepositoryId: string;\n userId: string;\n branch: string;\n baseBranch: string;\n worktreePath: string;\n createdAt: Date;\n}\n\nexport interface UpsertSourceControlWorktreeInput {\n projectRepositoryId: string;\n userId: string;\n branch: string;\n baseBranch: string;\n worktreePath: string;\n}\n\nexport interface SourceControlSession {\n id: string;\n sessionId: string;\n projectRepositoryId: string;\n orgId: string;\n userId: string;\n branch: string;\n title: string | null;\n baseBranch: string;\n sandboxId: string | null;\n sandboxWorkdir: string | null;\n materializedAt: Date | null;\n /** When the first user message reached the session's agent. Write-once. */\n firstMessageAt: Date | null;\n /** When the agent's first successful sandbox exec finished. Write-once. */\n firstMeaningfulExecAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateSourceControlSessionInput {\n sessionId: string;\n projectRepositoryId: string;\n orgId: string;\n userId: string;\n branch: string;\n title?: string | null;\n baseBranch: string;\n}\n\nexport interface SourceControlStorageHandle {\n readonly integrationId: string;\n readonly installations: {\n list(args: { orgId: string }): Promise<SourceControlInstallation[]>;\n get(args: { orgId: string; id: string }): Promise<SourceControlInstallation | null>;\n findByExternalId(args: { orgId: string; externalId: string }): Promise<SourceControlInstallation | null>;\n upsert(args: UpsertSourceControlInstallationInput): Promise<SourceControlInstallation>;\n delete(args: { orgId: string; id: string }): Promise<boolean>;\n };\n readonly repositories: {\n list(args: { orgId: string; installationId: string }): Promise<SourceControlRepository[]>;\n get(args: { orgId: string; id: string }): Promise<SourceControlRepository | null>;\n findByExternalId(args: { orgId: string; externalId: string }): Promise<SourceControlRepository | null>;\n findBySlug(args: { orgId: string; installationId: string; slug: string }): Promise<SourceControlRepository | null>;\n upsert(args: { orgId: string; input: UpsertSourceControlRepositoryInput }): Promise<SourceControlRepository>;\n /**\n * Migrate a repository and its dependent connections to a new installation.\n * Used when a GitHub App is reinstalled with a new installation ID on the same account.\n * Returns the repository under the new installation (either migrated or existing).\n */\n migrateInstallation(args: {\n orgId: string;\n id: string;\n newInstallationId: string;\n }): Promise<SourceControlRepository>;\n };\n readonly connections: {\n list(args: { orgId: string; factoryProjectId: string }): Promise<ProjectSourceControlConnection[]>;\n get(args: { orgId: string; id: string }): Promise<ProjectSourceControlConnection | null>;\n create(args: CreateProjectSourceControlConnectionInput): Promise<ProjectSourceControlConnection>;\n delete(args: { orgId: string; id: string }): Promise<boolean>;\n };\n readonly projectRepositories: {\n list(args: { orgId: string; connectionId: string }): Promise<ProjectRepository[]>;\n listByExternalRepository(args: {\n installationExternalId: string;\n repositoryExternalId: string;\n }): Promise<ExternalRepositoryProjectTarget[]>;\n /**\n * Distinct external (installation, repository) id pairs linked to any\n * factory project. Lets sweeps scope work to configured repositories\n * without probing every repository an installation can see.\n */\n listConfiguredExternalKeys(): Promise<ConfiguredExternalRepositoryKey[]>;\n get(args: { orgId: string; id: string }): Promise<ProjectRepository | null>;\n link(args: LinkProjectRepositoryInput): Promise<ProjectRepository>;\n update(args: { orgId: string; id: string; input: UpdateProjectRepositoryInput }): Promise<ProjectRepository | null>;\n unlink(args: { orgId: string; id: string }): Promise<boolean>;\n };\n readonly sandboxes: {\n getOrCreate(args: { projectRepository: ProjectRepository; userId: string }): Promise<ProjectRepositorySandbox>;\n getById(args: { id: string }): Promise<ProjectRepositorySandbox | null>;\n /**\n * Point the binding at a new workdir and clear `materializedAt` — a moved\n * workdir means the checkout must be re-cloned. Used to heal bindings whose\n * inherited workdir went stale (e.g. the sandbox provider changed).\n */\n setWorkdir(args: { id: string; sandboxWorkdir: string }): Promise<void>;\n setSandboxId(args: { id: string; sandboxId: string }): Promise<void>;\n clearBinding(args: { id: string }): Promise<void>;\n markMaterialized(args: { id: string }): Promise<void>;\n };\n readonly sandboxPool: {\n /**\n * Return a sandbox to the reuse pool. Idempotent per provider sandbox ID —\n * releasing the same sandbox twice keeps one pool row.\n */\n release(args: ReleasePooledSandboxInput): Promise<void>;\n /**\n * Atomically take one pooled sandbox for the given project-repository\n * link, preferring the most recently released (warmest) VM. Returns\n * `null` when the pool is empty. Each pooled sandbox is handed to exactly\n * one claimer even under concurrent claims.\n */\n claim(args: { projectRepositoryId: string }): Promise<PooledSandbox | null>;\n };\n readonly worktrees: {\n upsert(args: UpsertSourceControlWorktreeInput): Promise<void>;\n list(args: { projectRepositoryId: string; userId: string }): Promise<SourceControlWorktree[]>;\n get(args: { projectRepositoryId: string; userId: string; branch: string }): Promise<SourceControlWorktree | null>;\n findByPath(args: {\n projectRepositoryId: string;\n userId: string;\n worktreePath: string;\n }): Promise<SourceControlWorktree | null>;\n delete(args: { projectRepositoryId: string; userId: string; branch: string }): Promise<void>;\n };\n readonly sessions: {\n list(args: { projectRepositoryId: string; userId: string }): Promise<SourceControlSession[]>;\n listByProjectRepository(args: { projectRepositoryId: string }): Promise<SourceControlSession[]>;\n getBySessionId(sessionId: string): Promise<SourceControlSession | null>;\n getForBranch(args: {\n projectRepositoryId: string;\n userId: string;\n branch: string;\n }): Promise<SourceControlSession | null>;\n create(input: CreateSourceControlSessionInput): Promise<SourceControlSession>;\n setSandbox(args: { id: string; sandboxId: string | null; sandboxWorkdir: string }): Promise<void>;\n /**\n * Record when the session's workspace was first materialized. Write-once:\n * the guarded update only lands while the column is still NULL, so resumes\n * (Railway idle-reap, checkpoint restore, sandbox recreate) do not overwrite\n * the initial-materialize baseline that `materialize_s = materialized_at -\n * created_at` depends on.\n */\n markMaterialized(args: { id: string }): Promise<void>;\n /**\n * Record when the session's agent received its first user message.\n * Write-once: the guarded update only lands while the column is still\n * NULL, so retries and process restarts are no-ops. Keyed by the\n * controller-facing `sessionId` (not the row id) because the caller —\n * the session observer — only knows the controller resourceId.\n */\n markFirstMessage(args: { sessionId: string }): Promise<void>;\n /**\n * Record when the session's agent completed its first successful sandbox\n * exec (TTFME anchor). Same write-once contract as `markFirstMessage`:\n * guarded on the column being NULL, keyed by the controller-facing\n * `sessionId`.\n */\n markFirstMeaningfulExec(args: { sessionId: string }): Promise<void>;\n delete(id: string): Promise<void>;\n };\n}\n\ninterface InstallationDbRow extends Record<string, unknown> {\n id: string;\n integration_id: string;\n org_id: string;\n connected_by_user_id: string;\n external_id: string;\n account_name: string | null;\n account_type: string | null;\n provider_metadata: SourceControlProviderMetadata;\n created_at: Date;\n}\n\ninterface RepositoryDbRow extends Record<string, unknown> {\n id: string;\n installation_id: string;\n external_id: string;\n slug: string;\n default_branch: string;\n provider_metadata: SourceControlProviderMetadata;\n created_at: Date;\n updated_at: Date;\n}\n\ninterface ConnectionDbRow extends Record<string, unknown> {\n id: string;\n factory_project_id: string;\n integration_id: string;\n installation_id: string;\n created_by_user_id: string;\n created_at: Date;\n}\n\ninterface ProjectRepositoryDbRow extends Record<string, unknown> {\n id: string;\n connection_id: string;\n repository_id: string;\n created_by_user_id: string;\n branch: string | null;\n sandbox_provider: string;\n sandbox_workdir: string;\n setup_command: string | null;\n teardown_command: string | null;\n created_at: Date;\n updated_at: Date;\n}\n\ninterface SandboxDbRow extends Record<string, unknown> {\n id: string;\n project_repository_id: string;\n user_id: string;\n sandbox_id: string | null;\n sandbox_workdir: string;\n materialized_at: Date | null;\n created_at: Date;\n}\n\ninterface SandboxPoolDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n project_repository_id: string;\n user_id: string;\n sandbox_id: string;\n sandbox_workdir: string;\n released_at: Date;\n}\n\ninterface WorktreeDbRow extends Record<string, unknown> {\n id: string;\n project_repository_id: string;\n user_id: string;\n branch: string;\n base_branch: string;\n worktree_path: string;\n created_at: Date;\n}\n\ninterface SessionDbRow extends Record<string, unknown> {\n id: string;\n session_id: string;\n project_repository_id: string;\n org_id: string;\n user_id: string;\n branch: string;\n title: string | null;\n base_branch: string;\n sandbox_id: string | null;\n sandbox_workdir: string | null;\n materialized_at: Date | null;\n first_message_at: Date | null;\n first_meaningful_exec_at: Date | null;\n created_at: Date;\n updated_at: Date;\n}\n\nfunction toInstallation(row: InstallationDbRow): SourceControlInstallation {\n return {\n id: row.id,\n integrationId: row.integration_id,\n orgId: row.org_id,\n connectedByUserId: row.connected_by_user_id,\n externalId: row.external_id,\n accountName: row.account_name,\n accountType: row.account_type,\n providerMetadata: row.provider_metadata,\n createdAt: row.created_at,\n };\n}\n\nfunction toRepository(row: RepositoryDbRow): SourceControlRepository {\n return {\n id: row.id,\n installationId: row.installation_id,\n externalId: row.external_id,\n slug: row.slug,\n defaultBranch: row.default_branch,\n providerMetadata: row.provider_metadata,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction toConnection(row: ConnectionDbRow): ProjectSourceControlConnection {\n return {\n id: row.id,\n factoryProjectId: row.factory_project_id,\n integrationId: row.integration_id,\n installationId: row.installation_id,\n createdByUserId: row.created_by_user_id,\n createdAt: row.created_at,\n };\n}\n\nfunction toProjectRepository(row: ProjectRepositoryDbRow): ProjectRepository {\n return {\n id: row.id,\n connectionId: row.connection_id,\n repositoryId: row.repository_id,\n createdByUserId: row.created_by_user_id,\n branch: row.branch,\n sandboxProvider: row.sandbox_provider,\n sandboxWorkdir: row.sandbox_workdir,\n setupCommand: row.setup_command,\n teardownCommand: row.teardown_command,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction toSandbox(row: SandboxDbRow): ProjectRepositorySandbox {\n return {\n id: row.id,\n projectRepositoryId: row.project_repository_id,\n userId: row.user_id,\n sandboxId: row.sandbox_id,\n sandboxWorkdir: row.sandbox_workdir,\n materializedAt: row.materialized_at,\n createdAt: row.created_at,\n };\n}\n\nfunction toPooledSandbox(row: SandboxPoolDbRow): PooledSandbox {\n return {\n id: row.id,\n orgId: row.org_id,\n projectRepositoryId: row.project_repository_id,\n userId: row.user_id,\n sandboxId: row.sandbox_id,\n sandboxWorkdir: row.sandbox_workdir,\n releasedAt: row.released_at,\n };\n}\n\nfunction toWorktree(row: WorktreeDbRow): SourceControlWorktree {\n return {\n id: row.id,\n projectRepositoryId: row.project_repository_id,\n userId: row.user_id,\n branch: row.branch,\n baseBranch: row.base_branch,\n worktreePath: row.worktree_path,\n createdAt: row.created_at,\n };\n}\n\nfunction toSession(row: SessionDbRow): SourceControlSession {\n return {\n id: row.id,\n sessionId: row.session_id,\n projectRepositoryId: row.project_repository_id,\n orgId: row.org_id,\n userId: row.user_id,\n branch: row.branch,\n title: row.title,\n baseBranch: row.base_branch,\n sandboxId: row.sandbox_id,\n sandboxWorkdir: row.sandbox_workdir,\n materializedAt: row.materialized_at,\n firstMessageAt: row.first_message_at,\n firstMeaningfulExecAt: row.first_meaningful_exec_at,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport class SourceControlStorage extends FactoryStorageDomain {\n constructor() {\n super('source-control');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections(SOURCE_CONTROL_SCHEMAS);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany(SESSIONS, {});\n await this.ops.deleteMany(WORKTREES, {});\n await this.ops.deleteMany(SANDBOX_POOL, {});\n await this.ops.deleteMany(SANDBOXES, {});\n await this.ops.deleteMany(PROJECT_REPOSITORIES, {});\n await this.ops.deleteMany(CONNECTIONS, {});\n await this.ops.deleteMany(REPOSITORIES, {});\n await this.ops.deleteMany(INSTALLATIONS, {});\n }\n\n forIntegration(integrationId: string): SourceControlStorageHandle {\n if (!integrationId.trim()) throw new Error('[SourceControlStorage] integrationId must not be empty.');\n const db = (): FactoryStorageOps => this.ops;\n\n const getInstallation = async (args: { orgId: string; id: string }): Promise<SourceControlInstallation | null> => {\n const row = await db().findOne<InstallationDbRow>(INSTALLATIONS, {\n id: args.id,\n integration_id: integrationId,\n org_id: args.orgId,\n });\n return row ? toInstallation(row) : null;\n };\n\n const requireInstallation = async (args: { orgId: string; id: string }): Promise<SourceControlInstallation> => {\n const installation = await getInstallation(args);\n if (!installation)\n throw new Error('Source-control installation not found for this organization and integration.');\n return installation;\n };\n\n const getRepository = async (args: { orgId: string; id: string }): Promise<SourceControlRepository | null> => {\n const row = await db().findOne<RepositoryDbRow>(REPOSITORIES, { id: args.id });\n if (!row || !(await getInstallation({ orgId: args.orgId, id: row.installation_id }))) return null;\n return toRepository(row);\n };\n\n const requireRepository = async (args: { orgId: string; id: string }): Promise<SourceControlRepository> => {\n const repository = await getRepository(args);\n if (!repository) throw new Error('Source-control repository not found for this organization and integration.');\n return repository;\n };\n\n const getConnection = async (args: {\n orgId: string;\n id: string;\n }): Promise<ProjectSourceControlConnection | null> => {\n const row = await db().findOne<ConnectionDbRow>(CONNECTIONS, { id: args.id, integration_id: integrationId });\n if (!row) return null;\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: row.factory_project_id,\n org_id: args.orgId,\n });\n if (!project || !(await getInstallation({ orgId: args.orgId, id: row.installation_id }))) return null;\n return toConnection(row);\n };\n\n const requireConnection = async (args: { orgId: string; id: string }): Promise<ProjectSourceControlConnection> => {\n const connection = await getConnection(args);\n if (!connection)\n throw new Error('Project source-control connection not found for this organization and integration.');\n return connection;\n };\n\n const getProjectRepository = async (args: { orgId: string; id: string }): Promise<ProjectRepository | null> => {\n const row = await db().findOne<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, { id: args.id });\n if (!row || !(await getConnection({ orgId: args.orgId, id: row.connection_id }))) return null;\n return toProjectRepository(row);\n };\n\n const getProjectRepositoryById = async (id: string): Promise<ProjectRepository | null> => {\n const row = await db().findOne<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, { id });\n if (!row) return null;\n const connection = await db().findOne<ConnectionDbRow>(CONNECTIONS, {\n id: row.connection_id,\n integration_id: integrationId,\n });\n return connection ? toProjectRepository(row) : null;\n };\n\n const requireProjectRepositoryById = async (id: string): Promise<ProjectRepository> => {\n const projectRepository = await getProjectRepositoryById(id);\n if (!projectRepository) throw new Error('Project repository not found for this integration.');\n return projectRepository;\n };\n\n const getSandbox = async (id: string): Promise<ProjectRepositorySandbox | null> => {\n const row = await db().findOne<SandboxDbRow>(SANDBOXES, { id });\n if (!row || !(await getProjectRepositoryById(row.project_repository_id))) return null;\n return toSandbox(row);\n };\n\n const requireSandbox = async (id: string): Promise<ProjectRepositorySandbox> => {\n const sandbox = await getSandbox(id);\n if (!sandbox) throw new Error('Project-repository sandbox not found for this integration.');\n return sandbox;\n };\n\n return {\n integrationId,\n installations: {\n list: async ({ orgId }) =>\n (\n await db().findMany<InstallationDbRow>(INSTALLATIONS, {\n integration_id: integrationId,\n org_id: orgId,\n })\n ).map(toInstallation),\n get: getInstallation,\n findByExternalId: async ({ orgId, externalId }) => {\n const row = await db().findOne<InstallationDbRow>(INSTALLATIONS, {\n integration_id: integrationId,\n org_id: orgId,\n external_id: externalId,\n });\n return row ? toInstallation(row) : null;\n },\n upsert: async input => {\n const row = await db().upsertOne<InstallationDbRow>(\n INSTALLATIONS,\n ['integration_id', 'org_id', 'external_id'],\n {\n integration_id: integrationId,\n org_id: input.orgId,\n connected_by_user_id: input.connectedByUserId,\n external_id: input.externalId,\n account_name: input.accountName ?? null,\n account_type: input.accountType ?? null,\n provider_metadata: input.providerMetadata ?? {},\n created_at: new Date(),\n },\n );\n return toInstallation(row);\n },\n delete: async ({ orgId, id }) => {\n const installation = await getInstallation({ orgId, id });\n if (!installation) return false;\n await db().deleteMany(INSTALLATIONS, { id, integration_id: integrationId, org_id: orgId });\n return true;\n },\n },\n repositories: {\n list: async ({ orgId, installationId }) => {\n await requireInstallation({ orgId, id: installationId });\n return (await db().findMany<RepositoryDbRow>(REPOSITORIES, { installation_id: installationId })).map(\n toRepository,\n );\n },\n get: getRepository,\n findByExternalId: async ({ orgId, externalId }) => {\n const rows = await db().findMany<RepositoryDbRow>(REPOSITORIES, { external_id: externalId });\n for (const row of rows) {\n if (await getInstallation({ orgId, id: row.installation_id })) return toRepository(row);\n }\n return null;\n },\n findBySlug: async ({ orgId, installationId, slug }) => {\n await requireInstallation({ orgId, id: installationId });\n const row = await db().findOne<RepositoryDbRow>(REPOSITORIES, { installation_id: installationId, slug });\n return row ? toRepository(row) : null;\n },\n upsert: async ({ orgId, input }) => {\n await requireInstallation({ orgId, id: input.installationId });\n const now = new Date();\n const row = await db().upsertOne<RepositoryDbRow>(REPOSITORIES, ['installation_id', 'external_id'], {\n installation_id: input.installationId,\n external_id: input.externalId,\n slug: input.slug,\n default_branch: input.defaultBranch,\n provider_metadata: input.providerMetadata ?? {},\n created_at: now,\n updated_at: now,\n });\n return toRepository(row);\n },\n migrateInstallation: async ({ orgId, id, newInstallationId }) => {\n const existing = await getRepository({ orgId, id });\n if (!existing) {\n throw new Error(`Repository ${id} not found in organization ${orgId}`);\n }\n await requireInstallation({ orgId, id: newInstallationId });\n try {\n await db().updateMany(REPOSITORIES, { id }, { installation_id: newInstallationId, updated_at: new Date() });\n // Migrate dependent connections to the new installation\n await db().updateMany(\n CONNECTIONS,\n { installation_id: existing.installationId },\n { installation_id: newInstallationId },\n );\n // Return the updated repository\n const updated = await getRepository({ orgId, id });\n if (!updated) throw new Error('Repository disappeared after update');\n return updated;\n } catch (error) {\n // Unique constraint violation: repository already exists under the new installation\n if (!(error instanceof UniqueViolationError)) throw error;\n // Find and return the existing repository under the new installation\n const conflictRow = await db().findOne<RepositoryDbRow>(REPOSITORIES, {\n installation_id: newInstallationId,\n external_id: existing.externalId,\n });\n if (!conflictRow) throw error; // Should never happen if we got a unique violation\n return toRepository(conflictRow);\n }\n },\n },\n connections: {\n list: async ({ orgId, factoryProjectId }) => {\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: factoryProjectId,\n org_id: orgId,\n });\n if (!project) return [];\n return (\n await db().findMany<ConnectionDbRow>(CONNECTIONS, {\n factory_project_id: factoryProjectId,\n integration_id: integrationId,\n })\n ).map(toConnection);\n },\n get: getConnection,\n create: async input => {\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: input.factoryProjectId,\n org_id: input.orgId,\n });\n if (!project) throw new Error('Factory project not found for this organization.');\n await requireInstallation({ orgId: input.orgId, id: input.installationId });\n try {\n const row = await db().insertOne<ConnectionDbRow>(CONNECTIONS, {\n factory_project_id: input.factoryProjectId,\n integration_id: integrationId,\n installation_id: input.installationId,\n created_by_user_id: input.createdByUserId,\n created_at: new Date(),\n });\n return toConnection(row);\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n const row = await db().findOne<ConnectionDbRow>(CONNECTIONS, {\n factory_project_id: input.factoryProjectId,\n integration_id: integrationId,\n installation_id: input.installationId,\n });\n if (!row) throw error;\n return toConnection(row);\n }\n },\n delete: async ({ orgId, id }) => {\n const connection = await getConnection({ orgId, id });\n if (!connection) return false;\n const projectRepositories = await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n connection_id: id,\n });\n for (const projectRepository of projectRepositories) {\n await db().deleteMany(SESSIONS, { project_repository_id: projectRepository.id });\n await db().deleteMany(WORKTREES, { project_repository_id: projectRepository.id });\n await db().deleteMany(SANDBOX_POOL, { project_repository_id: projectRepository.id });\n await db().deleteMany(SANDBOXES, { project_repository_id: projectRepository.id });\n }\n await db().deleteMany(PROJECT_REPOSITORIES, { connection_id: id });\n await db().deleteMany(CONNECTIONS, { id, integration_id: integrationId });\n return true;\n },\n },\n projectRepositories: {\n list: async ({ orgId, connectionId }) => {\n await requireConnection({ orgId, id: connectionId });\n return (\n await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, { connection_id: connectionId })\n ).map(toProjectRepository);\n },\n listConfiguredExternalKeys: async () => {\n const keys = new Map<string, ConfiguredExternalRepositoryKey>();\n const connections = await db().findMany<ConnectionDbRow>(CONNECTIONS, { integration_id: integrationId });\n for (const connection of connections) {\n const installation = await db().findOne<InstallationDbRow>(INSTALLATIONS, {\n id: connection.installation_id,\n integration_id: integrationId,\n });\n if (!installation) continue;\n const links = await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n connection_id: connection.id,\n });\n for (const link of links) {\n const repository = await db().findOne<RepositoryDbRow>(REPOSITORIES, { id: link.repository_id });\n if (!repository) continue;\n keys.set(`${installation.external_id}\\u0000${repository.external_id}`, {\n installationExternalId: installation.external_id,\n repositoryExternalId: repository.external_id,\n });\n }\n }\n return [...keys.values()];\n },\n listByExternalRepository: async ({ installationExternalId, repositoryExternalId }) => {\n const targets: ExternalRepositoryProjectTarget[] = [];\n const installations = await db().findMany<InstallationDbRow>(INSTALLATIONS, {\n integration_id: integrationId,\n external_id: installationExternalId,\n });\n for (const installation of installations) {\n const repository = await db().findOne<RepositoryDbRow>(REPOSITORIES, {\n installation_id: installation.id,\n external_id: repositoryExternalId,\n });\n if (!repository) continue;\n const links = await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n repository_id: repository.id,\n });\n for (const link of links) {\n const connection = await db().findOne<ConnectionDbRow>(CONNECTIONS, {\n id: link.connection_id,\n integration_id: integrationId,\n installation_id: installation.id,\n });\n if (!connection) continue;\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: connection.factory_project_id,\n org_id: installation.org_id,\n });\n if (!project) continue;\n targets.push({\n orgId: installation.org_id,\n factoryProjectId: connection.factory_project_id,\n projectRepository: toProjectRepository(link),\n });\n }\n }\n return targets;\n },\n get: getProjectRepository,\n link: async input => {\n const connection = await requireConnection({ orgId: input.orgId, id: input.connectionId });\n const repository = await requireRepository({ orgId: input.orgId, id: input.repositoryId });\n if (repository.installationId !== connection.installationId) {\n throw new Error('Repository does not belong to the connection installation.');\n }\n const now = new Date();\n const row = await db().upsertOne<ProjectRepositoryDbRow>(\n PROJECT_REPOSITORIES,\n ['connection_id', 'repository_id'],\n {\n connection_id: input.connectionId,\n repository_id: input.repositoryId,\n created_by_user_id: input.createdByUserId,\n branch: input.branch ?? null,\n sandbox_provider: input.sandboxProvider,\n sandbox_workdir: input.sandboxWorkdir,\n setup_command: input.setupCommand ?? null,\n teardown_command: input.teardownCommand ?? null,\n created_at: now,\n updated_at: now,\n },\n );\n return toProjectRepository(row);\n },\n update: async ({ orgId, id, input }) => {\n const existing = await getProjectRepository({ orgId, id });\n if (!existing) return null;\n const patch: Record<string, unknown> = { updated_at: new Date() };\n if (input.branch !== undefined) patch.branch = input.branch;\n if (input.sandboxProvider !== undefined) patch.sandbox_provider = input.sandboxProvider;\n if (input.sandboxWorkdir !== undefined) patch.sandbox_workdir = input.sandboxWorkdir;\n if (input.setupCommand !== undefined) patch.setup_command = input.setupCommand;\n if (input.teardownCommand !== undefined) patch.teardown_command = input.teardownCommand;\n await db().updateMany(PROJECT_REPOSITORIES, { id }, patch);\n return getProjectRepository({ orgId, id });\n },\n unlink: async ({ orgId, id }) => {\n const existing = await getProjectRepository({ orgId, id });\n if (!existing) return false;\n await db().deleteMany(SESSIONS, { project_repository_id: id });\n await db().deleteMany(WORKTREES, { project_repository_id: id });\n await db().deleteMany(SANDBOX_POOL, { project_repository_id: id });\n await db().deleteMany(SANDBOXES, { project_repository_id: id });\n await db().deleteMany(PROJECT_REPOSITORIES, { id });\n return true;\n },\n },\n sandboxes: {\n getOrCreate: async ({ projectRepository, userId }) => {\n await requireProjectRepositoryById(projectRepository.id);\n const where = { project_repository_id: projectRepository.id, user_id: userId };\n const existing = await db().findOne<SandboxDbRow>(SANDBOXES, where);\n if (existing) return toSandbox(existing);\n try {\n const row = await db().insertOne<SandboxDbRow>(SANDBOXES, {\n ...where,\n sandbox_id: null,\n sandbox_workdir: projectRepository.sandboxWorkdir,\n materialized_at: null,\n created_at: new Date(),\n });\n return toSandbox(row);\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n const row = await db().findOne<SandboxDbRow>(SANDBOXES, where);\n if (!row) throw error;\n return toSandbox(row);\n }\n },\n getById: ({ id }) => getSandbox(id),\n setWorkdir: async ({ id, sandboxWorkdir }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { sandbox_workdir: sandboxWorkdir, materialized_at: null });\n },\n setSandboxId: async ({ id, sandboxId }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { sandbox_id: sandboxId });\n },\n clearBinding: async ({ id }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { sandbox_id: null, materialized_at: null });\n },\n markMaterialized: async ({ id }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { materialized_at: new Date() });\n },\n },\n sandboxPool: {\n release: async input => {\n // Mirror claim(): a concurrently unlinked project repository makes\n // the release a silent no-op (the unlink cascade drops pool rows\n // anyway) — callers treat release as best-effort and must not throw.\n if (!(await getProjectRepositoryById(input.projectRepositoryId))) return;\n try {\n await db().insertOne<SandboxPoolDbRow>(SANDBOX_POOL, {\n org_id: input.orgId,\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n sandbox_id: input.sandboxId,\n sandbox_workdir: input.sandboxWorkdir,\n released_at: new Date(),\n });\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n // The provider sandbox is already pooled — keep the existing row.\n }\n },\n claim: async ({ projectRepositoryId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const rows = await db().findMany<SandboxPoolDbRow>(SANDBOX_POOL, {\n project_repository_id: projectRepositoryId,\n });\n rows.sort((left, right) => right.released_at.getTime() - left.released_at.getTime());\n for (const row of rows) {\n // Delete-by-id succeeds for exactly one concurrent claimer.\n if ((await db().deleteMany(SANDBOX_POOL, { id: row.id })) === 1) return toPooledSandbox(row);\n }\n return null;\n },\n },\n worktrees: {\n upsert: async input => {\n await requireProjectRepositoryById(input.projectRepositoryId);\n await db().upsertOne<WorktreeDbRow>(WORKTREES, ['project_repository_id', 'user_id', 'branch'], {\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n branch: input.branch,\n base_branch: input.baseBranch,\n worktree_path: input.worktreePath,\n created_at: new Date(),\n });\n },\n list: async ({ projectRepositoryId, userId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return [];\n const rows = await db().findMany<WorktreeDbRow>(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n });\n return rows.map(toWorktree);\n },\n get: async ({ projectRepositoryId, userId, branch }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const row = await db().findOne<WorktreeDbRow>(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n branch,\n });\n return row ? toWorktree(row) : null;\n },\n findByPath: async ({ projectRepositoryId, userId, worktreePath }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const row = await db().findOne<WorktreeDbRow>(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n worktree_path: worktreePath,\n });\n return row ? toWorktree(row) : null;\n },\n delete: async ({ projectRepositoryId, userId, branch }) => {\n await requireProjectRepositoryById(projectRepositoryId);\n await db().deleteMany(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n branch,\n });\n },\n },\n sessions: {\n list: async ({ projectRepositoryId, userId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return [];\n return (\n await db().findMany<SessionDbRow>(SESSIONS, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n })\n ).map(toSession);\n },\n listByProjectRepository: async ({ projectRepositoryId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return [];\n return (\n await db().findMany<SessionDbRow>(SESSIONS, {\n project_repository_id: projectRepositoryId,\n })\n ).map(toSession);\n },\n getBySessionId: async sessionId => {\n const row = await db().findOne<SessionDbRow>(SESSIONS, { session_id: sessionId });\n return row && (await getProjectRepositoryById(row.project_repository_id)) ? toSession(row) : null;\n },\n getForBranch: async ({ projectRepositoryId, userId, branch }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const row = await db().findOne<SessionDbRow>(SESSIONS, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n branch,\n });\n return row ? toSession(row) : null;\n },\n create: async input => {\n await requireProjectRepositoryById(input.projectRepositoryId);\n const existing = await db().findOne<SessionDbRow>(SESSIONS, {\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n branch: input.branch,\n });\n if (existing) return toSession(existing);\n const now = new Date();\n try {\n const row = await db().insertOne<SessionDbRow>(SESSIONS, {\n session_id: input.sessionId,\n project_repository_id: input.projectRepositoryId,\n org_id: input.orgId,\n user_id: input.userId,\n branch: input.branch,\n title: input.title ?? null,\n base_branch: input.baseBranch,\n sandbox_id: null,\n sandbox_workdir: null,\n materialized_at: null,\n first_message_at: null,\n created_at: now,\n updated_at: now,\n });\n return toSession(row);\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n const row = await db().findOne<SessionDbRow>(SESSIONS, {\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n branch: input.branch,\n });\n if (!row) throw error;\n return toSession(row);\n }\n },\n setSandbox: async ({ id, sandboxId, sandboxWorkdir }) => {\n await db().updateMany(\n SESSIONS,\n { id },\n { sandbox_id: sandboxId, sandbox_workdir: sandboxWorkdir, updated_at: new Date() },\n );\n },\n markMaterialized: async ({ id }) => {\n // `materialized_at: null` in the filter compiles to `IS NULL`, making\n // this a write-once update: session resumes (idle-reap, checkpoint\n // restore, sandbox recreate) match zero rows and cannot overwrite the\n // initial-materialize timestamp that `materialize_s` is derived from.\n await db().updateMany(\n SESSIONS,\n { id, materialized_at: null },\n { materialized_at: new Date(), updated_at: new Date() },\n );\n },\n markFirstMessage: async ({ sessionId }) => {\n // `first_message_at: null` in the filter compiles to `IS NULL`, making\n // this an atomic one-shot: concurrent callers and later messages\n // match zero rows. Sessions without a source-control row (chat-only\n // channels) are a zero-row no-op too.\n await db().updateMany(\n SESSIONS,\n { session_id: sessionId, first_message_at: null },\n { first_message_at: new Date(), updated_at: new Date() },\n );\n },\n markFirstMeaningfulExec: async ({ sessionId }) => {\n // Same atomic one-shot shape as markFirstMessage: the NULL filter\n // makes concurrent callers and later execs zero-row no-ops.\n await db().updateMany(\n SESSIONS,\n { session_id: sessionId, first_meaningful_exec_at: null },\n { first_meaningful_exec_at: new Date(), updated_at: new Date() },\n );\n },\n delete: async id => {\n await db().deleteMany(SESSIONS, { id });\n },\n },\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base.js","names":[],"sources":["../../../../src/storage/domains/source-control/base.ts"],"sourcesContent":["import { FactoryStorageDomain, UniqueViolationError } from '@mastra/core/storage';\nimport type { CollectionSchema, FactoryStorageOps } from '@mastra/core/storage';\n\nconst FACTORY_PROJECTS = 'factory_projects';\nconst INSTALLATIONS = 'source_control_installations';\nconst REPOSITORIES = 'source_control_repositories';\nconst CONNECTIONS = 'factory_project_source_control_connections';\nconst PROJECT_REPOSITORIES = 'factory_project_repositories';\nconst SANDBOXES = 'source_control_project_repository_sandboxes';\nconst SANDBOX_POOL = 'source_control_sandbox_pool';\nconst WORKTREES = 'source_control_worktrees';\nconst SESSIONS = 'source_control_sessions';\n\nexport const SOURCE_CONTROL_SCHEMAS: CollectionSchema[] = [\n {\n name: INSTALLATIONS,\n columns: {\n id: { type: 'uuid-pk' },\n integration_id: { type: 'text' },\n org_id: { type: 'text' },\n connected_by_user_id: { type: 'text' },\n external_id: { type: 'text' },\n account_name: { type: 'text', nullable: true },\n account_type: { type: 'text', nullable: true },\n provider_metadata: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_installations_integration_org_external_unique',\n columns: ['integration_id', 'org_id', 'external_id'],\n },\n ],\n },\n {\n name: REPOSITORIES,\n columns: {\n id: { type: 'uuid-pk' },\n installation_id: { type: 'text' },\n external_id: { type: 'text' },\n slug: { type: 'text' },\n default_branch: { type: 'text', default: 'main' },\n provider_metadata: { type: 'json' },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_repositories_installation_external_unique',\n columns: ['installation_id', 'external_id'],\n },\n ],\n indexes: [\n {\n name: 'source_control_repositories_installation_slug_idx',\n columns: ['installation_id', 'slug'],\n },\n ],\n },\n {\n name: CONNECTIONS,\n columns: {\n id: { type: 'uuid-pk' },\n factory_project_id: { type: 'text' },\n integration_id: { type: 'text' },\n installation_id: { type: 'text' },\n created_by_user_id: { type: 'text' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_project_source_control_connections_project_integration_installation_unique',\n columns: ['factory_project_id', 'integration_id', 'installation_id'],\n },\n ],\n indexes: [\n {\n name: 'factory_project_source_control_connections_project_idx',\n columns: ['factory_project_id'],\n },\n ],\n },\n {\n name: PROJECT_REPOSITORIES,\n columns: {\n id: { type: 'uuid-pk' },\n connection_id: { type: 'text' },\n repository_id: { type: 'text' },\n created_by_user_id: { type: 'text' },\n branch: { type: 'text', nullable: true },\n sandbox_provider: { type: 'text' },\n sandbox_workdir: { type: 'text' },\n setup_command: { type: 'text', nullable: true },\n base_checkpoint_name: { type: 'text', nullable: true },\n base_checkpoint_sha: { type: 'text', nullable: true },\n base_checkpoint_built_at: { type: 'timestamp', nullable: true },\n base_checkpoint_setup_hash: { type: 'text', nullable: true },\n teardown_command: { type: 'text', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'factory_project_repositories_connection_repository_unique',\n columns: ['connection_id', 'repository_id'],\n },\n ],\n indexes: [\n {\n name: 'factory_project_repositories_connection_idx',\n columns: ['connection_id'],\n },\n ],\n },\n {\n name: SANDBOXES,\n columns: {\n id: { type: 'uuid-pk' },\n project_repository_id: { type: 'text' },\n user_id: { type: 'text' },\n sandbox_id: { type: 'text', nullable: true },\n sandbox_workdir: { type: 'text' },\n materialized_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_project_repository_sandboxes_link_user_unique',\n columns: ['project_repository_id', 'user_id'],\n },\n ],\n },\n {\n name: SANDBOX_POOL,\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n project_repository_id: { type: 'text' },\n user_id: { type: 'text' },\n sandbox_id: { type: 'text' },\n sandbox_workdir: { type: 'text' },\n released_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_sandbox_pool_sandbox_unique',\n columns: ['sandbox_id'],\n },\n ],\n indexes: [\n {\n name: 'source_control_sandbox_pool_repository_user_idx',\n columns: ['project_repository_id', 'user_id'],\n },\n ],\n },\n {\n name: WORKTREES,\n columns: {\n id: { type: 'uuid-pk' },\n project_repository_id: { type: 'text' },\n user_id: { type: 'text' },\n branch: { type: 'text' },\n base_branch: { type: 'text' },\n worktree_path: { type: 'text' },\n created_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'source_control_worktrees_project_repository_user_branch_unique',\n columns: ['project_repository_id', 'user_id', 'branch'],\n },\n ],\n },\n {\n name: SESSIONS,\n columns: {\n id: { type: 'uuid-pk' },\n session_id: { type: 'text' },\n project_repository_id: { type: 'text' },\n org_id: { type: 'text' },\n user_id: { type: 'text' },\n branch: { type: 'text' },\n base_branch: { type: 'text' },\n title: { type: 'text', nullable: true },\n visibility: { type: 'text', nullable: true },\n sandbox_id: { type: 'text', nullable: true },\n sandbox_workdir: { type: 'text', nullable: true },\n materialized_at: { type: 'timestamp', nullable: true },\n first_message_at: { type: 'timestamp', nullable: true },\n first_meaningful_exec_at: { type: 'timestamp', nullable: true },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n { name: 'source_control_sessions_session_id_unique', columns: ['session_id'] },\n {\n name: 'source_control_sessions_repository_user_branch_unique',\n columns: ['project_repository_id', 'user_id', 'branch'],\n },\n ],\n },\n];\n\nexport type SourceControlProviderMetadata = Record<string, unknown>;\n\nexport interface SourceControlInstallation {\n id: string;\n integrationId: string;\n orgId: string;\n connectedByUserId: string;\n externalId: string;\n accountName: string | null;\n accountType: string | null;\n providerMetadata: SourceControlProviderMetadata;\n createdAt: Date;\n}\n\nexport interface UpsertSourceControlInstallationInput {\n orgId: string;\n connectedByUserId: string;\n externalId: string;\n accountName?: string | null;\n accountType?: string | null;\n providerMetadata?: SourceControlProviderMetadata;\n}\n\nexport interface SourceControlRepository {\n id: string;\n installationId: string;\n externalId: string;\n slug: string;\n defaultBranch: string;\n providerMetadata: SourceControlProviderMetadata;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface UpsertSourceControlRepositoryInput {\n installationId: string;\n externalId: string;\n slug: string;\n defaultBranch: string;\n providerMetadata?: SourceControlProviderMetadata;\n}\n\nexport interface ProjectSourceControlConnection {\n id: string;\n factoryProjectId: string;\n integrationId: string;\n installationId: string;\n createdByUserId: string;\n createdAt: Date;\n}\n\nexport interface CreateProjectSourceControlConnectionInput {\n orgId: string;\n factoryProjectId: string;\n installationId: string;\n createdByUserId: string;\n}\n\nexport interface ProjectRepository {\n id: string;\n connectionId: string;\n repositoryId: string;\n createdByUserId: string;\n branch: string | null;\n sandboxProvider: string;\n sandboxWorkdir: string;\n setupCommand: string | null;\n /** Base checkpoint metadata — set by the base-checkpoint build job. */\n baseCheckpoint: ProjectRepositoryBaseCheckpoint | null;\n teardownCommand: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/**\n * Metadata for a repo's warm base checkpoint (cloned default branch + setup\n * command already run). New sessions boot from it instead of a cold clone.\n */\nexport interface ProjectRepositoryBaseCheckpoint {\n /** Provider checkpoint name, e.g. `repo-<projectRepositoryId>`. */\n name: string;\n /** Default-branch HEAD sha the checkpoint was built at. */\n sha: string;\n builtAt: Date;\n /** Hash of the setup command at build time (null when no setup command) — mismatch invalidates the checkpoint. */\n setupCommandHash: string | null;\n}\n\nexport interface ExternalRepositoryProjectTarget {\n orgId: string;\n factoryProjectId: string;\n projectRepository: ProjectRepository;\n}\n\n/** External id pair identifying a repository linked to a factory project. */\nexport interface ConfiguredExternalRepositoryKey {\n installationExternalId: string;\n repositoryExternalId: string;\n}\n\nexport interface LinkProjectRepositoryInput {\n orgId: string;\n connectionId: string;\n repositoryId: string;\n createdByUserId: string;\n branch?: string | null;\n sandboxProvider: string;\n sandboxWorkdir: string;\n setupCommand?: string | null;\n teardownCommand?: string | null;\n}\n\nexport interface UpdateProjectRepositoryInput {\n branch?: string | null;\n sandboxProvider?: string;\n sandboxWorkdir?: string;\n setupCommand?: string | null;\n teardownCommand?: string | null;\n}\n\nexport interface ProjectRepositorySandbox {\n id: string;\n projectRepositoryId: string;\n userId: string;\n sandboxId: string | null;\n sandboxWorkdir: string;\n materializedAt: Date | null;\n createdAt: Date;\n}\n\n/**\n * A provider sandbox that is no longer bound to any session and can be handed\n * to the next session for the same project-repository link instead of\n * provisioning a fresh VM. Pooling is per-repository, not per-user: no\n * credentials are baked into the VM (tokens are injected per command), so any\n * user's session can safely claim it. `userId` records who released it,\n * purely as provenance.\n */\nexport interface PooledSandbox {\n id: string;\n orgId: string;\n projectRepositoryId: string;\n /** User whose session released this sandbox (provenance, not a claim key). */\n userId: string;\n sandboxId: string;\n sandboxWorkdir: string;\n releasedAt: Date;\n}\n\nexport interface ReleasePooledSandboxInput {\n orgId: string;\n projectRepositoryId: string;\n userId: string;\n sandboxId: string;\n sandboxWorkdir: string;\n}\n\nexport interface SourceControlWorktree {\n id: string;\n projectRepositoryId: string;\n userId: string;\n branch: string;\n baseBranch: string;\n worktreePath: string;\n createdAt: Date;\n}\n\nexport interface UpsertSourceControlWorktreeInput {\n projectRepositoryId: string;\n userId: string;\n branch: string;\n baseBranch: string;\n worktreePath: string;\n}\n\n/**\n * Who can open a session: 'org' sessions are visible to every member of the\n * owning organization, 'private' sessions only to their owner. Stored at\n * creation; rows created before the column existed read as 'org'.\n */\nexport type SourceControlSessionVisibility = 'org' | 'private';\n\nexport interface SourceControlSession {\n id: string;\n sessionId: string;\n projectRepositoryId: string;\n orgId: string;\n userId: string;\n branch: string;\n title: string | null;\n visibility: SourceControlSessionVisibility;\n baseBranch: string;\n sandboxId: string | null;\n sandboxWorkdir: string | null;\n materializedAt: Date | null;\n /** When the first user message reached the session's agent. Write-once. */\n firstMessageAt: Date | null;\n /** When the agent's first successful sandbox exec finished. Write-once. */\n firstMeaningfulExecAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateSourceControlSessionInput {\n sessionId: string;\n projectRepositoryId: string;\n orgId: string;\n userId: string;\n branch: string;\n title?: string | null;\n /** Defaults to 'org' when omitted, matching how NULL rows are read. */\n visibility?: SourceControlSessionVisibility;\n baseBranch: string;\n}\n\nexport interface SourceControlStorageHandle {\n readonly integrationId: string;\n readonly installations: {\n list(args: { orgId: string }): Promise<SourceControlInstallation[]>;\n get(args: { orgId: string; id: string }): Promise<SourceControlInstallation | null>;\n findByExternalId(args: { orgId: string; externalId: string }): Promise<SourceControlInstallation | null>;\n upsert(args: UpsertSourceControlInstallationInput): Promise<SourceControlInstallation>;\n delete(args: { orgId: string; id: string }): Promise<boolean>;\n };\n readonly repositories: {\n list(args: { orgId: string; installationId: string }): Promise<SourceControlRepository[]>;\n get(args: { orgId: string; id: string }): Promise<SourceControlRepository | null>;\n findByExternalId(args: { orgId: string; externalId: string }): Promise<SourceControlRepository | null>;\n findBySlug(args: { orgId: string; installationId: string; slug: string }): Promise<SourceControlRepository | null>;\n upsert(args: { orgId: string; input: UpsertSourceControlRepositoryInput }): Promise<SourceControlRepository>;\n /**\n * Migrate a repository and its dependent connections to a new installation.\n * Used when a GitHub App is reinstalled with a new installation ID on the same account.\n * Returns the repository under the new installation (either migrated or existing).\n */\n migrateInstallation(args: {\n orgId: string;\n id: string;\n newInstallationId: string;\n }): Promise<SourceControlRepository>;\n };\n readonly connections: {\n list(args: { orgId: string; factoryProjectId: string }): Promise<ProjectSourceControlConnection[]>;\n get(args: { orgId: string; id: string }): Promise<ProjectSourceControlConnection | null>;\n create(args: CreateProjectSourceControlConnectionInput): Promise<ProjectSourceControlConnection>;\n delete(args: { orgId: string; id: string }): Promise<boolean>;\n };\n readonly projectRepositories: {\n list(args: { orgId: string; connectionId: string }): Promise<ProjectRepository[]>;\n listByExternalRepository(args: {\n installationExternalId: string;\n repositoryExternalId: string;\n }): Promise<ExternalRepositoryProjectTarget[]>;\n /**\n * Distinct external (installation, repository) id pairs linked to any\n * factory project. Lets sweeps scope work to configured repositories\n * without probing every repository an installation can see.\n */\n listConfiguredExternalKeys(): Promise<ConfiguredExternalRepositoryKey[]>;\n get(args: { orgId: string; id: string }): Promise<ProjectRepository | null>;\n link(args: LinkProjectRepositoryInput): Promise<ProjectRepository>;\n update(args: { orgId: string; id: string; input: UpdateProjectRepositoryInput }): Promise<ProjectRepository | null>;\n /**\n * Record (or clear, with `checkpoint: null`) the repo's base-checkpoint\n * metadata after a build job snapshots the prepared workdir. Writes from a\n * build are ignored when the setup command changed while it was running.\n */\n setBaseCheckpoint(\n args:\n | { id: string; checkpoint: null }\n | { id: string; checkpoint: ProjectRepositoryBaseCheckpoint; expectedSetupCommand: string | null },\n ): Promise<void>;\n unlink(args: { orgId: string; id: string }): Promise<boolean>;\n };\n readonly sandboxes: {\n getOrCreate(args: { projectRepository: ProjectRepository; userId: string }): Promise<ProjectRepositorySandbox>;\n getById(args: { id: string }): Promise<ProjectRepositorySandbox | null>;\n /**\n * Point the binding at a new workdir and clear `materializedAt` — a moved\n * workdir means the checkout must be re-cloned. Used to heal bindings whose\n * inherited workdir went stale (e.g. the sandbox provider changed).\n */\n setWorkdir(args: { id: string; sandboxWorkdir: string }): Promise<void>;\n setSandboxId(args: { id: string; sandboxId: string }): Promise<void>;\n clearBinding(args: { id: string }): Promise<void>;\n markMaterialized(args: { id: string }): Promise<void>;\n };\n readonly sandboxPool: {\n /**\n * Return a sandbox to the reuse pool. Idempotent per provider sandbox ID —\n * releasing the same sandbox twice keeps one pool row.\n */\n release(args: ReleasePooledSandboxInput): Promise<void>;\n /**\n * Atomically take one pooled sandbox for the given project-repository\n * link, preferring the most recently released (warmest) VM. Returns\n * `null` when the pool is empty. Each pooled sandbox is handed to exactly\n * one claimer even under concurrent claims.\n */\n claim(args: { projectRepositoryId: string }): Promise<PooledSandbox | null>;\n };\n readonly worktrees: {\n upsert(args: UpsertSourceControlWorktreeInput): Promise<void>;\n list(args: { projectRepositoryId: string; userId: string }): Promise<SourceControlWorktree[]>;\n get(args: { projectRepositoryId: string; userId: string; branch: string }): Promise<SourceControlWorktree | null>;\n findByPath(args: {\n projectRepositoryId: string;\n userId: string;\n worktreePath: string;\n }): Promise<SourceControlWorktree | null>;\n delete(args: { projectRepositoryId: string; userId: string; branch: string }): Promise<void>;\n };\n readonly sessions: {\n /**\n * Viewer-aware listing: every org-visible session for the repository\n * (regardless of owner) plus the viewer's own private sessions.\n */\n list(args: { projectRepositoryId: string; viewerUserId: string }): Promise<SourceControlSession[]>;\n /**\n * System-level listing of every session for the repository regardless of\n * visibility. For internal flows only (session retirement, repository\n * teardown); never expose directly to a viewer.\n */\n listByProjectRepository(args: { projectRepositoryId: string }): Promise<SourceControlSession[]>;\n getBySessionId(sessionId: string): Promise<SourceControlSession | null>;\n getForBranch(args: {\n projectRepositoryId: string;\n userId: string;\n branch: string;\n }): Promise<SourceControlSession | null>;\n create(input: CreateSourceControlSessionInput): Promise<SourceControlSession>;\n setSandbox(args: { id: string; sandboxId: string | null; sandboxWorkdir: string }): Promise<void>;\n /**\n * Record when the session's workspace was first materialized. Write-once:\n * the guarded update only lands while the column is still NULL, so resumes\n * (Railway idle-reap, checkpoint restore, sandbox recreate) do not overwrite\n * the initial-materialize baseline that `materialize_s = materialized_at -\n * created_at` depends on.\n */\n markMaterialized(args: { id: string }): Promise<void>;\n /**\n * Record when the session's agent received its first user message.\n * Write-once: the guarded update only lands while the column is still\n * NULL, so retries and process restarts are no-ops. Keyed by the\n * controller-facing `sessionId` (not the row id) because the caller —\n * the session observer — only knows the controller resourceId.\n */\n markFirstMessage(args: { sessionId: string }): Promise<void>;\n /**\n * Record when the session's agent completed its first successful sandbox\n * exec (TTFME anchor). Same write-once contract as `markFirstMessage`:\n * guarded on the column being NULL, keyed by the controller-facing\n * `sessionId`.\n */\n markFirstMeaningfulExec(args: { sessionId: string }): Promise<void>;\n delete(id: string): Promise<void>;\n };\n}\n\ninterface InstallationDbRow extends Record<string, unknown> {\n id: string;\n integration_id: string;\n org_id: string;\n connected_by_user_id: string;\n external_id: string;\n account_name: string | null;\n account_type: string | null;\n provider_metadata: SourceControlProviderMetadata;\n created_at: Date;\n}\n\ninterface RepositoryDbRow extends Record<string, unknown> {\n id: string;\n installation_id: string;\n external_id: string;\n slug: string;\n default_branch: string;\n provider_metadata: SourceControlProviderMetadata;\n created_at: Date;\n updated_at: Date;\n}\n\ninterface ConnectionDbRow extends Record<string, unknown> {\n id: string;\n factory_project_id: string;\n integration_id: string;\n installation_id: string;\n created_by_user_id: string;\n created_at: Date;\n}\n\ninterface ProjectRepositoryDbRow extends Record<string, unknown> {\n id: string;\n connection_id: string;\n repository_id: string;\n created_by_user_id: string;\n branch: string | null;\n sandbox_provider: string;\n sandbox_workdir: string;\n setup_command: string | null;\n base_checkpoint_name: string | null;\n base_checkpoint_sha: string | null;\n base_checkpoint_built_at: Date | null;\n base_checkpoint_setup_hash: string | null;\n teardown_command: string | null;\n created_at: Date;\n updated_at: Date;\n}\n\ninterface SandboxDbRow extends Record<string, unknown> {\n id: string;\n project_repository_id: string;\n user_id: string;\n sandbox_id: string | null;\n sandbox_workdir: string;\n materialized_at: Date | null;\n created_at: Date;\n}\n\ninterface SandboxPoolDbRow extends Record<string, unknown> {\n id: string;\n org_id: string;\n project_repository_id: string;\n user_id: string;\n sandbox_id: string;\n sandbox_workdir: string;\n released_at: Date;\n}\n\ninterface WorktreeDbRow extends Record<string, unknown> {\n id: string;\n project_repository_id: string;\n user_id: string;\n branch: string;\n base_branch: string;\n worktree_path: string;\n created_at: Date;\n}\n\ninterface SessionDbRow extends Record<string, unknown> {\n id: string;\n session_id: string;\n project_repository_id: string;\n org_id: string;\n user_id: string;\n branch: string;\n title: string | null;\n visibility: string | null;\n base_branch: string;\n sandbox_id: string | null;\n sandbox_workdir: string | null;\n materialized_at: Date | null;\n first_message_at: Date | null;\n first_meaningful_exec_at: Date | null;\n created_at: Date;\n updated_at: Date;\n}\n\nfunction toInstallation(row: InstallationDbRow): SourceControlInstallation {\n return {\n id: row.id,\n integrationId: row.integration_id,\n orgId: row.org_id,\n connectedByUserId: row.connected_by_user_id,\n externalId: row.external_id,\n accountName: row.account_name,\n accountType: row.account_type,\n providerMetadata: row.provider_metadata,\n createdAt: row.created_at,\n };\n}\n\nfunction toRepository(row: RepositoryDbRow): SourceControlRepository {\n return {\n id: row.id,\n installationId: row.installation_id,\n externalId: row.external_id,\n slug: row.slug,\n defaultBranch: row.default_branch,\n providerMetadata: row.provider_metadata,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction toConnection(row: ConnectionDbRow): ProjectSourceControlConnection {\n return {\n id: row.id,\n factoryProjectId: row.factory_project_id,\n integrationId: row.integration_id,\n installationId: row.installation_id,\n createdByUserId: row.created_by_user_id,\n createdAt: row.created_at,\n };\n}\n\nfunction toProjectRepository(row: ProjectRepositoryDbRow): ProjectRepository {\n return {\n id: row.id,\n connectionId: row.connection_id,\n repositoryId: row.repository_id,\n createdByUserId: row.created_by_user_id,\n branch: row.branch,\n sandboxProvider: row.sandbox_provider,\n sandboxWorkdir: row.sandbox_workdir,\n setupCommand: row.setup_command,\n baseCheckpoint:\n row.base_checkpoint_name && row.base_checkpoint_sha && row.base_checkpoint_built_at\n ? {\n name: row.base_checkpoint_name,\n sha: row.base_checkpoint_sha,\n builtAt: row.base_checkpoint_built_at,\n setupCommandHash: row.base_checkpoint_setup_hash ?? null,\n }\n : null,\n teardownCommand: row.teardown_command,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction toSandbox(row: SandboxDbRow): ProjectRepositorySandbox {\n return {\n id: row.id,\n projectRepositoryId: row.project_repository_id,\n userId: row.user_id,\n sandboxId: row.sandbox_id,\n sandboxWorkdir: row.sandbox_workdir,\n materializedAt: row.materialized_at,\n createdAt: row.created_at,\n };\n}\n\nfunction toPooledSandbox(row: SandboxPoolDbRow): PooledSandbox {\n return {\n id: row.id,\n orgId: row.org_id,\n projectRepositoryId: row.project_repository_id,\n userId: row.user_id,\n sandboxId: row.sandbox_id,\n sandboxWorkdir: row.sandbox_workdir,\n releasedAt: row.released_at,\n };\n}\n\nfunction toWorktree(row: WorktreeDbRow): SourceControlWorktree {\n return {\n id: row.id,\n projectRepositoryId: row.project_repository_id,\n userId: row.user_id,\n branch: row.branch,\n baseBranch: row.base_branch,\n worktreePath: row.worktree_path,\n createdAt: row.created_at,\n };\n}\n\nfunction toSession(row: SessionDbRow): SourceControlSession {\n return {\n id: row.id,\n sessionId: row.session_id,\n projectRepositoryId: row.project_repository_id,\n orgId: row.org_id,\n userId: row.user_id,\n branch: row.branch,\n title: row.title,\n visibility: row.visibility === 'private' ? 'private' : 'org',\n baseBranch: row.base_branch,\n sandboxId: row.sandbox_id,\n sandboxWorkdir: row.sandbox_workdir,\n materializedAt: row.materialized_at,\n firstMessageAt: row.first_message_at,\n firstMeaningfulExecAt: row.first_meaningful_exec_at,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport class SourceControlStorage extends FactoryStorageDomain {\n constructor() {\n super('source-control');\n }\n\n async init(): Promise<void> {\n await this.ensureCollections(SOURCE_CONTROL_SCHEMAS);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.ops.deleteMany(SESSIONS, {});\n await this.ops.deleteMany(WORKTREES, {});\n await this.ops.deleteMany(SANDBOX_POOL, {});\n await this.ops.deleteMany(SANDBOXES, {});\n await this.ops.deleteMany(PROJECT_REPOSITORIES, {});\n await this.ops.deleteMany(CONNECTIONS, {});\n await this.ops.deleteMany(REPOSITORIES, {});\n await this.ops.deleteMany(INSTALLATIONS, {});\n }\n\n forIntegration(integrationId: string): SourceControlStorageHandle {\n if (!integrationId.trim()) throw new Error('[SourceControlStorage] integrationId must not be empty.');\n const db = (): FactoryStorageOps => this.ops;\n\n const getInstallation = async (args: { orgId: string; id: string }): Promise<SourceControlInstallation | null> => {\n const row = await db().findOne<InstallationDbRow>(INSTALLATIONS, {\n id: args.id,\n integration_id: integrationId,\n org_id: args.orgId,\n });\n return row ? toInstallation(row) : null;\n };\n\n const requireInstallation = async (args: { orgId: string; id: string }): Promise<SourceControlInstallation> => {\n const installation = await getInstallation(args);\n if (!installation)\n throw new Error('Source-control installation not found for this organization and integration.');\n return installation;\n };\n\n const getRepository = async (args: { orgId: string; id: string }): Promise<SourceControlRepository | null> => {\n const row = await db().findOne<RepositoryDbRow>(REPOSITORIES, { id: args.id });\n if (!row || !(await getInstallation({ orgId: args.orgId, id: row.installation_id }))) return null;\n return toRepository(row);\n };\n\n const requireRepository = async (args: { orgId: string; id: string }): Promise<SourceControlRepository> => {\n const repository = await getRepository(args);\n if (!repository) throw new Error('Source-control repository not found for this organization and integration.');\n return repository;\n };\n\n const getConnection = async (args: {\n orgId: string;\n id: string;\n }): Promise<ProjectSourceControlConnection | null> => {\n const row = await db().findOne<ConnectionDbRow>(CONNECTIONS, { id: args.id, integration_id: integrationId });\n if (!row) return null;\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: row.factory_project_id,\n org_id: args.orgId,\n });\n if (!project || !(await getInstallation({ orgId: args.orgId, id: row.installation_id }))) return null;\n return toConnection(row);\n };\n\n const requireConnection = async (args: { orgId: string; id: string }): Promise<ProjectSourceControlConnection> => {\n const connection = await getConnection(args);\n if (!connection)\n throw new Error('Project source-control connection not found for this organization and integration.');\n return connection;\n };\n\n const getProjectRepository = async (args: { orgId: string; id: string }): Promise<ProjectRepository | null> => {\n const row = await db().findOne<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, { id: args.id });\n if (!row || !(await getConnection({ orgId: args.orgId, id: row.connection_id }))) return null;\n return toProjectRepository(row);\n };\n\n const getProjectRepositoryById = async (id: string): Promise<ProjectRepository | null> => {\n const row = await db().findOne<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, { id });\n if (!row) return null;\n const connection = await db().findOne<ConnectionDbRow>(CONNECTIONS, {\n id: row.connection_id,\n integration_id: integrationId,\n });\n return connection ? toProjectRepository(row) : null;\n };\n\n const requireProjectRepositoryById = async (id: string): Promise<ProjectRepository> => {\n const projectRepository = await getProjectRepositoryById(id);\n if (!projectRepository) throw new Error('Project repository not found for this integration.');\n return projectRepository;\n };\n\n const getSandbox = async (id: string): Promise<ProjectRepositorySandbox | null> => {\n const row = await db().findOne<SandboxDbRow>(SANDBOXES, { id });\n if (!row || !(await getProjectRepositoryById(row.project_repository_id))) return null;\n return toSandbox(row);\n };\n\n const requireSandbox = async (id: string): Promise<ProjectRepositorySandbox> => {\n const sandbox = await getSandbox(id);\n if (!sandbox) throw new Error('Project-repository sandbox not found for this integration.');\n return sandbox;\n };\n\n return {\n integrationId,\n installations: {\n list: async ({ orgId }) =>\n (\n await db().findMany<InstallationDbRow>(INSTALLATIONS, {\n integration_id: integrationId,\n org_id: orgId,\n })\n ).map(toInstallation),\n get: getInstallation,\n findByExternalId: async ({ orgId, externalId }) => {\n const row = await db().findOne<InstallationDbRow>(INSTALLATIONS, {\n integration_id: integrationId,\n org_id: orgId,\n external_id: externalId,\n });\n return row ? toInstallation(row) : null;\n },\n upsert: async input => {\n const row = await db().upsertOne<InstallationDbRow>(\n INSTALLATIONS,\n ['integration_id', 'org_id', 'external_id'],\n {\n integration_id: integrationId,\n org_id: input.orgId,\n connected_by_user_id: input.connectedByUserId,\n external_id: input.externalId,\n account_name: input.accountName ?? null,\n account_type: input.accountType ?? null,\n provider_metadata: input.providerMetadata ?? {},\n created_at: new Date(),\n },\n );\n return toInstallation(row);\n },\n delete: async ({ orgId, id }) => {\n const installation = await getInstallation({ orgId, id });\n if (!installation) return false;\n await db().deleteMany(INSTALLATIONS, { id, integration_id: integrationId, org_id: orgId });\n return true;\n },\n },\n repositories: {\n list: async ({ orgId, installationId }) => {\n await requireInstallation({ orgId, id: installationId });\n return (await db().findMany<RepositoryDbRow>(REPOSITORIES, { installation_id: installationId })).map(\n toRepository,\n );\n },\n get: getRepository,\n findByExternalId: async ({ orgId, externalId }) => {\n const rows = await db().findMany<RepositoryDbRow>(REPOSITORIES, { external_id: externalId });\n for (const row of rows) {\n if (await getInstallation({ orgId, id: row.installation_id })) return toRepository(row);\n }\n return null;\n },\n findBySlug: async ({ orgId, installationId, slug }) => {\n await requireInstallation({ orgId, id: installationId });\n const row = await db().findOne<RepositoryDbRow>(REPOSITORIES, { installation_id: installationId, slug });\n return row ? toRepository(row) : null;\n },\n upsert: async ({ orgId, input }) => {\n await requireInstallation({ orgId, id: input.installationId });\n const now = new Date();\n const row = await db().upsertOne<RepositoryDbRow>(REPOSITORIES, ['installation_id', 'external_id'], {\n installation_id: input.installationId,\n external_id: input.externalId,\n slug: input.slug,\n default_branch: input.defaultBranch,\n provider_metadata: input.providerMetadata ?? {},\n created_at: now,\n updated_at: now,\n });\n return toRepository(row);\n },\n migrateInstallation: async ({ orgId, id, newInstallationId }) => {\n const existing = await getRepository({ orgId, id });\n if (!existing) {\n throw new Error(`Repository ${id} not found in organization ${orgId}`);\n }\n await requireInstallation({ orgId, id: newInstallationId });\n try {\n await db().updateMany(REPOSITORIES, { id }, { installation_id: newInstallationId, updated_at: new Date() });\n // Migrate dependent connections to the new installation\n await db().updateMany(\n CONNECTIONS,\n { installation_id: existing.installationId },\n { installation_id: newInstallationId },\n );\n // Return the updated repository\n const updated = await getRepository({ orgId, id });\n if (!updated) throw new Error('Repository disappeared after update');\n return updated;\n } catch (error) {\n // Unique constraint violation: repository already exists under the new installation\n if (!(error instanceof UniqueViolationError)) throw error;\n // Find and return the existing repository under the new installation\n const conflictRow = await db().findOne<RepositoryDbRow>(REPOSITORIES, {\n installation_id: newInstallationId,\n external_id: existing.externalId,\n });\n if (!conflictRow) throw error; // Should never happen if we got a unique violation\n return toRepository(conflictRow);\n }\n },\n },\n connections: {\n list: async ({ orgId, factoryProjectId }) => {\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: factoryProjectId,\n org_id: orgId,\n });\n if (!project) return [];\n return (\n await db().findMany<ConnectionDbRow>(CONNECTIONS, {\n factory_project_id: factoryProjectId,\n integration_id: integrationId,\n })\n ).map(toConnection);\n },\n get: getConnection,\n create: async input => {\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: input.factoryProjectId,\n org_id: input.orgId,\n });\n if (!project) throw new Error('Factory project not found for this organization.');\n await requireInstallation({ orgId: input.orgId, id: input.installationId });\n try {\n const row = await db().insertOne<ConnectionDbRow>(CONNECTIONS, {\n factory_project_id: input.factoryProjectId,\n integration_id: integrationId,\n installation_id: input.installationId,\n created_by_user_id: input.createdByUserId,\n created_at: new Date(),\n });\n return toConnection(row);\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n const row = await db().findOne<ConnectionDbRow>(CONNECTIONS, {\n factory_project_id: input.factoryProjectId,\n integration_id: integrationId,\n installation_id: input.installationId,\n });\n if (!row) throw error;\n return toConnection(row);\n }\n },\n delete: async ({ orgId, id }) => {\n const connection = await getConnection({ orgId, id });\n if (!connection) return false;\n const projectRepositories = await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n connection_id: id,\n });\n for (const projectRepository of projectRepositories) {\n await db().deleteMany(SESSIONS, { project_repository_id: projectRepository.id });\n await db().deleteMany(WORKTREES, { project_repository_id: projectRepository.id });\n await db().deleteMany(SANDBOX_POOL, { project_repository_id: projectRepository.id });\n await db().deleteMany(SANDBOXES, { project_repository_id: projectRepository.id });\n }\n await db().deleteMany(PROJECT_REPOSITORIES, { connection_id: id });\n await db().deleteMany(CONNECTIONS, { id, integration_id: integrationId });\n return true;\n },\n },\n projectRepositories: {\n list: async ({ orgId, connectionId }) => {\n await requireConnection({ orgId, id: connectionId });\n return (\n await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, { connection_id: connectionId })\n ).map(toProjectRepository);\n },\n listConfiguredExternalKeys: async () => {\n const keys = new Map<string, ConfiguredExternalRepositoryKey>();\n const connections = await db().findMany<ConnectionDbRow>(CONNECTIONS, { integration_id: integrationId });\n for (const connection of connections) {\n const installation = await db().findOne<InstallationDbRow>(INSTALLATIONS, {\n id: connection.installation_id,\n integration_id: integrationId,\n });\n if (!installation) continue;\n const links = await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n connection_id: connection.id,\n });\n for (const link of links) {\n const repository = await db().findOne<RepositoryDbRow>(REPOSITORIES, { id: link.repository_id });\n if (!repository) continue;\n keys.set(`${installation.external_id}\\u0000${repository.external_id}`, {\n installationExternalId: installation.external_id,\n repositoryExternalId: repository.external_id,\n });\n }\n }\n return [...keys.values()];\n },\n listByExternalRepository: async ({ installationExternalId, repositoryExternalId }) => {\n const targets: ExternalRepositoryProjectTarget[] = [];\n const installations = await db().findMany<InstallationDbRow>(INSTALLATIONS, {\n integration_id: integrationId,\n external_id: installationExternalId,\n });\n for (const installation of installations) {\n const repository = await db().findOne<RepositoryDbRow>(REPOSITORIES, {\n installation_id: installation.id,\n external_id: repositoryExternalId,\n });\n if (!repository) continue;\n const links = await db().findMany<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n repository_id: repository.id,\n });\n for (const link of links) {\n const connection = await db().findOne<ConnectionDbRow>(CONNECTIONS, {\n id: link.connection_id,\n integration_id: integrationId,\n installation_id: installation.id,\n });\n if (!connection) continue;\n const project = await db().findOne<Record<string, unknown>>(FACTORY_PROJECTS, {\n id: connection.factory_project_id,\n org_id: installation.org_id,\n });\n if (!project) continue;\n targets.push({\n orgId: installation.org_id,\n factoryProjectId: connection.factory_project_id,\n projectRepository: toProjectRepository(link),\n });\n }\n }\n return targets;\n },\n get: getProjectRepository,\n link: async input => {\n const connection = await requireConnection({ orgId: input.orgId, id: input.connectionId });\n const repository = await requireRepository({ orgId: input.orgId, id: input.repositoryId });\n if (repository.installationId !== connection.installationId) {\n throw new Error('Repository does not belong to the connection installation.');\n }\n const now = new Date();\n try {\n const row = await db().insertOne<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n connection_id: input.connectionId,\n repository_id: input.repositoryId,\n created_by_user_id: input.createdByUserId,\n branch: input.branch ?? null,\n sandbox_provider: input.sandboxProvider,\n sandbox_workdir: input.sandboxWorkdir,\n setup_command: input.setupCommand ?? null,\n teardown_command: input.teardownCommand ?? null,\n created_at: now,\n updated_at: now,\n });\n return toProjectRepository(row);\n } catch (error) {\n // Retrying link() after setBaseCheckpoint() must not wipe the\n // existing checkpoint. Match the in-memory handle: return the\n // existing row unchanged on a unique-constraint race.\n if (!(error instanceof UniqueViolationError)) throw error;\n const row = await db().findOne<ProjectRepositoryDbRow>(PROJECT_REPOSITORIES, {\n connection_id: input.connectionId,\n repository_id: input.repositoryId,\n });\n if (!row) throw error;\n return toProjectRepository(row);\n }\n },\n update: async ({ orgId, id, input }) => {\n const existing = await getProjectRepository({ orgId, id });\n if (!existing) return null;\n const patch: Record<string, unknown> = { updated_at: new Date() };\n if (input.branch !== undefined) patch.branch = input.branch;\n if (input.sandboxProvider !== undefined) patch.sandbox_provider = input.sandboxProvider;\n if (input.sandboxWorkdir !== undefined) patch.sandbox_workdir = input.sandboxWorkdir;\n if (input.setupCommand !== undefined) patch.setup_command = input.setupCommand;\n // A changed setup command invalidates the base checkpoint — it was\n // built with the old command baked in.\n if (input.setupCommand !== undefined && input.setupCommand !== existing.setupCommand) {\n patch.base_checkpoint_name = null;\n patch.base_checkpoint_sha = null;\n patch.base_checkpoint_built_at = null;\n patch.base_checkpoint_setup_hash = null;\n }\n if (input.teardownCommand !== undefined) patch.teardown_command = input.teardownCommand;\n await db().updateMany(PROJECT_REPOSITORIES, { id }, patch);\n return getProjectRepository({ orgId, id });\n },\n setBaseCheckpoint: async args => {\n await requireProjectRepositoryById(args.id);\n await db().updateMany(\n PROJECT_REPOSITORIES,\n args.checkpoint ? { id: args.id, setup_command: args.expectedSetupCommand } : { id: args.id },\n args.checkpoint\n ? {\n base_checkpoint_name: args.checkpoint.name,\n base_checkpoint_sha: args.checkpoint.sha,\n base_checkpoint_built_at: args.checkpoint.builtAt,\n base_checkpoint_setup_hash: args.checkpoint.setupCommandHash,\n }\n : {\n base_checkpoint_name: null,\n base_checkpoint_sha: null,\n base_checkpoint_built_at: null,\n base_checkpoint_setup_hash: null,\n },\n );\n },\n unlink: async ({ orgId, id }) => {\n const existing = await getProjectRepository({ orgId, id });\n if (!existing) return false;\n await db().deleteMany(SESSIONS, { project_repository_id: id });\n await db().deleteMany(WORKTREES, { project_repository_id: id });\n await db().deleteMany(SANDBOX_POOL, { project_repository_id: id });\n await db().deleteMany(SANDBOXES, { project_repository_id: id });\n await db().deleteMany(PROJECT_REPOSITORIES, { id });\n return true;\n },\n },\n sandboxes: {\n getOrCreate: async ({ projectRepository, userId }) => {\n await requireProjectRepositoryById(projectRepository.id);\n const where = { project_repository_id: projectRepository.id, user_id: userId };\n const existing = await db().findOne<SandboxDbRow>(SANDBOXES, where);\n if (existing) return toSandbox(existing);\n try {\n const row = await db().insertOne<SandboxDbRow>(SANDBOXES, {\n ...where,\n sandbox_id: null,\n sandbox_workdir: projectRepository.sandboxWorkdir,\n materialized_at: null,\n created_at: new Date(),\n });\n return toSandbox(row);\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n const row = await db().findOne<SandboxDbRow>(SANDBOXES, where);\n if (!row) throw error;\n return toSandbox(row);\n }\n },\n getById: ({ id }) => getSandbox(id),\n setWorkdir: async ({ id, sandboxWorkdir }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { sandbox_workdir: sandboxWorkdir, materialized_at: null });\n },\n setSandboxId: async ({ id, sandboxId }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { sandbox_id: sandboxId });\n },\n clearBinding: async ({ id }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { sandbox_id: null, materialized_at: null });\n },\n markMaterialized: async ({ id }) => {\n await requireSandbox(id);\n await db().updateMany(SANDBOXES, { id }, { materialized_at: new Date() });\n },\n },\n sandboxPool: {\n release: async input => {\n // Mirror claim(): a concurrently unlinked project repository makes\n // the release a silent no-op (the unlink cascade drops pool rows\n // anyway) — callers treat release as best-effort and must not throw.\n if (!(await getProjectRepositoryById(input.projectRepositoryId))) return;\n try {\n await db().insertOne<SandboxPoolDbRow>(SANDBOX_POOL, {\n org_id: input.orgId,\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n sandbox_id: input.sandboxId,\n sandbox_workdir: input.sandboxWorkdir,\n released_at: new Date(),\n });\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n // The provider sandbox is already pooled — keep the existing row.\n }\n },\n claim: async ({ projectRepositoryId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const rows = await db().findMany<SandboxPoolDbRow>(SANDBOX_POOL, {\n project_repository_id: projectRepositoryId,\n });\n rows.sort((left, right) => right.released_at.getTime() - left.released_at.getTime());\n for (const row of rows) {\n // Delete-by-id succeeds for exactly one concurrent claimer.\n if ((await db().deleteMany(SANDBOX_POOL, { id: row.id })) === 1) return toPooledSandbox(row);\n }\n return null;\n },\n },\n worktrees: {\n upsert: async input => {\n await requireProjectRepositoryById(input.projectRepositoryId);\n await db().upsertOne<WorktreeDbRow>(WORKTREES, ['project_repository_id', 'user_id', 'branch'], {\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n branch: input.branch,\n base_branch: input.baseBranch,\n worktree_path: input.worktreePath,\n created_at: new Date(),\n });\n },\n list: async ({ projectRepositoryId, userId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return [];\n const rows = await db().findMany<WorktreeDbRow>(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n });\n return rows.map(toWorktree);\n },\n get: async ({ projectRepositoryId, userId, branch }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const row = await db().findOne<WorktreeDbRow>(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n branch,\n });\n return row ? toWorktree(row) : null;\n },\n findByPath: async ({ projectRepositoryId, userId, worktreePath }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const row = await db().findOne<WorktreeDbRow>(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n worktree_path: worktreePath,\n });\n return row ? toWorktree(row) : null;\n },\n delete: async ({ projectRepositoryId, userId, branch }) => {\n await requireProjectRepositoryById(projectRepositoryId);\n await db().deleteMany(WORKTREES, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n branch,\n });\n },\n },\n sessions: {\n list: async ({ projectRepositoryId, viewerUserId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return [];\n const rows = await db().findMany<SessionDbRow>(SESSIONS, {\n project_repository_id: projectRepositoryId,\n });\n // Org-visible sessions (NULL counts as org) plus the viewer's own.\n return rows.filter(row => row.visibility !== 'private' || row.user_id === viewerUserId).map(toSession);\n },\n listByProjectRepository: async ({ projectRepositoryId }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return [];\n return (\n await db().findMany<SessionDbRow>(SESSIONS, {\n project_repository_id: projectRepositoryId,\n })\n ).map(toSession);\n },\n getBySessionId: async sessionId => {\n const row = await db().findOne<SessionDbRow>(SESSIONS, { session_id: sessionId });\n return row && (await getProjectRepositoryById(row.project_repository_id)) ? toSession(row) : null;\n },\n getForBranch: async ({ projectRepositoryId, userId, branch }) => {\n if (!(await getProjectRepositoryById(projectRepositoryId))) return null;\n const row = await db().findOne<SessionDbRow>(SESSIONS, {\n project_repository_id: projectRepositoryId,\n user_id: userId,\n branch,\n });\n return row ? toSession(row) : null;\n },\n create: async input => {\n await requireProjectRepositoryById(input.projectRepositoryId);\n const existing = await db().findOne<SessionDbRow>(SESSIONS, {\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n branch: input.branch,\n });\n if (existing) return toSession(existing);\n const now = new Date();\n try {\n const row = await db().insertOne<SessionDbRow>(SESSIONS, {\n session_id: input.sessionId,\n project_repository_id: input.projectRepositoryId,\n org_id: input.orgId,\n user_id: input.userId,\n branch: input.branch,\n title: input.title ?? null,\n visibility: input.visibility ?? 'org',\n base_branch: input.baseBranch,\n sandbox_id: null,\n sandbox_workdir: null,\n materialized_at: null,\n first_message_at: null,\n created_at: now,\n updated_at: now,\n });\n return toSession(row);\n } catch (error) {\n if (!(error instanceof UniqueViolationError)) throw error;\n const row = await db().findOne<SessionDbRow>(SESSIONS, {\n project_repository_id: input.projectRepositoryId,\n user_id: input.userId,\n branch: input.branch,\n });\n if (!row) throw error;\n return toSession(row);\n }\n },\n setSandbox: async ({ id, sandboxId, sandboxWorkdir }) => {\n await db().updateMany(\n SESSIONS,\n { id },\n { sandbox_id: sandboxId, sandbox_workdir: sandboxWorkdir, updated_at: new Date() },\n );\n },\n markMaterialized: async ({ id }) => {\n // `materialized_at: null` in the filter compiles to `IS NULL`, making\n // this a write-once update: session resumes (idle-reap, checkpoint\n // restore, sandbox recreate) match zero rows and cannot overwrite the\n // initial-materialize timestamp that `materialize_s` is derived from.\n await db().updateMany(\n SESSIONS,\n { id, materialized_at: null },\n { materialized_at: new Date(), updated_at: new Date() },\n );\n },\n markFirstMessage: async ({ sessionId }) => {\n // `first_message_at: null` in the filter compiles to `IS NULL`, making\n // this an atomic one-shot: concurrent callers and later messages\n // match zero rows. Sessions without a source-control row (chat-only\n // channels) are a zero-row no-op too.\n await db().updateMany(\n SESSIONS,\n { session_id: sessionId, first_message_at: null },\n { first_message_at: new Date(), updated_at: new Date() },\n );\n },\n markFirstMeaningfulExec: async ({ sessionId }) => {\n // Same atomic one-shot shape as markFirstMessage: the NULL filter\n // makes concurrent callers and later execs zero-row no-ops.\n await db().updateMany(\n SESSIONS,\n { session_id: sessionId, first_meaningful_exec_at: null },\n { first_meaningful_exec_at: new Date(), updated_at: new Date() },\n );\n },\n delete: async id => {\n await db().deleteMany(SESSIONS, { id });\n },\n },\n };\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ConfiguredExternalRepositoryKey, CreateProjectSourceControlConnectionInput, CreateSourceControlSessionInput, ExternalRepositoryProjectTarget, LinkProjectRepositoryInput, PooledSandbox, ProjectRepository, ProjectRepositorySandbox, ProjectSourceControlConnection, ReleasePooledSandboxInput, SourceControlInstallation, SourceControlRepository, SourceControlSession, SourceControlStorageHandle, SourceControlWorktree, UpdateProjectRepositoryInput, UpsertSourceControlInstallationInput, UpsertSourceControlRepositoryInput, UpsertSourceControlWorktreeInput } from './base.js';
1
+ import type { ConfiguredExternalRepositoryKey, CreateProjectSourceControlConnectionInput, CreateSourceControlSessionInput, ExternalRepositoryProjectTarget, LinkProjectRepositoryInput, PooledSandbox, ProjectRepository, ProjectRepositoryBaseCheckpoint, ProjectRepositorySandbox, ProjectSourceControlConnection, ReleasePooledSandboxInput, SourceControlInstallation, SourceControlRepository, SourceControlSession, SourceControlStorageHandle, SourceControlWorktree, UpdateProjectRepositoryInput, UpsertSourceControlInstallationInput, UpsertSourceControlRepositoryInput, UpsertSourceControlWorktreeInput } from './base.js';
2
2
  /** In-memory provider-scoped source-control handle for route tests. */
3
3
  export declare class SourceControlStorageInMemory implements SourceControlStorageHandle {
4
4
  readonly integrationId: string;
@@ -93,6 +93,14 @@ export declare class SourceControlStorageInMemory implements SourceControlStorag
93
93
  id: string;
94
94
  input: UpdateProjectRepositoryInput;
95
95
  }) => Promise<ProjectRepository | null>;
96
+ setBaseCheckpoint: (args: {
97
+ id: string;
98
+ checkpoint: null;
99
+ } | {
100
+ id: string;
101
+ checkpoint: ProjectRepositoryBaseCheckpoint;
102
+ expectedSetupCommand: string | null;
103
+ }) => Promise<void>;
96
104
  unlink: ({ orgId, id }: {
97
105
  orgId: string;
98
106
  id: string;
@@ -150,9 +158,9 @@ export declare class SourceControlStorageInMemory implements SourceControlStorag
150
158
  }) => Promise<void>;
151
159
  };
152
160
  readonly sessions: {
153
- list: ({ projectRepositoryId, userId }: {
161
+ list: ({ projectRepositoryId, viewerUserId }: {
154
162
  projectRepositoryId: string;
155
- userId: string;
163
+ viewerUserId: string;
156
164
  }) => Promise<SourceControlSession[]>;
157
165
  listByProjectRepository: ({ projectRepositoryId }: {
158
166
  projectRepositoryId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"inmemory.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/source-control/inmemory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inmemory.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/source-control/inmemory.ts"],"names":[],"mappings":"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"}
@@ -230,6 +230,7 @@ var SourceControlStorageInMemory = class {
230
230
  sandboxProvider: input.sandboxProvider,
231
231
  sandboxWorkdir: input.sandboxWorkdir,
232
232
  setupCommand: input.setupCommand ?? null,
233
+ baseCheckpoint: null,
233
234
  teardownCommand: input.teardownCommand ?? null,
234
235
  createdAt: now,
235
236
  updatedAt: now
@@ -243,9 +244,16 @@ var SourceControlStorageInMemory = class {
243
244
  id
244
245
  });
245
246
  if (!row) return null;
247
+ if (input.setupCommand !== void 0 && input.setupCommand !== row.setupCommand) row.baseCheckpoint = null;
246
248
  Object.assign(row, input, { updatedAt: /* @__PURE__ */ new Date() });
247
249
  return row;
248
250
  },
251
+ setBaseCheckpoint: async (args) => {
252
+ const row = this.projectRepositoriesRows.find((candidate) => candidate.id === args.id);
253
+ if (!row) throw new Error("Project repository not found");
254
+ if (args.checkpoint && row.setupCommand !== args.expectedSetupCommand) return;
255
+ row.baseCheckpoint = args.checkpoint;
256
+ },
249
257
  unlink: async ({ orgId, id }) => {
250
258
  if (!await this.projectRepositories.get({
251
259
  orgId,
@@ -334,7 +342,7 @@ var SourceControlStorageInMemory = class {
334
342
  }
335
343
  };
336
344
  sessions = {
337
- list: async ({ projectRepositoryId, userId }) => this.sessionsRows.filter((row) => row.projectRepositoryId === projectRepositoryId && row.userId === userId),
345
+ list: async ({ projectRepositoryId, viewerUserId }) => this.sessionsRows.filter((row) => row.projectRepositoryId === projectRepositoryId && (row.visibility !== "private" || row.userId === viewerUserId)),
338
346
  listByProjectRepository: async ({ projectRepositoryId }) => this.sessionsRows.filter((row) => row.projectRepositoryId === projectRepositoryId),
339
347
  getBySessionId: async (sessionId) => this.sessionsRows.find((row) => row.sessionId === sessionId) ?? null,
340
348
  getForBranch: async ({ projectRepositoryId, userId, branch }) => this.sessionsRows.find((row) => row.projectRepositoryId === projectRepositoryId && row.userId === userId && row.branch === branch) ?? null,
@@ -347,6 +355,7 @@ var SourceControlStorageInMemory = class {
347
355
  id: randomUUID(),
348
356
  ...input,
349
357
  title: input.title ?? null,
358
+ visibility: input.visibility ?? "org",
350
359
  sandboxId: null,
351
360
  sandboxWorkdir: null,
352
361
  materializedAt: null,