@cat-factory/node-server 0.6.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 (156) hide show
  1. package/LICENSE +21 -0
  2. package/dist/config.d.ts +3 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +297 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/container.d.ts +88 -0
  7. package/dist/container.d.ts.map +1 -0
  8. package/dist/container.js +937 -0
  9. package/dist/container.js.map +1 -0
  10. package/dist/db/client.d.ts +13 -0
  11. package/dist/db/client.d.ts.map +1 -0
  12. package/dist/db/client.js +21 -0
  13. package/dist/db/client.js.map +1 -0
  14. package/dist/db/migrate.d.ts +12 -0
  15. package/dist/db/migrate.d.ts.map +1 -0
  16. package/dist/db/migrate.js +40 -0
  17. package/dist/db/migrate.js.map +1 -0
  18. package/dist/db/schema.d.ts +7858 -0
  19. package/dist/db/schema.d.ts.map +1 -0
  20. package/dist/db/schema.js +928 -0
  21. package/dist/db/schema.js.map +1 -0
  22. package/dist/environments.d.ts +11 -0
  23. package/dist/environments.d.ts.map +1 -0
  24. package/dist/environments.js +31 -0
  25. package/dist/environments.js.map +1 -0
  26. package/dist/execution/bootstrapRunner.d.ts +27 -0
  27. package/dist/execution/bootstrapRunner.d.ts.map +1 -0
  28. package/dist/execution/bootstrapRunner.js +79 -0
  29. package/dist/execution/bootstrapRunner.js.map +1 -0
  30. package/dist/execution/config.d.ts +37 -0
  31. package/dist/execution/config.d.ts.map +1 -0
  32. package/dist/execution/config.js +86 -0
  33. package/dist/execution/config.js.map +1 -0
  34. package/dist/execution/drive.d.ts +6 -0
  35. package/dist/execution/drive.d.ts.map +1 -0
  36. package/dist/execution/drive.js +13 -0
  37. package/dist/execution/drive.js.map +1 -0
  38. package/dist/execution/pgBossRunner.d.ts +82 -0
  39. package/dist/execution/pgBossRunner.d.ts.map +1 -0
  40. package/dist/execution/pgBossRunner.js +163 -0
  41. package/dist/execution/pgBossRunner.js.map +1 -0
  42. package/dist/gateways.d.ts +4 -0
  43. package/dist/gateways.d.ts.map +1 -0
  44. package/dist/gateways.js +91 -0
  45. package/dist/gateways.js.map +1 -0
  46. package/dist/index.d.ts +13 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +22 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/main.d.ts +2 -0
  51. package/dist/main.d.ts.map +1 -0
  52. package/dist/main.js +9 -0
  53. package/dist/main.js.map +1 -0
  54. package/dist/modelProvider.d.ts +6 -0
  55. package/dist/modelProvider.d.ts.map +1 -0
  56. package/dist/modelProvider.js +72 -0
  57. package/dist/modelProvider.js.map +1 -0
  58. package/dist/realtime.d.ts +62 -0
  59. package/dist/realtime.d.ts.map +1 -0
  60. package/dist/realtime.js +171 -0
  61. package/dist/realtime.js.map +1 -0
  62. package/dist/recurring.d.ts +11 -0
  63. package/dist/recurring.d.ts.map +1 -0
  64. package/dist/recurring.js +33 -0
  65. package/dist/recurring.js.map +1 -0
  66. package/dist/repositories/bootstrap.d.ts +25 -0
  67. package/dist/repositories/bootstrap.d.ts.map +1 -0
  68. package/dist/repositories/bootstrap.js +280 -0
  69. package/dist/repositories/bootstrap.js.map +1 -0
  70. package/dist/repositories/containerExecution.d.ts +33 -0
  71. package/dist/repositories/containerExecution.d.ts.map +1 -0
  72. package/dist/repositories/containerExecution.js +199 -0
  73. package/dist/repositories/containerExecution.js.map +1 -0
  74. package/dist/repositories/documents.d.ts +31 -0
  75. package/dist/repositories/documents.d.ts.map +1 -0
  76. package/dist/repositories/documents.js +176 -0
  77. package/dist/repositories/documents.js.map +1 -0
  78. package/dist/repositories/drizzle.d.ts +105 -0
  79. package/dist/repositories/drizzle.d.ts.map +1 -0
  80. package/dist/repositories/drizzle.js +1872 -0
  81. package/dist/repositories/drizzle.js.map +1 -0
  82. package/dist/repositories/environments.d.ts +23 -0
  83. package/dist/repositories/environments.d.ts.map +1 -0
  84. package/dist/repositories/environments.js +162 -0
  85. package/dist/repositories/environments.js.map +1 -0
  86. package/dist/repositories/fragments.d.ts +23 -0
  87. package/dist/repositories/fragments.d.ts.map +1 -0
  88. package/dist/repositories/fragments.js +190 -0
  89. package/dist/repositories/fragments.js.map +1 -0
  90. package/dist/repositories/github.d.ts +53 -0
  91. package/dist/repositories/github.d.ts.map +1 -0
  92. package/dist/repositories/github.js +441 -0
  93. package/dist/repositories/github.js.map +1 -0
  94. package/dist/repositories/localModelEndpoint.d.ts +12 -0
  95. package/dist/repositories/localModelEndpoint.d.ts.map +1 -0
  96. package/dist/repositories/localModelEndpoint.js +75 -0
  97. package/dist/repositories/localModelEndpoint.js.map +1 -0
  98. package/dist/repositories/notifications.d.ts +11 -0
  99. package/dist/repositories/notifications.d.ts.map +1 -0
  100. package/dist/repositories/notifications.js +88 -0
  101. package/dist/repositories/notifications.js.map +1 -0
  102. package/dist/repositories/personalSubscription.d.ts +22 -0
  103. package/dist/repositories/personalSubscription.d.ts.map +1 -0
  104. package/dist/repositories/personalSubscription.js +159 -0
  105. package/dist/repositories/personalSubscription.js.map +1 -0
  106. package/dist/repositories/providerApiKey.d.ts +18 -0
  107. package/dist/repositories/providerApiKey.d.ts.map +1 -0
  108. package/dist/repositories/providerApiKey.js +111 -0
  109. package/dist/repositories/providerApiKey.js.map +1 -0
  110. package/dist/repositories/providerSubscription.d.ts +16 -0
  111. package/dist/repositories/providerSubscription.d.ts.map +1 -0
  112. package/dist/repositories/providerSubscription.js +88 -0
  113. package/dist/repositories/providerSubscription.js.map +1 -0
  114. package/dist/repositories/slack.d.ts +23 -0
  115. package/dist/repositories/slack.d.ts.map +1 -0
  116. package/dist/repositories/slack.js +150 -0
  117. package/dist/repositories/slack.js.map +1 -0
  118. package/dist/repositories/tasks.d.ts +24 -0
  119. package/dist/repositories/tasks.d.ts.map +1 -0
  120. package/dist/repositories/tasks.js +194 -0
  121. package/dist/repositories/tasks.js.map +1 -0
  122. package/dist/retention.d.ts +38 -0
  123. package/dist/retention.d.ts.map +1 -0
  124. package/dist/retention.js +53 -0
  125. package/dist/retention.js.map +1 -0
  126. package/dist/runtime.d.ts +10 -0
  127. package/dist/runtime.d.ts.map +1 -0
  128. package/dist/runtime.js +13 -0
  129. package/dist/runtime.js.map +1 -0
  130. package/dist/server.d.ts +41 -0
  131. package/dist/server.d.ts.map +1 -0
  132. package/dist/server.js +138 -0
  133. package/dist/server.js.map +1 -0
  134. package/dist/tasks/JiraProvider.d.ts +27 -0
  135. package/dist/tasks/JiraProvider.d.ts.map +1 -0
  136. package/dist/tasks/JiraProvider.js +79 -0
  137. package/dist/tasks/JiraProvider.js.map +1 -0
  138. package/drizzle/20260622175812_flashy_maginty/migration.sql +689 -0
  139. package/drizzle/20260622175812_flashy_maginty/snapshot.json +8318 -0
  140. package/drizzle/20260623172634_loud_wallop/migration.sql +11 -0
  141. package/drizzle/20260623172634_loud_wallop/snapshot.json +8439 -0
  142. package/drizzle/20260623174706_acoustic_zemo/migration.sql +16 -0
  143. package/drizzle/20260623174706_acoustic_zemo/snapshot.json +8506 -0
  144. package/drizzle/20260623184400_silent_cardiac/migration.sql +24 -0
  145. package/drizzle/20260623184400_silent_cardiac/snapshot.json +8639 -0
  146. package/drizzle/20260623205323_quick_arclight/migration.sql +1 -0
  147. package/drizzle/20260623205323_quick_arclight/snapshot.json +8963 -0
  148. package/drizzle/20260623221910_black_zombie/migration.sql +22 -0
  149. package/drizzle/20260623221910_black_zombie/snapshot.json +9189 -0
  150. package/drizzle/20260624131343_far_lily_hollister/migration.sql +3 -0
  151. package/drizzle/20260624131343_far_lily_hollister/snapshot.json +9228 -0
  152. package/drizzle/20260624135452_tiny_norman_osborn/migration.sql +11 -0
  153. package/drizzle/20260624135452_tiny_norman_osborn/snapshot.json +9126 -0
  154. package/drizzle/20260624140138_wandering_avengers/migration.sql +1 -0
  155. package/drizzle/20260624140138_wandering_avengers/snapshot.json +9045 -0
  156. package/package.json +62 -0
@@ -0,0 +1,53 @@
1
+ import type { BranchProjectionRepository, CheckRunProjectionRepository, CommitProjectionRepository, GitHubBranch, GitHubCheckRun, GitHubCommit, GitHubIssue, GitHubPullRequest, GitHubRepo, IssueProjectionRepository, PullRequestProjectionRepository, RepoProjectionRepository, StaleRepoRef, SyncCursor, SyncCursorKind } from '@cat-factory/kernel';
2
+ import type { DrizzleDb } from '../db/client.js';
3
+ /** Repositories projection over Postgres plus per-(installation,repo) sync cursors. */
4
+ export declare class DrizzleRepoProjectionRepository implements RepoProjectionRepository {
5
+ private readonly db;
6
+ constructor(db: DrizzleDb);
7
+ upsertMany(workspaceId: string, repos: GitHubRepo[]): Promise<void>;
8
+ list(workspaceId: string): Promise<GitHubRepo[]>;
9
+ get(workspaceId: string, githubId: number): Promise<GitHubRepo | null>;
10
+ linkedWorkspaces(repoGithubId: number, candidateWorkspaceIds: string[]): Promise<string[]>;
11
+ tombstoneMissing(workspaceId: string, installationId: number, seenGithubIds: number[], at: number): Promise<void>;
12
+ linkBlock(workspaceId: string, githubId: number, blockId: string | null): Promise<void>;
13
+ setMonorepo(workspaceId: string, githubId: number, isMonorepo: boolean): Promise<void>;
14
+ listStale(olderThanEpochMs: number): Promise<StaleRepoRef[]>;
15
+ getCursor(installationId: number, repoGithubId: number, kind: SyncCursorKind): Promise<SyncCursor | null>;
16
+ setCursor(installationId: number, repoGithubId: number, kind: SyncCursorKind, cursor: SyncCursor): Promise<void>;
17
+ }
18
+ export declare class DrizzleBranchProjectionRepository implements BranchProjectionRepository {
19
+ private readonly db;
20
+ constructor(db: DrizzleDb);
21
+ upsertMany(workspaceId: string, branches: GitHubBranch[]): Promise<void>;
22
+ listByRepo(workspaceId: string, repoGithubId: number): Promise<GitHubBranch[]>;
23
+ }
24
+ export declare class DrizzlePullRequestProjectionRepository implements PullRequestProjectionRepository {
25
+ private readonly db;
26
+ constructor(db: DrizzleDb);
27
+ upsertMany(workspaceId: string, pulls: GitHubPullRequest[]): Promise<void>;
28
+ private rowToPr;
29
+ listByRepo(workspaceId: string, repoGithubId: number): Promise<GitHubPullRequest[]>;
30
+ listByWorkspace(workspaceId: string): Promise<GitHubPullRequest[]>;
31
+ }
32
+ export declare class DrizzleIssueProjectionRepository implements IssueProjectionRepository {
33
+ private readonly db;
34
+ constructor(db: DrizzleDb);
35
+ upsertMany(workspaceId: string, issues: GitHubIssue[]): Promise<void>;
36
+ private rowToIssue;
37
+ listByRepo(workspaceId: string, repoGithubId: number): Promise<GitHubIssue[]>;
38
+ listByWorkspace(workspaceId: string): Promise<GitHubIssue[]>;
39
+ }
40
+ export declare class DrizzleCommitProjectionRepository implements CommitProjectionRepository {
41
+ private readonly db;
42
+ constructor(db: DrizzleDb);
43
+ upsertMany(workspaceId: string, commits: GitHubCommit[]): Promise<void>;
44
+ deleteOlderThan(epochMs: number): Promise<number>;
45
+ listByRepo(workspaceId: string, repoGithubId: number, limit?: number): Promise<GitHubCommit[]>;
46
+ }
47
+ export declare class DrizzleCheckRunProjectionRepository implements CheckRunProjectionRepository {
48
+ private readonly db;
49
+ constructor(db: DrizzleDb);
50
+ upsertMany(workspaceId: string, checks: GitHubCheckRun[]): Promise<void>;
51
+ listBySha(workspaceId: string, repoGithubId: number, headSha: string): Promise<GitHubCheckRun[]>;
52
+ }
53
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/repositories/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,441 @@
1
+ import { and, eq, inArray, isNull, lt, notInArray } from 'drizzle-orm';
2
+ import { githubBranches, githubCheckRuns, githubCommits, githubInstallations, githubIssues, githubPullRequests, githubRepos, githubSyncCursors, } from '../db/schema.js';
3
+ // Drizzle/Postgres mirrors of the GitHub projection D1 repositories (migration 0004;
4
+ // cursors re-keyed by migration 0032). The inline GitHub sync populates these read
5
+ // models. Behaviourally identical to the D1 repos so the cross-runtime conformance
6
+ // suite asserts the same projections against both stores. 0/1 integer flags map to
7
+ // booleans here exactly as the D1 mappers do.
8
+ const bool = (v) => v === 1;
9
+ const intBool = (v) => (v ? 1 : 0);
10
+ // ---- repositories projection (+ sync cursors) -----------------------------
11
+ function rowToRepo(row) {
12
+ return {
13
+ githubId: row.github_id,
14
+ installationId: row.installation_id,
15
+ owner: row.owner,
16
+ name: row.name,
17
+ defaultBranch: row.default_branch,
18
+ private: bool(row.private),
19
+ blockId: row.block_id,
20
+ isMonorepo: bool(row.is_monorepo),
21
+ syncedAt: row.synced_at,
22
+ };
23
+ }
24
+ /** Repositories projection over Postgres plus per-(installation,repo) sync cursors. */
25
+ export class DrizzleRepoProjectionRepository {
26
+ db;
27
+ constructor(db) {
28
+ this.db = db;
29
+ }
30
+ async upsertMany(workspaceId, repos) {
31
+ if (repos.length === 0)
32
+ return;
33
+ for (const repo of repos) {
34
+ const values = {
35
+ workspace_id: workspaceId,
36
+ github_id: repo.githubId,
37
+ installation_id: repo.installationId,
38
+ owner: repo.owner,
39
+ name: repo.name,
40
+ default_branch: repo.defaultBranch,
41
+ private: intBool(repo.private),
42
+ is_monorepo: intBool(repo.isMonorepo ?? false),
43
+ synced_at: repo.syncedAt,
44
+ deleted_at: null,
45
+ };
46
+ // `block_id` and `is_monorepo` are board-owned (set via linkBlock/setMonorepo),
47
+ // not sync — the update set deliberately omits them so sync never clobbers them.
48
+ await this.db
49
+ .insert(githubRepos)
50
+ .values(values)
51
+ .onConflictDoUpdate({
52
+ target: [githubRepos.workspace_id, githubRepos.github_id],
53
+ set: {
54
+ installation_id: values.installation_id,
55
+ owner: values.owner,
56
+ name: values.name,
57
+ default_branch: values.default_branch,
58
+ private: values.private,
59
+ synced_at: values.synced_at,
60
+ deleted_at: null,
61
+ },
62
+ });
63
+ }
64
+ }
65
+ async list(workspaceId) {
66
+ const rows = await this.db
67
+ .select()
68
+ .from(githubRepos)
69
+ .where(and(eq(githubRepos.workspace_id, workspaceId), isNull(githubRepos.deleted_at)))
70
+ .orderBy(githubRepos.owner, githubRepos.name);
71
+ return rows.map(rowToRepo);
72
+ }
73
+ async get(workspaceId, githubId) {
74
+ const rows = await this.db
75
+ .select()
76
+ .from(githubRepos)
77
+ .where(and(eq(githubRepos.workspace_id, workspaceId), eq(githubRepos.github_id, githubId), isNull(githubRepos.deleted_at)))
78
+ .limit(1);
79
+ return rows[0] ? rowToRepo(rows[0]) : null;
80
+ }
81
+ async linkedWorkspaces(repoGithubId, candidateWorkspaceIds) {
82
+ if (candidateWorkspaceIds.length === 0)
83
+ return [];
84
+ const rows = await this.db
85
+ .selectDistinct({ workspace_id: githubRepos.workspace_id })
86
+ .from(githubRepos)
87
+ .where(and(eq(githubRepos.github_id, repoGithubId), isNull(githubRepos.deleted_at), inArray(githubRepos.workspace_id, candidateWorkspaceIds)));
88
+ return rows.map((r) => r.workspace_id);
89
+ }
90
+ async tombstoneMissing(workspaceId, installationId, seenGithubIds, at) {
91
+ const base = and(eq(githubRepos.workspace_id, workspaceId), eq(githubRepos.installation_id, installationId), isNull(githubRepos.deleted_at));
92
+ await this.db
93
+ .update(githubRepos)
94
+ .set({ deleted_at: at })
95
+ .where(seenGithubIds.length === 0
96
+ ? base
97
+ : and(base, notInArray(githubRepos.github_id, seenGithubIds)));
98
+ }
99
+ async linkBlock(workspaceId, githubId, blockId) {
100
+ await this.db
101
+ .update(githubRepos)
102
+ .set({ block_id: blockId })
103
+ .where(and(eq(githubRepos.workspace_id, workspaceId), eq(githubRepos.github_id, githubId)));
104
+ }
105
+ async setMonorepo(workspaceId, githubId, isMonorepo) {
106
+ await this.db
107
+ .update(githubRepos)
108
+ .set({ is_monorepo: intBool(isMonorepo) })
109
+ .where(and(eq(githubRepos.workspace_id, workspaceId), eq(githubRepos.github_id, githubId)));
110
+ }
111
+ async listStale(olderThanEpochMs) {
112
+ // Inner-join the installation so a tombstoned (uninstalled/suspended) installation's
113
+ // repos are excluded — there's no token to mint, so reconciling would 404 every pass.
114
+ const rows = await this.db
115
+ .select({
116
+ workspace_id: githubRepos.workspace_id,
117
+ github_id: githubRepos.github_id,
118
+ installation_id: githubRepos.installation_id,
119
+ owner: githubRepos.owner,
120
+ name: githubRepos.name,
121
+ })
122
+ .from(githubRepos)
123
+ .innerJoin(githubInstallations, eq(githubInstallations.installation_id, githubRepos.installation_id))
124
+ .where(and(isNull(githubRepos.deleted_at), lt(githubRepos.synced_at, olderThanEpochMs), isNull(githubInstallations.deleted_at)));
125
+ return rows.map((r) => ({
126
+ workspaceId: r.workspace_id,
127
+ githubId: r.github_id,
128
+ installationId: r.installation_id,
129
+ owner: r.owner,
130
+ name: r.name,
131
+ }));
132
+ }
133
+ async getCursor(installationId, repoGithubId, kind) {
134
+ const rows = await this.db
135
+ .select()
136
+ .from(githubSyncCursors)
137
+ .where(and(eq(githubSyncCursors.installation_id, installationId), eq(githubSyncCursors.repo_github_id, repoGithubId), eq(githubSyncCursors.kind, kind)))
138
+ .limit(1);
139
+ const row = rows[0];
140
+ return row
141
+ ? { etag: row.etag, lastSyncedAt: row.last_synced_at, sinceIso: row.since_iso }
142
+ : null;
143
+ }
144
+ async setCursor(installationId, repoGithubId, kind, cursor) {
145
+ await this.db
146
+ .insert(githubSyncCursors)
147
+ .values({
148
+ installation_id: installationId,
149
+ repo_github_id: repoGithubId,
150
+ kind,
151
+ etag: cursor.etag,
152
+ last_synced_at: cursor.lastSyncedAt,
153
+ since_iso: cursor.sinceIso,
154
+ })
155
+ .onConflictDoUpdate({
156
+ target: [
157
+ githubSyncCursors.installation_id,
158
+ githubSyncCursors.repo_github_id,
159
+ githubSyncCursors.kind,
160
+ ],
161
+ set: { etag: cursor.etag, last_synced_at: cursor.lastSyncedAt, since_iso: cursor.sinceIso },
162
+ });
163
+ }
164
+ }
165
+ // ---- branches -------------------------------------------------------------
166
+ export class DrizzleBranchProjectionRepository {
167
+ db;
168
+ constructor(db) {
169
+ this.db = db;
170
+ }
171
+ async upsertMany(workspaceId, branches) {
172
+ for (const b of branches) {
173
+ await this.db
174
+ .insert(githubBranches)
175
+ .values({
176
+ workspace_id: workspaceId,
177
+ repo_github_id: b.repoGithubId,
178
+ name: b.name,
179
+ head_sha: b.headSha,
180
+ protected: intBool(b.protected),
181
+ synced_at: b.syncedAt,
182
+ deleted_at: null,
183
+ })
184
+ .onConflictDoUpdate({
185
+ target: [githubBranches.workspace_id, githubBranches.repo_github_id, githubBranches.name],
186
+ set: {
187
+ head_sha: b.headSha,
188
+ protected: intBool(b.protected),
189
+ synced_at: b.syncedAt,
190
+ deleted_at: null,
191
+ },
192
+ });
193
+ }
194
+ }
195
+ async listByRepo(workspaceId, repoGithubId) {
196
+ const rows = await this.db
197
+ .select()
198
+ .from(githubBranches)
199
+ .where(and(eq(githubBranches.workspace_id, workspaceId), eq(githubBranches.repo_github_id, repoGithubId), isNull(githubBranches.deleted_at)))
200
+ .orderBy(githubBranches.name);
201
+ return rows.map((row) => ({
202
+ repoGithubId: row.repo_github_id,
203
+ name: row.name,
204
+ headSha: row.head_sha,
205
+ protected: bool(row.protected),
206
+ syncedAt: row.synced_at,
207
+ }));
208
+ }
209
+ }
210
+ // ---- pull requests --------------------------------------------------------
211
+ export class DrizzlePullRequestProjectionRepository {
212
+ db;
213
+ constructor(db) {
214
+ this.db = db;
215
+ }
216
+ async upsertMany(workspaceId, pulls) {
217
+ for (const p of pulls) {
218
+ const set = {
219
+ github_id: p.githubId,
220
+ title: p.title,
221
+ state: p.state,
222
+ head_ref: p.headRef,
223
+ base_ref: p.baseRef,
224
+ head_sha: p.headSha,
225
+ merged: intBool(p.merged),
226
+ author: p.author,
227
+ gh_updated_at: p.updatedAt,
228
+ synced_at: p.syncedAt,
229
+ deleted_at: null,
230
+ };
231
+ await this.db
232
+ .insert(githubPullRequests)
233
+ .values({
234
+ workspace_id: workspaceId,
235
+ repo_github_id: p.repoGithubId,
236
+ number: p.number,
237
+ ...set,
238
+ })
239
+ .onConflictDoUpdate({
240
+ target: [
241
+ githubPullRequests.workspace_id,
242
+ githubPullRequests.repo_github_id,
243
+ githubPullRequests.number,
244
+ ],
245
+ set,
246
+ });
247
+ }
248
+ }
249
+ rowToPr(row) {
250
+ return {
251
+ repoGithubId: row.repo_github_id,
252
+ number: row.number,
253
+ githubId: row.github_id,
254
+ title: row.title,
255
+ state: row.state === 'closed' ? 'closed' : 'open',
256
+ headRef: row.head_ref,
257
+ baseRef: row.base_ref,
258
+ headSha: row.head_sha,
259
+ merged: bool(row.merged),
260
+ author: row.author,
261
+ updatedAt: row.gh_updated_at,
262
+ syncedAt: row.synced_at,
263
+ };
264
+ }
265
+ async listByRepo(workspaceId, repoGithubId) {
266
+ const rows = await this.db
267
+ .select()
268
+ .from(githubPullRequests)
269
+ .where(and(eq(githubPullRequests.workspace_id, workspaceId), eq(githubPullRequests.repo_github_id, repoGithubId), isNull(githubPullRequests.deleted_at)));
270
+ return rows.map((r) => this.rowToPr(r)).sort((a, b) => b.number - a.number);
271
+ }
272
+ async listByWorkspace(workspaceId) {
273
+ const rows = await this.db
274
+ .select()
275
+ .from(githubPullRequests)
276
+ .where(and(eq(githubPullRequests.workspace_id, workspaceId), isNull(githubPullRequests.deleted_at)));
277
+ return rows.map((r) => this.rowToPr(r)).sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
278
+ }
279
+ }
280
+ // ---- issues ---------------------------------------------------------------
281
+ export class DrizzleIssueProjectionRepository {
282
+ db;
283
+ constructor(db) {
284
+ this.db = db;
285
+ }
286
+ async upsertMany(workspaceId, issues) {
287
+ for (const i of issues) {
288
+ const set = {
289
+ github_id: i.githubId,
290
+ title: i.title,
291
+ state: i.state,
292
+ author: i.author,
293
+ labels: JSON.stringify(i.labels),
294
+ gh_updated_at: i.updatedAt,
295
+ synced_at: i.syncedAt,
296
+ deleted_at: null,
297
+ };
298
+ await this.db
299
+ .insert(githubIssues)
300
+ .values({
301
+ workspace_id: workspaceId,
302
+ repo_github_id: i.repoGithubId,
303
+ number: i.number,
304
+ ...set,
305
+ })
306
+ .onConflictDoUpdate({
307
+ target: [githubIssues.workspace_id, githubIssues.repo_github_id, githubIssues.number],
308
+ set,
309
+ });
310
+ }
311
+ }
312
+ rowToIssue(row) {
313
+ return {
314
+ repoGithubId: row.repo_github_id,
315
+ number: row.number,
316
+ githubId: row.github_id,
317
+ title: row.title,
318
+ state: row.state === 'closed' ? 'closed' : 'open',
319
+ author: row.author,
320
+ labels: JSON.parse(row.labels),
321
+ updatedAt: row.gh_updated_at,
322
+ syncedAt: row.synced_at,
323
+ };
324
+ }
325
+ async listByRepo(workspaceId, repoGithubId) {
326
+ const rows = await this.db
327
+ .select()
328
+ .from(githubIssues)
329
+ .where(and(eq(githubIssues.workspace_id, workspaceId), eq(githubIssues.repo_github_id, repoGithubId), isNull(githubIssues.deleted_at)));
330
+ return rows.map((r) => this.rowToIssue(r)).sort((a, b) => b.number - a.number);
331
+ }
332
+ async listByWorkspace(workspaceId) {
333
+ const rows = await this.db
334
+ .select()
335
+ .from(githubIssues)
336
+ .where(and(eq(githubIssues.workspace_id, workspaceId), isNull(githubIssues.deleted_at)));
337
+ return rows
338
+ .map((r) => this.rowToIssue(r))
339
+ .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
340
+ }
341
+ }
342
+ // ---- commits --------------------------------------------------------------
343
+ export class DrizzleCommitProjectionRepository {
344
+ db;
345
+ constructor(db) {
346
+ this.db = db;
347
+ }
348
+ async upsertMany(workspaceId, commits) {
349
+ for (const c of commits) {
350
+ const set = {
351
+ message: c.message,
352
+ author: c.author,
353
+ authored_at: c.authoredAt,
354
+ synced_at: c.syncedAt,
355
+ };
356
+ await this.db
357
+ .insert(githubCommits)
358
+ .values({ workspace_id: workspaceId, repo_github_id: c.repoGithubId, sha: c.sha, ...set })
359
+ .onConflictDoUpdate({
360
+ target: [githubCommits.workspace_id, githubCommits.repo_github_id, githubCommits.sha],
361
+ set,
362
+ });
363
+ }
364
+ }
365
+ async deleteOlderThan(epochMs) {
366
+ // NULL authored_at rows are kept (we can't place them in the retention window).
367
+ const deleted = await this.db
368
+ .delete(githubCommits)
369
+ .where(lt(githubCommits.authored_at, epochMs))
370
+ .returning({ sha: githubCommits.sha });
371
+ return deleted.length;
372
+ }
373
+ async listByRepo(workspaceId, repoGithubId, limit = 100) {
374
+ const rows = await this.db
375
+ .select()
376
+ .from(githubCommits)
377
+ .where(and(eq(githubCommits.workspace_id, workspaceId), eq(githubCommits.repo_github_id, repoGithubId)));
378
+ return rows
379
+ .map((row) => ({
380
+ repoGithubId: row.repo_github_id,
381
+ sha: row.sha,
382
+ message: row.message,
383
+ author: row.author,
384
+ authoredAt: row.authored_at,
385
+ syncedAt: row.synced_at,
386
+ }))
387
+ .sort((a, b) => (b.authoredAt ?? 0) - (a.authoredAt ?? 0))
388
+ .slice(0, limit);
389
+ }
390
+ }
391
+ // ---- check runs -----------------------------------------------------------
392
+ export class DrizzleCheckRunProjectionRepository {
393
+ db;
394
+ constructor(db) {
395
+ this.db = db;
396
+ }
397
+ async upsertMany(workspaceId, checks) {
398
+ for (const c of checks) {
399
+ const set = {
400
+ head_sha: c.headSha,
401
+ name: c.name,
402
+ status: c.status,
403
+ conclusion: c.conclusion,
404
+ synced_at: c.syncedAt,
405
+ };
406
+ await this.db
407
+ .insert(githubCheckRuns)
408
+ .values({
409
+ workspace_id: workspaceId,
410
+ repo_github_id: c.repoGithubId,
411
+ github_id: c.githubId,
412
+ ...set,
413
+ })
414
+ .onConflictDoUpdate({
415
+ target: [
416
+ githubCheckRuns.workspace_id,
417
+ githubCheckRuns.repo_github_id,
418
+ githubCheckRuns.github_id,
419
+ ],
420
+ set,
421
+ });
422
+ }
423
+ }
424
+ async listBySha(workspaceId, repoGithubId, headSha) {
425
+ const rows = await this.db
426
+ .select()
427
+ .from(githubCheckRuns)
428
+ .where(and(eq(githubCheckRuns.workspace_id, workspaceId), eq(githubCheckRuns.repo_github_id, repoGithubId), eq(githubCheckRuns.head_sha, headSha)))
429
+ .orderBy(githubCheckRuns.name);
430
+ return rows.map((row) => ({
431
+ repoGithubId: row.repo_github_id,
432
+ githubId: row.github_id,
433
+ headSha: row.head_sha,
434
+ name: row.name,
435
+ status: row.status,
436
+ conclusion: row.conclusion,
437
+ syncedAt: row.synced_at,
438
+ }));
439
+ }
440
+ }
441
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/repositories/github.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEtE,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,iBAAiB,GAClB,MAAM,iBAAiB,CAAA;AAExB,qFAAqF;AACrF,mFAAmF;AACnF,mFAAmF;AACnF,mFAAmF;AACnF,8CAA8C;AAE9C,MAAM,IAAI,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;AAC5C,MAAM,OAAO,GAAG,CAAC,CAAsB,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE/D,8EAA8E;AAE9E,SAAS,SAAS,CAAC,GAAoC;IACrD,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1B,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAS;KACxB,CAAA;AACH,CAAC;AAED,uFAAuF;AACvF,MAAM,OAAO,+BAA+B;IACb,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,KAAmB;QACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG;gBACb,YAAY,EAAE,WAAW;gBACzB,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,eAAe,EAAE,IAAI,CAAC,cAAc;gBACpC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,cAAc,EAAE,IAAI,CAAC,aAAa;gBAClC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC9B,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;gBAC9C,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,UAAU,EAAE,IAAI;aACjB,CAAA;YACD,gFAAgF;YAChF,iFAAiF;YACjF,MAAM,IAAI,CAAC,EAAE;iBACV,MAAM,CAAC,WAAW,CAAC;iBACnB,MAAM,CAAC,MAAM,CAAC;iBACd,kBAAkB,CAAC;gBAClB,MAAM,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC;gBACzD,GAAG,EAAE;oBACH,eAAe,EAAE,MAAM,CAAC,eAAe;oBACvC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,cAAc,EAAE,MAAM,CAAC,cAAc;oBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,UAAU,EAAE,IAAI;iBACjB;aACF,CAAC,CAAA;QACN,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;aACrF,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,QAAgB;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,EACzC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,EACnC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAC/B,CACF;aACA,KAAK,CAAC,CAAC,CAAC,CAAA;QACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,qBAA+B;QAC1E,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,cAAc,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC;aAC1D,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,EACvC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAC9B,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,qBAAqB,CAAC,CACzD,CACF,CAAA;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,WAAmB,EACnB,cAAsB,EACtB,aAAuB,EACvB,EAAU;QAEV,MAAM,IAAI,GAAG,GAAG,CACd,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,EACzC,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,cAAc,CAAC,EAC/C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAC/B,CAAA;QACD,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;aACvB,KAAK,CACJ,aAAa,CAAC,MAAM,KAAK,CAAC;YACxB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAChE,CAAA;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,WAAmB,EAAE,QAAgB,EAAE,OAAsB;QAC3E,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;aAC1B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC/F,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB,EAAE,QAAgB,EAAE,UAAmB;QAC1E,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;aACzC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC/F,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,gBAAwB;QACtC,qFAAqF;QACrF,sFAAsF;QACtF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,CAAC;YACN,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,IAAI,EAAE,WAAW,CAAC,IAAI;SACvB,CAAC;aACD,IAAI,CAAC,WAAW,CAAC;aACjB,SAAS,CACR,mBAAmB,EACnB,EAAE,CAAC,mBAAmB,CAAC,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC,CACrE;aACA,KAAK,CACJ,GAAG,CACD,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAC9B,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAC3C,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CACvC,CACF,CAAA;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,QAAQ,EAAE,CAAC,CAAC,SAAS;YACrB,cAAc,EAAE,CAAC,CAAC,eAAe;YACjC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CACb,cAAsB,EACtB,YAAoB,EACpB,IAAoB;QAEpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,iBAAiB,CAAC;aACvB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,iBAAiB,CAAC,eAAe,EAAE,cAAc,CAAC,EACrD,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE,YAAY,CAAC,EAClD,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CACjC,CACF;aACA,KAAK,CAAC,CAAC,CAAC,CAAA;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,OAAO,GAAG;YACR,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,cAAc,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE;YAC/E,CAAC,CAAC,IAAI,CAAA;IACV,CAAC;IAED,KAAK,CAAC,SAAS,CACb,cAAsB,EACtB,YAAoB,EACpB,IAAoB,EACpB,MAAkB;QAElB,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,iBAAiB,CAAC;aACzB,MAAM,CAAC;YACN,eAAe,EAAE,cAAc;YAC/B,cAAc,EAAE,YAAY;YAC5B,IAAI;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,cAAc,EAAE,MAAM,CAAC,YAAY;YACnC,SAAS,EAAE,MAAM,CAAC,QAAQ;SAC3B,CAAC;aACD,kBAAkB,CAAC;YAClB,MAAM,EAAE;gBACN,iBAAiB,CAAC,eAAe;gBACjC,iBAAiB,CAAC,cAAc;gBAChC,iBAAiB,CAAC,IAAI;aACvB;YACD,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC5F,CAAC,CAAA;IACN,CAAC;CACF;AAED,8EAA8E;AAE9E,MAAM,OAAO,iCAAiC;IACf,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,QAAwB;QAC5D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,EAAE;iBACV,MAAM,CAAC,cAAc,CAAC;iBACtB,MAAM,CAAC;gBACN,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,CAAC,CAAC,YAAY;gBAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,OAAO;gBACnB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/B,SAAS,EAAE,CAAC,CAAC,QAAQ;gBACrB,UAAU,EAAE,IAAI;aACjB,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC;gBACzF,GAAG,EAAE;oBACH,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC/B,SAAS,EAAE,CAAC,CAAC,QAAQ;oBACrB,UAAU,EAAE,IAAI;iBACjB;aACF,CAAC,CAAA;QACN,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,YAAoB;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,cAAc,CAAC;aACpB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,EAC5C,EAAE,CAAC,cAAc,CAAC,cAAc,EAAE,YAAY,CAAC,EAC/C,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAClC,CACF;aACA,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,YAAY,EAAE,GAAG,CAAC,cAAc;YAChC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAC9B,QAAQ,EAAE,GAAG,CAAC,SAAS;SACxB,CAAC,CAAC,CAAA;IACL,CAAC;CACF;AAED,8EAA8E;AAE9E,MAAM,OAAO,sCAAsC;IACpB,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,KAA0B;QAC9D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG;gBACV,SAAS,EAAE,CAAC,CAAC,QAAQ;gBACrB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,OAAO;gBACnB,QAAQ,EAAE,CAAC,CAAC,OAAO;gBACnB,QAAQ,EAAE,CAAC,CAAC,OAAO;gBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,aAAa,EAAE,CAAC,CAAC,SAAS;gBAC1B,SAAS,EAAE,CAAC,CAAC,QAAQ;gBACrB,UAAU,EAAE,IAAI;aACjB,CAAA;YACD,MAAM,IAAI,CAAC,EAAE;iBACV,MAAM,CAAC,kBAAkB,CAAC;iBAC1B,MAAM,CAAC;gBACN,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,CAAC,CAAC,YAAY;gBAC9B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,GAAG,GAAG;aACP,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE;oBACN,kBAAkB,CAAC,YAAY;oBAC/B,kBAAkB,CAAC,cAAc;oBACjC,kBAAkB,CAAC,MAAM;iBAC1B;gBACD,GAAG;aACJ,CAAC,CAAA;QACN,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,GAA2C;QACzD,OAAO;YACL,YAAY,EAAE,GAAG,CAAC,cAAc;YAChC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;YACjD,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,aAAa;YAC5B,QAAQ,EAAE,GAAG,CAAC,SAAS;SACxB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,YAAoB;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,kBAAkB,CAAC;aACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,EAChD,EAAE,CAAC,kBAAkB,CAAC,cAAc,EAAE,YAAY,CAAC,EACnD,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CACtC,CACF,CAAA;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,kBAAkB,CAAC;aACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,EAChD,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CACtC,CACF,CAAA;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAA;IACjG,CAAC;CACF;AAED,8EAA8E;AAE9E,MAAM,OAAO,gCAAgC;IACd,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,MAAqB;QACzD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG;gBACV,SAAS,EAAE,CAAC,CAAC,QAAQ;gBACrB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAChC,aAAa,EAAE,CAAC,CAAC,SAAS;gBAC1B,SAAS,EAAE,CAAC,CAAC,QAAQ;gBACrB,UAAU,EAAE,IAAI;aACjB,CAAA;YACD,MAAM,IAAI,CAAC,EAAE;iBACV,MAAM,CAAC,YAAY,CAAC;iBACpB,MAAM,CAAC;gBACN,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,CAAC,CAAC,YAAY;gBAC9B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,GAAG,GAAG;aACP,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAC;gBACrF,GAAG;aACJ,CAAC,CAAA;QACN,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,GAAqC;QACtD,OAAO;YACL,YAAY,EAAE,GAAG,CAAC,cAAc;YAChC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;YACjD,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAa;YAC1C,SAAS,EAAE,GAAG,CAAC,aAAa;YAC5B,QAAQ,EAAE,GAAG,CAAC,SAAS;SACxB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,YAAoB;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,YAAY,CAAC;aAClB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,EAC1C,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,EAC7C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAChC,CACF,CAAA;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;IAChF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,YAAY,CAAC;aAClB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1F,OAAO,IAAI;aACR,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;CACF;AAED,8EAA8E;AAE9E,MAAM,OAAO,iCAAiC;IACf,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,OAAuB;QAC3D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,CAAC,CAAC,UAAU;gBACzB,SAAS,EAAE,CAAC,CAAC,QAAQ;aACtB,CAAA;YACD,MAAM,IAAI,CAAC,EAAE;iBACV,MAAM,CAAC,aAAa,CAAC;iBACrB,MAAM,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;iBACzF,kBAAkB,CAAC;gBAClB,MAAM,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC;gBACrF,GAAG;aACJ,CAAC,CAAA;QACN,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,gFAAgF;QAChF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,aAAa,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;aAC7C,SAAS,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,CAAA;QACxC,OAAO,OAAO,CAAC,MAAM,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,YAAoB,EACpB,KAAK,GAAG,GAAG;QAEX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,EAC3C,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,YAAY,CAAC,CAC/C,CACF,CAAA;QACH,OAAO,IAAI;aACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,YAAY,EAAE,GAAG,CAAC,cAAc;YAChC,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;SACxB,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;aACzD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACpB,CAAC;CACF;AAED,8EAA8E;AAE9E,MAAM,OAAO,mCAAmC;IACjB,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,MAAwB;QAC5D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG;gBACV,QAAQ,EAAE,CAAC,CAAC,OAAO;gBACnB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,SAAS,EAAE,CAAC,CAAC,QAAQ;aACtB,CAAA;YACD,MAAM,IAAI,CAAC,EAAE;iBACV,MAAM,CAAC,eAAe,CAAC;iBACvB,MAAM,CAAC;gBACN,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,CAAC,CAAC,YAAY;gBAC9B,SAAS,EAAE,CAAC,CAAC,QAAQ;gBACrB,GAAG,GAAG;aACP,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE;oBACN,eAAe,CAAC,YAAY;oBAC5B,eAAe,CAAC,cAAc;oBAC9B,eAAe,CAAC,SAAS;iBAC1B;gBACD,GAAG;aACJ,CAAC,CAAA;QACN,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CACb,WAAmB,EACnB,YAAoB,EACpB,OAAe;QAEf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,eAAe,CAAC;aACrB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,EAC7C,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE,YAAY,CAAC,EAChD,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CACtC,CACF;aACA,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,YAAY,EAAE,GAAG,CAAC,cAAc;YAChC,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,SAAS;SACxB,CAAC,CAAC,CAAA;IACL,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { LocalModelEndpointRecord, LocalModelEndpointRepository } from '@cat-factory/kernel';
2
+ import type { LocalRunner } from '@cat-factory/contracts';
3
+ import type { DrizzleDb } from '../db/client.js';
4
+ export declare class DrizzleLocalModelEndpointRepository implements LocalModelEndpointRepository {
5
+ private readonly db;
6
+ constructor(db: DrizzleDb);
7
+ listByUser(userId: string): Promise<LocalModelEndpointRecord[]>;
8
+ getByUserProvider(userId: string, provider: LocalRunner): Promise<LocalModelEndpointRecord | null>;
9
+ upsert(record: LocalModelEndpointRecord): Promise<void>;
10
+ remove(userId: string, provider: LocalRunner): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=localModelEndpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localModelEndpoint.d.ts","sourceRoot":"","sources":["../../src/repositories/localModelEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AA8BhD,qBAAa,mCAAoC,YAAW,4BAA4B;IAC1E,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAOpE;IAEK,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAS1C;IAEK,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5D;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjE;CACF"}
@@ -0,0 +1,75 @@
1
+ import { and, asc, eq } from 'drizzle-orm';
2
+ import { localModelEndpoints } from '../db/schema.js';
3
+ function toRecord(row) {
4
+ return {
5
+ userId: row.user_id,
6
+ provider: row.provider,
7
+ label: row.label,
8
+ baseUrl: row.base_url,
9
+ apiKeyCipher: row.api_key_cipher,
10
+ models: parseModels(row.models),
11
+ createdAt: row.created_at,
12
+ updatedAt: row.updated_at,
13
+ };
14
+ }
15
+ function parseModels(json) {
16
+ try {
17
+ const parsed = JSON.parse(json);
18
+ return Array.isArray(parsed) ? parsed.map(String) : [];
19
+ }
20
+ catch {
21
+ return [];
22
+ }
23
+ }
24
+ export class DrizzleLocalModelEndpointRepository {
25
+ db;
26
+ constructor(db) {
27
+ this.db = db;
28
+ }
29
+ async listByUser(userId) {
30
+ const rows = await this.db
31
+ .select()
32
+ .from(localModelEndpoints)
33
+ .where(eq(localModelEndpoints.user_id, userId))
34
+ .orderBy(asc(localModelEndpoints.created_at));
35
+ return rows.map(toRecord);
36
+ }
37
+ async getByUserProvider(userId, provider) {
38
+ const rows = await this.db
39
+ .select()
40
+ .from(localModelEndpoints)
41
+ .where(and(eq(localModelEndpoints.user_id, userId), eq(localModelEndpoints.provider, provider)))
42
+ .limit(1);
43
+ return rows[0] ? toRecord(rows[0]) : null;
44
+ }
45
+ async upsert(record) {
46
+ await this.db
47
+ .insert(localModelEndpoints)
48
+ .values({
49
+ user_id: record.userId,
50
+ provider: record.provider,
51
+ label: record.label,
52
+ base_url: record.baseUrl,
53
+ api_key_cipher: record.apiKeyCipher,
54
+ models: JSON.stringify(record.models),
55
+ created_at: record.createdAt,
56
+ updated_at: record.updatedAt,
57
+ })
58
+ .onConflictDoUpdate({
59
+ target: [localModelEndpoints.user_id, localModelEndpoints.provider],
60
+ set: {
61
+ label: record.label,
62
+ base_url: record.baseUrl,
63
+ api_key_cipher: record.apiKeyCipher,
64
+ models: JSON.stringify(record.models),
65
+ updated_at: record.updatedAt,
66
+ },
67
+ });
68
+ }
69
+ async remove(userId, provider) {
70
+ await this.db
71
+ .delete(localModelEndpoints)
72
+ .where(and(eq(localModelEndpoints.user_id, userId), eq(localModelEndpoints.provider, provider)));
73
+ }
74
+ }
75
+ //# sourceMappingURL=localModelEndpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localModelEndpoint.js","sourceRoot":"","sources":["../../src/repositories/localModelEndpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Notification, NotificationRepository, NotificationType } from '@cat-factory/kernel';
2
+ import type { DrizzleDb } from '../db/client.js';
3
+ export declare class DrizzleNotificationRepository implements NotificationRepository {
4
+ private readonly db;
5
+ constructor(db: DrizzleDb);
6
+ get(workspaceId: string, id: string): Promise<Notification | null>;
7
+ listOpen(workspaceId: string): Promise<Notification[]>;
8
+ findOpenByBlock(workspaceId: string, blockId: string, type: NotificationType): Promise<Notification | null>;
9
+ upsert(workspaceId: string, notification: Notification): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/repositories/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEZ,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAkChD,qBAAa,6BAA8B,YAAW,sBAAsB;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAOvE;IAEK,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAO3D;IAEK,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAe9B;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B3E;CACF"}