@cat-factory/worker 0.223.1 → 0.224.1

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 (26) hide show
  1. package/dist/infrastructure/repositories/D1DirectoryChangeRepository.d.ts +12 -0
  2. package/dist/infrastructure/repositories/D1DirectoryChangeRepository.d.ts.map +1 -0
  3. package/dist/infrastructure/repositories/D1DirectoryChangeRepository.js +39 -0
  4. package/dist/infrastructure/repositories/D1DirectoryChangeRepository.js.map +1 -0
  5. package/dist/infrastructure/repositories/D1MembershipRepository.d.ts.map +1 -1
  6. package/dist/infrastructure/repositories/D1MembershipRepository.js +14 -9
  7. package/dist/infrastructure/repositories/D1MembershipRepository.js.map +1 -1
  8. package/dist/infrastructure/repositories/D1RepoProjectionRepository.d.ts +3 -1
  9. package/dist/infrastructure/repositories/D1RepoProjectionRepository.d.ts.map +1 -1
  10. package/dist/infrastructure/repositories/D1RepoProjectionRepository.js +56 -16
  11. package/dist/infrastructure/repositories/D1RepoProjectionRepository.js.map +1 -1
  12. package/dist/infrastructure/repositories/D1UserRepository.d.ts.map +1 -1
  13. package/dist/infrastructure/repositories/D1UserRepository.js +5 -4
  14. package/dist/infrastructure/repositories/D1UserRepository.js.map +1 -1
  15. package/dist/infrastructure/repositories/D1WorkspaceMemberRepository.d.ts.map +1 -1
  16. package/dist/infrastructure/repositories/D1WorkspaceMemberRepository.js +27 -19
  17. package/dist/infrastructure/repositories/D1WorkspaceMemberRepository.js.map +1 -1
  18. package/dist/infrastructure/repositories/D1WorkspaceRepository.d.ts.map +1 -1
  19. package/dist/infrastructure/repositories/D1WorkspaceRepository.js +30 -14
  20. package/dist/infrastructure/repositories/D1WorkspaceRepository.js.map +1 -1
  21. package/dist/infrastructure/repositories/directoryFeed.d.ts +27 -0
  22. package/dist/infrastructure/repositories/directoryFeed.d.ts.map +1 -0
  23. package/dist/infrastructure/repositories/directoryFeed.js +102 -0
  24. package/dist/infrastructure/repositories/directoryFeed.js.map +1 -0
  25. package/migrations/0107_directory_changes.sql +15 -0
  26. package/package.json +19 -19
@@ -0,0 +1,12 @@
1
+ import type { DirectoryChangeRecord, DirectoryChangeRepository } from '@cat-factory/kernel';
2
+ import type { D1Database } from '@cloudflare/workers-types';
3
+ /** D1-backed read side of the directory change feed (migration 0107). */
4
+ export declare class D1DirectoryChangeRepository implements DirectoryChangeRepository {
5
+ private readonly db;
6
+ constructor({ db }: {
7
+ db: D1Database;
8
+ });
9
+ listAfter(accountId: string, afterSeq: number, limit: number): Promise<DirectoryChangeRecord[]>;
10
+ headSeq(accountId: string): Promise<number>;
11
+ }
12
+ //# sourceMappingURL=D1DirectoryChangeRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1DirectoryChangeRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1DirectoryChangeRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAE3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA2B3D,yEAAyE;AACzE,qBAAa,2BAA4B,YAAW,yBAAyB;IAC3E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC,CASlC;IAEK,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhD;CACF"}
@@ -0,0 +1,39 @@
1
+ import { isDirectoryEntityType } from '@cat-factory/contracts';
2
+ function rowToChange(row) {
3
+ // The vocabulary is append-only, so an unknown value is a row this build cannot interpret, not
4
+ // one to skip: a reader that dropped it would advance its cursor past a change it never served.
5
+ if (!isDirectoryEntityType(row.entity_type)) {
6
+ throw new Error(`Unknown directory entity type '${row.entity_type}' at seq ${row.seq}`);
7
+ }
8
+ return {
9
+ accountId: row.account_id,
10
+ seq: row.seq,
11
+ entityType: row.entity_type,
12
+ workspaceId: row.workspace_id,
13
+ entityId: row.entity_id,
14
+ at: row.at,
15
+ };
16
+ }
17
+ /** D1-backed read side of the directory change feed (migration 0107). */
18
+ export class D1DirectoryChangeRepository {
19
+ db;
20
+ constructor({ db }) {
21
+ this.db = db;
22
+ }
23
+ async listAfter(accountId, afterSeq, limit) {
24
+ const { results } = await this.db
25
+ .prepare(`SELECT * FROM directory_changes WHERE account_id = ? AND seq > ?
26
+ ORDER BY seq ASC LIMIT ?`)
27
+ .bind(accountId, afterSeq, limit)
28
+ .all();
29
+ return results.map(rowToChange);
30
+ }
31
+ async headSeq(accountId) {
32
+ const row = await this.db
33
+ .prepare('SELECT MAX(seq) AS head FROM directory_changes WHERE account_id = ?')
34
+ .bind(accountId)
35
+ .first();
36
+ return row?.head ?? 0;
37
+ }
38
+ }
39
+ //# sourceMappingURL=D1DirectoryChangeRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1DirectoryChangeRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1DirectoryChangeRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAY9D,SAAS,WAAW,CAAC,GAAuB;IAC1C,+FAA+F;IAC/F,gGAAgG;IAChG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,WAAW,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;IACzF,CAAC;IACD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,EAAE,EAAE,GAAG,CAAC,EAAE;KACX,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,OAAO,2BAA2B;IACrB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,QAAgB,EAChB,KAAa;QAEb,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;mCAC2B,CAC5B;aACA,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;aAChC,GAAG,EAAsB,CAAA;QAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,qEAAqE,CAAC;aAC9E,IAAI,CAAC,SAAS,CAAC;aACf,KAAK,EAA2B,CAAA;QACnC,OAAO,GAAG,EAAE,IAAI,IAAI,CAAC,CAAA;IACvB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"D1MembershipRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1MembershipRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA2B3D,uFAAuF;AACvF,qBAAa,sBAAuB,YAAW,oBAAoB;IACjE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAMtD;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAM5D;IAEK,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAMvE;IAEK,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAalD;IAEK,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D;CACF"}
1
+ {"version":3,"file":"D1MembershipRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1MembershipRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA4B3D,uFAAuF;AACvF,qBAAa,sBAAuB,YAAW,oBAAoB;IACjE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAMtD;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAM5D;IAEK,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAMvE;IAEK,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBlD;IAEK,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7D;CACF"}
@@ -1,3 +1,4 @@
1
+ import { accountMembershipSource, appendDirectoryChanges } from './directoryFeed';
1
2
  /** Parse the CSV `roles` column into a non-empty role set (defaults to developer). */
2
3
  function parseRoles(csv) {
3
4
  const roles = (csv ?? '')
@@ -42,17 +43,21 @@ export class D1MembershipRepository {
42
43
  return row ? rowToMembership(row) : null;
43
44
  }
44
45
  async upsert(membership) {
45
- await this.db
46
- .prepare(`INSERT INTO memberships (account_id, user_id, roles, created_at) VALUES (?, ?, ?, ?)
47
- ON CONFLICT (account_id, user_id) DO UPDATE SET roles = excluded.roles`)
48
- .bind(membership.accountId, membership.userId, membership.roles.join(','), membership.createdAt)
49
- .run();
46
+ await this.db.batch([
47
+ this.db
48
+ .prepare(`INSERT INTO memberships (account_id, user_id, roles, created_at) VALUES (?, ?, ?, ?)
49
+ ON CONFLICT (account_id, user_id) DO UPDATE SET roles = excluded.roles`)
50
+ .bind(membership.accountId, membership.userId, membership.roles.join(','), membership.createdAt),
51
+ appendDirectoryChanges(this.db, accountMembershipSource(membership.accountId, membership.userId), Date.now()),
52
+ ]);
50
53
  }
51
54
  async remove(accountId, userId) {
52
- await this.db
53
- .prepare('DELETE FROM memberships WHERE account_id = ? AND user_id = ?')
54
- .bind(accountId, userId)
55
- .run();
55
+ await this.db.batch([
56
+ appendDirectoryChanges(this.db, accountMembershipSource(accountId, userId), Date.now()),
57
+ this.db
58
+ .prepare('DELETE FROM memberships WHERE account_id = ? AND user_id = ?')
59
+ .bind(accountId, userId),
60
+ ]);
56
61
  }
57
62
  }
58
63
  //# sourceMappingURL=D1MembershipRepository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1MembershipRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1MembershipRepository.ts"],"names":[],"mappings":"AAUA,sFAAsF;AACtF,SAAS,UAAU,CAAC,GAAkB;IACpC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,SAAS,CAAC,CAAA;IACzF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,GAAkB;IACzC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,uFAAuF;AACvF,MAAM,OAAO,sBAAsB;IAChB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CAAC,qEAAqE,CAAC;aAC9E,IAAI,CAAC,MAAM,CAAC;aACZ,GAAG,EAAiB,CAAA;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CAAC,wEAAwE,CAAC;aACjF,IAAI,CAAC,SAAS,CAAC;aACf,GAAG,EAAiB,CAAA;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,MAAc;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,gEAAgE,CAAC;aACzE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;aACvB,KAAK,EAAiB,CAAA;QACzB,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAsB;QACjC,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;gFACwE,CACzE;aACA,IAAI,CACH,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAC1B,UAAU,CAAC,SAAS,CACrB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,MAAc;QAC5C,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,8DAA8D,CAAC;aACvE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;aACvB,GAAG,EAAE,CAAA;IACV,CAAC;CACF"}
1
+ {"version":3,"file":"D1MembershipRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1MembershipRepository.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { GitHubRepo, RepoProjectionRepository, StaleRepoRef, SyncCursor, SyncCursorKind } from '@cat-factory/kernel';
1
+ import { type GitHubRepo, type RepoProjectionRepository, type StaleRepoRef, type SyncCursor, type SyncCursorKind } from '@cat-factory/kernel';
2
2
  import type { D1Database } from '@cloudflare/workers-types';
3
3
  /** D1-backed projection of repositories (migration 0004) plus per-repo sync cursors. */
4
4
  export declare class D1RepoProjectionRepository implements RepoProjectionRepository {
@@ -7,6 +7,8 @@ export declare class D1RepoProjectionRepository implements RepoProjectionReposit
7
7
  db: D1Database;
8
8
  });
9
9
  upsertMany(workspaceId: string, repos: GitHubRepo[]): Promise<void>;
10
+ /** What the directory last published for these rows, tombstoned or not. */
11
+ private storedDirectoryRepos;
10
12
  list(workspaceId: string): Promise<GitHubRepo[]>;
11
13
  get(workspaceId: string, githubId: number): Promise<GitHubRepo | null>;
12
14
  listByInstallation(installationId: number): Promise<GitHubRepo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"D1RepoProjectionRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1RepoProjectionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,wBAAwB,EACxB,YAAY,EACZ,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAW3D,wFAAwF;AACxF,qBAAa,0BAA2B,YAAW,wBAAwB;IACzE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxE;IAEK,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQrD;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ3E;IAEK,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQtE;IAEK,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgB/F;IAEK,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EAAE,EACvB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAmBf;IAEK,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3F;IAEK,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BjE;IAEK,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ5B;IAEK,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAiBf;CACF"}
1
+ {"version":3,"file":"D1RepoProjectionRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1RepoProjectionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAY3D,wFAAwF;AACxF,qBAAa,0BAA2B,YAAW,wBAAwB;IACzE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BxE;IAED,2EAA2E;YAC7D,oBAAoB;IAkC5B,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQrD;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ3E;IAEK,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQtE;IAEK,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgB/F;IAEK,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EAAE,EACvB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CA6Bf;IAEK,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3F;IAEK,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BjE;IAEK,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ5B;IAEK,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAiBf;CACF"}
@@ -1,4 +1,6 @@
1
+ import { changedDirectoryRepoIds, } from '@cat-factory/kernel';
1
2
  import { chunkForIn } from './chunk';
3
+ import { appendDirectoryChanges, reposSource, reposToTombstoneSource } from './directoryFeed';
2
4
  import { buildUpsert, repoValues, rowToCursor, rowToRepo, } from './github-mappers';
3
5
  /** D1-backed projection of repositories (migration 0004) plus per-repo sync cursors. */
4
6
  export class D1RepoProjectionRepository {
@@ -9,12 +11,42 @@ export class D1RepoProjectionRepository {
9
11
  async upsertMany(workspaceId, repos) {
10
12
  if (repos.length === 0)
11
13
  return;
14
+ const changed = changedDirectoryRepoIds(await this.storedDirectoryRepos(workspaceId, repos.map((r) => r.githubId)), repos);
12
15
  const statements = repos.map((repo) => {
13
- // `is_monorepo` and `linked_via` are link-owned, not sync — never overwrite them.
16
+ // `is_monorepo` and `linked_via` are link-owned, not sync, so never overwrite them.
14
17
  const { sql, binds } = buildUpsert('github_repos', repoValues(workspaceId, repo), ['workspace_id', 'github_id'], ['is_monorepo', 'linked_via']);
15
18
  return this.db.prepare(sql).bind(...binds);
16
19
  });
17
- await this.db.batch(statements);
20
+ const at = Date.now();
21
+ await this.db.batch([
22
+ ...statements,
23
+ ...chunkForIn(changed).map((ids) => appendDirectoryChanges(this.db, reposSource(workspaceId, ids), at)),
24
+ ]);
25
+ }
26
+ /** What the directory last published for these rows, tombstoned or not. */
27
+ async storedDirectoryRepos(workspaceId, githubIds) {
28
+ const stored = [];
29
+ // One batch for every chunk, so a large sync reads its stored rows in a single round trip.
30
+ const reads = await this.db.batch(chunkForIn(githubIds).map((chunk) => this.db
31
+ .prepare(`SELECT * FROM github_repos WHERE workspace_id = ? AND github_id IN (${chunk
32
+ .map(() => '?')
33
+ .join(', ')})`)
34
+ .bind(workspaceId, ...chunk)));
35
+ for (const { results } of reads) {
36
+ for (const row of results) {
37
+ const repo = rowToRepo(row);
38
+ stored.push({
39
+ githubId: repo.githubId,
40
+ owner: repo.owner,
41
+ name: repo.name,
42
+ defaultBranch: repo.defaultBranch,
43
+ private: repo.private,
44
+ provider: repo.provider ?? 'github',
45
+ tombstoned: row.deleted_at !== null,
46
+ });
47
+ }
48
+ }
49
+ return stored;
18
50
  }
19
51
  async list(workspaceId) {
20
52
  const { results } = await this.db
@@ -55,26 +87,34 @@ export class D1RepoProjectionRepository {
55
87
  return found;
56
88
  }
57
89
  async tombstoneMissing(workspaceId, installationId, seenGithubIds, at) {
90
+ // The feed rows go first, selected with the update's own predicate while the rows are live.
91
+ const append = appendDirectoryChanges(this.db, reposToTombstoneSource(workspaceId, installationId, seenGithubIds), at);
58
92
  if (seenGithubIds.length === 0) {
59
- await this.db
60
- .prepare('UPDATE github_repos SET deleted_at = ? WHERE workspace_id = ? AND installation_id = ? AND deleted_at IS NULL')
61
- .bind(at, workspaceId, installationId)
62
- .run();
93
+ await this.db.batch([
94
+ append,
95
+ this.db
96
+ .prepare('UPDATE github_repos SET deleted_at = ? WHERE workspace_id = ? AND installation_id = ? AND deleted_at IS NULL')
97
+ .bind(at, workspaceId, installationId),
98
+ ]);
63
99
  return;
64
100
  }
65
101
  const placeholders = seenGithubIds.map(() => '?').join(', ');
66
- await this.db
67
- .prepare(`UPDATE github_repos SET deleted_at = ?
68
- WHERE workspace_id = ? AND installation_id = ? AND deleted_at IS NULL
69
- AND github_id NOT IN (${placeholders})`)
70
- .bind(at, workspaceId, installationId, ...seenGithubIds)
71
- .run();
102
+ await this.db.batch([
103
+ append,
104
+ this.db
105
+ .prepare(`UPDATE github_repos SET deleted_at = ?
106
+ WHERE workspace_id = ? AND installation_id = ? AND deleted_at IS NULL
107
+ AND github_id NOT IN (${placeholders})`)
108
+ .bind(at, workspaceId, installationId, ...seenGithubIds),
109
+ ]);
72
110
  }
73
111
  async setMonorepo(workspaceId, githubId, isMonorepo) {
74
- await this.db
75
- .prepare('UPDATE github_repos SET is_monorepo = ? WHERE workspace_id = ? AND github_id = ?')
76
- .bind(isMonorepo ? 1 : 0, workspaceId, githubId)
77
- .run();
112
+ await this.db.batch([
113
+ this.db
114
+ .prepare('UPDATE github_repos SET is_monorepo = ? WHERE workspace_id = ? AND github_id = ?')
115
+ .bind(isMonorepo ? 1 : 0, workspaceId, githubId),
116
+ appendDirectoryChanges(this.db, reposSource(workspaceId, [githubId]), Date.now()),
117
+ ]);
78
118
  }
79
119
  async listStale(olderThanEpochMs) {
80
120
  // Join the installation so a tombstoned (uninstalled/suspended) installation's
@@ -1 +1 @@
1
- {"version":3,"file":"D1RepoProjectionRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1RepoProjectionRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"D1RepoProjectionRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1RepoProjectionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAOxB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAC7F,OAAO,EAGL,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,GACV,MAAM,kBAAkB,CAAA;AAEzB,wFAAwF;AACxF,MAAM,OAAO,0BAA0B;IACpB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,KAAmB;QACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC9B,MAAM,OAAO,GAAG,uBAAuB,CACrC,MAAM,IAAI,CAAC,oBAAoB,CAC7B,WAAW,EACX,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC7B,EACD,KAAK,CACN,CAAA;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACpC,oFAAoF;YACpF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAAW,CAChC,cAAc,EACd,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,EAC7B,CAAC,cAAc,EAAE,WAAW,CAAC,EAC7B,CAAC,aAAa,EAAE,YAAY,CAAC,CAC9B,CAAA;YACD,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QACF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACrB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAClB,GAAG,UAAU;YACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CACnE;SACF,CAAC,CAAA;IACJ,CAAC;IAED,2EAA2E;IACnE,KAAK,CAAC,oBAAoB,CAChC,WAAmB,EACnB,SAAmB;QAEnB,MAAM,MAAM,GAA0B,EAAE,CAAA;QACxC,2FAA2F;QAC3F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAC/B,UAAU,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,IAAI,CAAC,EAAE;aACJ,OAAO,CACN,uEAAuE,KAAK;aACzE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;aACd,IAAI,CAAC,IAAI,CAAC,GAAG,CACjB;aACA,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAC/B,CACF,CAAA;QACD,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,EAAE,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;gBAC3B,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ;oBACnC,UAAU,EAAE,GAAG,CAAC,UAAU,KAAK,IAAI;iBACpC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN,+FAA+F,CAChG;aACA,IAAI,CAAC,WAAW,CAAC;aACjB,GAAG,EAAiB,CAAA;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,QAAgB;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN,4FAA4F,CAC7F;aACA,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;aAC3B,KAAK,EAAiB,CAAA;QACzB,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QAC7C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN,kGAAkG,CACnG;aACA,IAAI,CAAC,cAAc,CAAC;aACpB,GAAG,EAAiB,CAAA;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,qBAA+B;QAC1E,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACjD,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,gGAAgG;QAChG,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACtD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;iBAC9B,OAAO,CACN;6EACmE,YAAY,GAAG,CACnF;iBACA,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC;iBAC5B,GAAG,EAA4B,CAAA;YAClC,KAAK,MAAM,GAAG,IAAI,OAAO,IAAI,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAC/D,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,WAAmB,EACnB,cAAsB,EACtB,aAAuB,EACvB,EAAU;QAEV,4FAA4F;QAC5F,MAAM,MAAM,GAAG,sBAAsB,CACnC,IAAI,CAAC,EAAE,EACP,sBAAsB,CAAC,WAAW,EAAE,cAAc,EAAE,aAAa,CAAC,EAClE,EAAE,CACH,CAAA;QACD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBAClB,MAAM;gBACN,IAAI,CAAC,EAAE;qBACJ,OAAO,CACN,8GAA8G,CAC/G;qBACA,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,cAAc,CAAC;aACzC,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QACD,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAClB,MAAM;YACN,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;qCAE2B,YAAY,GAAG,CAC3C;iBACA,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC;SAC3D,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB,EAAE,QAAgB,EAAE,UAAmB;QAC1E,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAClB,IAAI,CAAC,EAAE;iBACJ,OAAO,CAAC,kFAAkF,CAAC;iBAC3F,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC;YAClD,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;SAClF,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,gBAAwB;QACtC,+EAA+E;QAC/E,gFAAgF;QAChF,iFAAiF;QACjF,mFAAmF;QACnF,6EAA6E;QAC7E,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;;iFAGyE,CAC1E;aACA,IAAI,CAAC,gBAAgB,CAAC;aACtB,GAAG,EAMA,CAAA;QACN,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,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,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN,+HAA+H,CAChI;aACA,IAAI,CAAC,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC;aACxC,KAAK,EAAiB,CAAA;QACzB,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CACb,cAAsB,EACtB,YAAoB,EACpB,IAAoB,EACpB,MAAkB;QAElB,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAAW,CAChC,qBAAqB,EACrB;YACE,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,EACD,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAC9C,CAAA;QACD,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,GAAG,CAAC;aACZ,IAAI,CAAC,GAAG,KAAK,CAAC;aACd,GAAG,EAAE,CAAA;IACV,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"D1UserRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAwC3D,0EAA0E;AAC1E,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAGhD;IAEK,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5C;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CAoBf;IAEK,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAU5F;IAEK,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAM3D;IAEK,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQpD;IAEK,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAMpC;IAEK,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9D;IAEK,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAMlE;IAEK,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS9D;IAEK,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3D;CACF"}
1
+ {"version":3,"file":"D1UserRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAyC3D,0EAA0E;AAC1E,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAGhD;IAEK,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5C;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CAoBf;IAEK,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAU5F;IAEK,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAM3D;IAEK,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQpD;IAEK,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAMpC;IAEK,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9D;IAEK,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAMlE;IAEK,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS9D;IAEK,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3D;CACF"}
@@ -1,3 +1,4 @@
1
+ import { appendDirectoryChanges, userSource } from './directoryFeed';
1
2
  function rowToUser(row) {
2
3
  return {
3
4
  id: row.id,
@@ -50,10 +51,10 @@ export class D1UserRepository {
50
51
  }
51
52
  if (sets.length === 0)
52
53
  return;
53
- await this.db
54
- .prepare(`UPDATE users SET ${sets.join(', ')} WHERE id = ?`)
55
- .bind(...binds, id)
56
- .run();
54
+ await this.db.batch([
55
+ this.db.prepare(`UPDATE users SET ${sets.join(', ')} WHERE id = ?`).bind(...binds, id),
56
+ appendDirectoryChanges(this.db, userSource(id), Date.now()),
57
+ ]);
57
58
  }
58
59
  async findByIdentity(provider, subject) {
59
60
  const row = await this.db
@@ -1 +1 @@
1
- {"version":3,"file":"D1UserRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"D1UserRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"D1WorkspaceMemberRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceMemberRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA0B3D,iFAAiF;AACjF,qBAAa,2BAA4B,YAAW,yBAAyB;IAC3E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAMpF;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAM3E;IAEK,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM/D;IAEK,2BAA2B,CAC/B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAkBxC;IAEK,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CASzD;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D;IAEK,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlF;CACF"}
1
+ {"version":3,"file":"D1WorkspaceMemberRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceMemberRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA+B3D,iFAAiF;AACjF,qBAAa,2BAA4B,YAAW,yBAAyB;IAC3E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAMpF;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAM3E;IAEK,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM/D;IAEK,2BAA2B,CAC/B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAkBxC;IAEK,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBzD;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D;IAEK,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlF;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { chunkForIn } from './chunk';
2
+ import { accountWorkspaceMembershipsSource, appendDirectoryChanges, workspaceMembershipSource, } from './directoryFeed';
2
3
  /** Coerce a stored role string to a valid {@link WorkspaceRole}, defaulting to viewer. */
3
4
  function parseRole(role) {
4
5
  return role === 'admin' || role === 'member' || role === 'viewer' ? role : 'viewer';
@@ -59,29 +60,36 @@ export class D1WorkspaceMemberRepository {
59
60
  return out;
60
61
  }
61
62
  async upsert(member) {
62
- await this.db
63
- .prepare(`INSERT INTO workspace_members (workspace_id, user_id, role, created_at, added_by_user_id)
64
- VALUES (?, ?, ?, ?, ?)
65
- ON CONFLICT (workspace_id, user_id) DO UPDATE SET role = excluded.role`)
66
- .bind(member.workspaceId, member.userId, member.role, member.createdAt, member.addedByUserId)
67
- .run();
63
+ await this.db.batch([
64
+ this.db
65
+ .prepare(`INSERT INTO workspace_members (workspace_id, user_id, role, created_at, added_by_user_id)
66
+ VALUES (?, ?, ?, ?, ?)
67
+ ON CONFLICT (workspace_id, user_id) DO UPDATE SET role = excluded.role`)
68
+ .bind(member.workspaceId, member.userId, member.role, member.createdAt, member.addedByUserId),
69
+ appendDirectoryChanges(this.db, workspaceMembershipSource(member.workspaceId, member.userId), Date.now()),
70
+ ]);
68
71
  }
69
72
  async remove(workspaceId, userId) {
70
- await this.db
71
- .prepare('DELETE FROM workspace_members WHERE workspace_id = ? AND user_id = ?')
72
- .bind(workspaceId, userId)
73
- .run();
73
+ await this.db.batch([
74
+ appendDirectoryChanges(this.db, workspaceMembershipSource(workspaceId, userId), Date.now()),
75
+ this.db
76
+ .prepare('DELETE FROM workspace_members WHERE workspace_id = ? AND user_id = ?')
77
+ .bind(workspaceId, userId),
78
+ ]);
74
79
  }
75
80
  async removeByAccountMembership(accountId, userId) {
76
- // One DELETE joined on the owning account — drop every membership this user holds in
77
- // boards of `accountId`. D1 has no `DELETE ... USING`, so scope by subquery.
78
- const result = await this.db
79
- .prepare(`DELETE FROM workspace_members
80
- WHERE user_id = ?
81
- AND workspace_id IN (SELECT id FROM workspaces WHERE account_id = ?)`)
82
- .bind(userId, accountId)
83
- .run();
84
- return result.meta.changes ?? 0;
81
+ // One DELETE joined on the owning account drops every membership this user holds in
82
+ // boards of `accountId`. D1 has no `DELETE ... USING`, so scope by subquery. The feed rows
83
+ // are appended first, while the memberships they name still exist to be selected.
84
+ const [, deleted] = await this.db.batch([
85
+ appendDirectoryChanges(this.db, accountWorkspaceMembershipsSource(accountId, userId), Date.now()),
86
+ this.db
87
+ .prepare(`DELETE FROM workspace_members
88
+ WHERE user_id = ?
89
+ AND workspace_id IN (SELECT id FROM workspaces WHERE account_id = ?)`)
90
+ .bind(userId, accountId),
91
+ ]);
92
+ return deleted?.meta.changes ?? 0;
85
93
  }
86
94
  }
87
95
  //# sourceMappingURL=D1WorkspaceMemberRepository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1WorkspaceMemberRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceMemberRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"D1WorkspaceMemberRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceMemberRepository.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"D1WorkspaceRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAU3D,eAAO,MAAM,+BAA+B,YAAI,iBAAiB,CAAU,CAAA;AAE3E,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,WAAW,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAoClE;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAM3D;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAM/C;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAO5D;IAEK,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAO9D;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAaxE;IAEK,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAerE;IAEK,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAExE;IAEK,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9D;IAEK,MAAM,CACV,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,IAAI,CAAC,CAcf;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpD;IAEK,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1E;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,aAAa,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDpE;CACF"}
1
+ {"version":3,"file":"D1WorkspaceRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAW3D,eAAO,MAAM,+BAA+B,YAAI,iBAAiB,CAAU,CAAA;AAE3E,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,WAAW,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAoClE;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAM3D;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAM/C;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAO5D;IAEK,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAO9D;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAaxE;IAEK,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAerE;IAEK,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxE;IAEK,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9D;IAEK,MAAM,CACV,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpD;IAEK,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1E;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,aAAa,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DpE;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { WORKSPACE_SCOPED_TABLES } from '@cat-factory/kernel';
2
+ import { appendDirectoryChanges, workspaceSource, workspaceTreeSource } from './directoryFeed';
2
3
  import { rowToWorkspace } from './mappers';
3
4
  import { chunkForIn } from './chunk';
4
5
  // Cloudflare-only workspace-scoped tables that have no Node/Drizzle analogue (Durable-Object
@@ -106,28 +107,40 @@ export class D1WorkspaceRepository {
106
107
  };
107
108
  }
108
109
  async setAccessMode(id, mode) {
109
- await this.db.prepare('UPDATE workspaces SET access_mode = ? WHERE id = ?').bind(mode, id).run();
110
+ await this.db.batch([
111
+ this.db.prepare('UPDATE workspaces SET access_mode = ? WHERE id = ?').bind(mode, id),
112
+ appendDirectoryChanges(this.db, workspaceSource(id), Date.now()),
113
+ ]);
110
114
  }
111
115
  async linkAccount(id, accountId) {
112
- await this.db
113
- .prepare('UPDATE workspaces SET account_id = ? WHERE id = ?')
114
- .bind(accountId, id)
115
- .run();
116
+ // The board, its members and its repos leave the old account (if it had one) and appear in
117
+ // the new one, so both feeds record the whole tree: before the move and after it.
118
+ const at = Date.now();
119
+ await this.db.batch([
120
+ appendDirectoryChanges(this.db, workspaceTreeSource(id), at),
121
+ this.db.prepare('UPDATE workspaces SET account_id = ? WHERE id = ?').bind(accountId, id),
122
+ appendDirectoryChanges(this.db, workspaceTreeSource(id), at),
123
+ ]);
116
124
  }
117
125
  async create(workspace, ownerUserId, accountId) {
118
- await this.db
119
- .prepare('INSERT INTO workspaces (id, name, description, created_at, owner_user_id, account_id) VALUES (?, ?, ?, ?, ?, ?)')
120
- .bind(workspace.id, workspace.name, workspace.description ?? null, workspace.createdAt, ownerUserId, accountId)
121
- .run();
126
+ await this.db.batch([
127
+ this.db
128
+ .prepare('INSERT INTO workspaces (id, name, description, created_at, owner_user_id, account_id) VALUES (?, ?, ?, ?, ?, ?)')
129
+ .bind(workspace.id, workspace.name, workspace.description ?? null, workspace.createdAt, ownerUserId, accountId),
130
+ appendDirectoryChanges(this.db, workspaceSource(workspace.id), Date.now()),
131
+ ]);
122
132
  }
123
133
  async rename(id, name) {
124
- await this.db.prepare('UPDATE workspaces SET name = ? WHERE id = ?').bind(name, id).run();
134
+ await this.db.batch([
135
+ this.db.prepare('UPDATE workspaces SET name = ? WHERE id = ?').bind(name, id),
136
+ appendDirectoryChanges(this.db, workspaceSource(id), Date.now()),
137
+ ]);
125
138
  }
126
139
  async setDescription(id, description) {
127
- await this.db
128
- .prepare('UPDATE workspaces SET description = ? WHERE id = ?')
129
- .bind(description, id)
130
- .run();
140
+ await this.db.batch([
141
+ this.db.prepare('UPDATE workspaces SET description = ? WHERE id = ?').bind(description, id),
142
+ appendDirectoryChanges(this.db, workspaceSource(id), Date.now()),
143
+ ]);
131
144
  }
132
145
  async delete(id, rehome = []) {
133
146
  // Cascade explicitly: D1 does not enforce foreign keys by default. The service/mount rows
@@ -159,6 +172,9 @@ export class D1WorkspaceRepository {
159
172
  // reclaim below (which reads `blocks`) and BEFORE the root `workspaces` row is dropped.
160
173
  const bulkDeletes = [...WORKSPACE_SCOPED_TABLES, ...D1_ONLY_WORKSPACE_SCOPED_TABLES].map((table) => this.db.prepare(`DELETE FROM ${table} WHERE workspace_id = ?`).bind(id));
161
174
  await this.db.batch([
175
+ // The directory feed records the board and every member and repo row the cascade below
176
+ // removes, while they still exist to be selected. `directory_changes` itself is kept.
177
+ appendDirectoryChanges(this.db, workspaceTreeSource(id), Date.now()),
162
178
  ...rehomeStatements,
163
179
  // Every board's mount of a service this workspace HOMES (its frame block lives here).
164
180
  this.db
@@ -1 +1 @@
1
- {"version":3,"file":"D1WorkspaceRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"D1WorkspaceRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { D1Database, D1PreparedStatement } from '@cloudflare/workers-types';
2
+ export interface DirectorySource {
3
+ sql: string;
4
+ binds: unknown[];
5
+ }
6
+ /** The statement appending one change per source row. */
7
+ export declare function appendDirectoryChanges(db: D1Database, source: DirectorySource, at: number): D1PreparedStatement;
8
+ /** A user's profile, once per account they belong to. */
9
+ export declare function userSource(userId: string): DirectorySource;
10
+ /** An account membership, plus the member's `user` entity whose visibility it decides. */
11
+ export declare function accountMembershipSource(accountId: string, userId: string): DirectorySource;
12
+ /** One workspace membership, attributed to the account that owns the workspace. */
13
+ export declare function workspaceMembershipSource(workspaceId: string, userId: string): DirectorySource;
14
+ /** Every workspace membership a user holds in one account's boards. */
15
+ export declare function accountWorkspaceMembershipsSource(accountId: string, userId: string): DirectorySource;
16
+ /** The workspace entity alone. */
17
+ export declare function workspaceSource(workspaceId: string): DirectorySource;
18
+ /**
19
+ * The workspace and everything in it that the directory publishes: its members and live repos.
20
+ * Used where the whole board appears in or leaves an account (move, delete).
21
+ */
22
+ export declare function workspaceTreeSource(workspaceId: string): DirectorySource;
23
+ /** Repo projection rows of one workspace, by provider id, tombstoned or not. `githubIds` must fit one D1 statement. */
24
+ export declare function reposSource(workspaceId: string, githubIds: readonly number[]): DirectorySource;
25
+ /** The live repo rows a `tombstoneMissing` call is about to tombstone. Same predicate as the update. */
26
+ export declare function reposToTombstoneSource(workspaceId: string, installationId: number, seenGithubIds: readonly number[]): DirectorySource;
27
+ //# sourceMappingURL=directoryFeed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directoryFeed.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/directoryFeed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAYhF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,eAAe,EACvB,EAAE,EAAE,MAAM,GACT,mBAAmB,CAerB;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAM1D;AAED,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAQ1F;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAO9F;AAED,uEAAuE;AACvE,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,eAAe,CAQjB;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAMpE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAcxE;AAED,uHAAuH;AACvH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAQ9F;AAED,wGAAwG;AACxG,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,eAAe,CAWjB"}
@@ -0,0 +1,102 @@
1
+ /** The statement appending one change per source row. */
2
+ export function appendDirectoryChanges(db, source, at) {
3
+ // SQLite materializes an INSERT ... SELECT that reads its own target before inserting, so every
4
+ // row's MAX(seq) is the pre-statement value and ROW_NUMBER() spaces them apart.
5
+ return db
6
+ .prepare(`INSERT INTO directory_changes (account_id, seq, entity_type, workspace_id, entity_id, at)
7
+ SELECT src.account_id,
8
+ COALESCE((SELECT MAX(d.seq) FROM directory_changes d WHERE d.account_id = src.account_id), 0)
9
+ + ROW_NUMBER() OVER (PARTITION BY src.account_id
10
+ ORDER BY src.entity_type, src.workspace_id, src.entity_id),
11
+ src.entity_type, src.workspace_id, src.entity_id, ?
12
+ FROM (${source.sql}) AS src
13
+ WHERE src.account_id IS NOT NULL`)
14
+ .bind(at, ...source.binds);
15
+ }
16
+ /** A user's profile, once per account they belong to. */
17
+ export function userSource(userId) {
18
+ return {
19
+ sql: `SELECT account_id, 'user' AS entity_type, NULL AS workspace_id, user_id AS entity_id
20
+ FROM memberships WHERE user_id = ?`,
21
+ binds: [userId],
22
+ };
23
+ }
24
+ /** An account membership, plus the member's `user` entity whose visibility it decides. */
25
+ export function accountMembershipSource(accountId, userId) {
26
+ return {
27
+ sql: `SELECT ? AS account_id, 'account_membership' AS entity_type, NULL AS workspace_id,
28
+ ? AS entity_id
29
+ UNION ALL
30
+ SELECT ?, 'user', NULL, ?`,
31
+ binds: [accountId, userId, accountId, userId],
32
+ };
33
+ }
34
+ /** One workspace membership, attributed to the account that owns the workspace. */
35
+ export function workspaceMembershipSource(workspaceId, userId) {
36
+ return {
37
+ sql: `SELECT account_id, 'workspace_membership' AS entity_type, id AS workspace_id,
38
+ ? AS entity_id
39
+ FROM workspaces WHERE id = ?`,
40
+ binds: [userId, workspaceId],
41
+ };
42
+ }
43
+ /** Every workspace membership a user holds in one account's boards. */
44
+ export function accountWorkspaceMembershipsSource(accountId, userId) {
45
+ return {
46
+ sql: `SELECT w.account_id, 'workspace_membership' AS entity_type, m.workspace_id,
47
+ m.user_id AS entity_id
48
+ FROM workspace_members m JOIN workspaces w ON w.id = m.workspace_id
49
+ WHERE m.user_id = ? AND w.account_id = ?`,
50
+ binds: [userId, accountId],
51
+ };
52
+ }
53
+ /** The workspace entity alone. */
54
+ export function workspaceSource(workspaceId) {
55
+ return {
56
+ sql: `SELECT account_id, 'workspace' AS entity_type, id AS workspace_id, id AS entity_id
57
+ FROM workspaces WHERE id = ?`,
58
+ binds: [workspaceId],
59
+ };
60
+ }
61
+ /**
62
+ * The workspace and everything in it that the directory publishes: its members and live repos.
63
+ * Used where the whole board appears in or leaves an account (move, delete).
64
+ */
65
+ export function workspaceTreeSource(workspaceId) {
66
+ const workspace = workspaceSource(workspaceId);
67
+ return {
68
+ sql: `${workspace.sql}
69
+ UNION ALL
70
+ SELECT w.account_id, 'workspace_membership', m.workspace_id, m.user_id
71
+ FROM workspace_members m JOIN workspaces w ON w.id = m.workspace_id
72
+ WHERE m.workspace_id = ?
73
+ UNION ALL
74
+ SELECT w.account_id, 'repo', r.workspace_id, CAST(r.github_id AS TEXT)
75
+ FROM github_repos r JOIN workspaces w ON w.id = r.workspace_id
76
+ WHERE r.workspace_id = ? AND r.deleted_at IS NULL`,
77
+ binds: [...workspace.binds, workspaceId, workspaceId],
78
+ };
79
+ }
80
+ /** Repo projection rows of one workspace, by provider id, tombstoned or not. `githubIds` must fit one D1 statement. */
81
+ export function reposSource(workspaceId, githubIds) {
82
+ const placeholders = githubIds.map(() => '?').join(', ');
83
+ return {
84
+ sql: `SELECT w.account_id, 'repo' AS entity_type, r.workspace_id, CAST(r.github_id AS TEXT) AS entity_id
85
+ FROM github_repos r JOIN workspaces w ON w.id = r.workspace_id
86
+ WHERE r.workspace_id = ? AND r.github_id IN (${placeholders})`,
87
+ binds: [workspaceId, ...githubIds],
88
+ };
89
+ }
90
+ /** The live repo rows a `tombstoneMissing` call is about to tombstone. Same predicate as the update. */
91
+ export function reposToTombstoneSource(workspaceId, installationId, seenGithubIds) {
92
+ const notSeen = seenGithubIds.length === 0
93
+ ? ''
94
+ : ` AND r.github_id NOT IN (${seenGithubIds.map(() => '?').join(', ')})`;
95
+ return {
96
+ sql: `SELECT w.account_id, 'repo' AS entity_type, r.workspace_id, CAST(r.github_id AS TEXT) AS entity_id
97
+ FROM github_repos r JOIN workspaces w ON w.id = r.workspace_id
98
+ WHERE r.workspace_id = ? AND r.installation_id = ? AND r.deleted_at IS NULL${notSeen}`,
99
+ binds: [workspaceId, installationId, ...seenGithubIds],
100
+ };
101
+ }
102
+ //# sourceMappingURL=directoryFeed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directoryFeed.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/directoryFeed.ts"],"names":[],"mappings":"AAiBA,yDAAyD;AACzD,MAAM,UAAU,sBAAsB,CACpC,EAAc,EACd,MAAuB,EACvB,EAAU;IAEV,gGAAgG;IAChG,gFAAgF;IAChF,OAAO,EAAE;SACN,OAAO,CACN;;;;;;iBAMW,MAAM,CAAC,GAAG;yCACc,CACpC;SACA,IAAI,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO;QACL,GAAG,EAAE;+CACsC;QAC3C,KAAK,EAAE,CAAC,MAAM,CAAC;KAChB,CAAA;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,MAAc;IACvE,OAAO;QACL,GAAG,EAAE;;;oCAG2B;QAChC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;KAC9C,CAAA;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,yBAAyB,CAAC,WAAmB,EAAE,MAAc;IAC3E,OAAO;QACL,GAAG,EAAE;;yCAEgC;QACrC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;KAC7B,CAAA;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,iCAAiC,CAC/C,SAAiB,EACjB,MAAc;IAEd,OAAO;QACL,GAAG,EAAE;;;oDAG2C;QAChD,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;KAC3B,CAAA;AACH,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO;QACL,GAAG,EAAE;yCACgC;QACrC,KAAK,EAAE,CAAC,WAAW,CAAC;KACrB,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;IAC9C,OAAO;QACL,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG;;;;;;;;6DAQoC;QACzD,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC;KACtD,CAAA;AACH,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,SAA4B;IAC3E,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxD,OAAO;QACL,GAAG,EAAE;;0DAEiD,YAAY,GAAG;QACrE,KAAK,EAAE,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC;KACnC,CAAA;AACH,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,cAAsB,EACtB,aAAgC;IAEhC,MAAM,OAAO,GACX,aAAa,CAAC,MAAM,KAAK,CAAC;QACxB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,4BAA4B,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;IAC5E,OAAO;QACL,GAAG,EAAE;;wFAE+E,OAAO,EAAE;QAC7F,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC;KACvD,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ -- The directory change feed (docs/initiatives/directory-sync.md): an append-only, per-account
2
+ -- ordered record of which directory entity changed. Rows name an entity and never carry its state.
3
+ -- `seq` is assigned as MAX(seq) + ROW_NUMBER() inside the writer's batch, which SQLite serializes,
4
+ -- so commit order equals seq order. No foreign keys: a row must outlive the entity it names.
5
+ CREATE TABLE directory_changes (
6
+ account_id TEXT NOT NULL,
7
+ seq INTEGER NOT NULL,
8
+ entity_type TEXT NOT NULL,
9
+ workspace_id TEXT,
10
+ entity_id TEXT NOT NULL,
11
+ at INTEGER NOT NULL,
12
+ PRIMARY KEY (account_id, seq)
13
+ );
14
+
15
+ CREATE INDEX idx_directory_changes_at ON directory_changes (at);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/worker",
3
- "version": "0.223.1",
3
+ "version": "0.224.1",
4
4
  "description": "Reusable Cloudflare Worker library (Hono + D1) exposing the Agent Architecture Board core: the `createApp()` Hono factory, the default fetch/scheduled/queue handler, and the Durable Object + Workflow classes. Deployments (see deploy/backend) supply the wrangler.toml + config and re-export these.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,23 +36,23 @@
36
36
  "@ai-sdk/anthropic": "^4.0.75",
37
37
  "@ai-sdk/openai": "^4.0.87",
38
38
  "@ai-sdk/openai-compatible": "^3.0.65",
39
- "@cat-factory/agents": "0.171.3",
40
- "@cat-factory/binary-generators": "0.3.65",
41
- "@cat-factory/caching": "0.20.99",
42
- "@cat-factory/consensus": "0.19.12",
43
- "@cat-factory/contracts": "0.363.0",
44
- "@cat-factory/eks": "0.1.404",
45
- "@cat-factory/gates": "0.12.1",
46
- "@cat-factory/gitlab": "0.24.1",
47
- "@cat-factory/integrations": "0.175.1",
48
- "@cat-factory/kernel": "0.357.1",
49
- "@cat-factory/observability-langfuse": "0.11.65",
50
- "@cat-factory/observability-otel": "0.23.58",
51
- "@cat-factory/orchestration": "0.320.1",
52
- "@cat-factory/prompt-fragments": "1.1.61",
53
- "@cat-factory/provider-cloudflare": "0.7.558",
54
- "@cat-factory/server": "0.332.1",
55
- "@cat-factory/spend": "0.23.10",
39
+ "@cat-factory/agents": "0.171.5",
40
+ "@cat-factory/binary-generators": "0.3.66",
41
+ "@cat-factory/caching": "0.20.100",
42
+ "@cat-factory/consensus": "0.19.14",
43
+ "@cat-factory/contracts": "0.364.0",
44
+ "@cat-factory/eks": "0.1.405",
45
+ "@cat-factory/gates": "0.12.2",
46
+ "@cat-factory/gitlab": "0.24.2",
47
+ "@cat-factory/integrations": "0.175.2",
48
+ "@cat-factory/kernel": "0.358.0",
49
+ "@cat-factory/observability-langfuse": "0.11.66",
50
+ "@cat-factory/observability-otel": "0.23.59",
51
+ "@cat-factory/orchestration": "0.320.3",
52
+ "@cat-factory/prompt-fragments": "1.1.62",
53
+ "@cat-factory/provider-cloudflare": "0.7.560",
54
+ "@cat-factory/server": "0.332.3",
55
+ "@cat-factory/spend": "0.23.11",
56
56
  "@cloudflare/containers": "^0.3.7",
57
57
  "@hono/valibot-validator": "^0.6.1",
58
58
  "ai": "^7.0.131",
@@ -62,7 +62,7 @@
62
62
  "workers-ai-provider": "^4.0.0"
63
63
  },
64
64
  "devDependencies": {
65
- "@cat-factory/conformance": "0.64.1",
65
+ "@cat-factory/conformance": "0.64.3",
66
66
  "@cloudflare/vitest-plugin": "^1.3.7",
67
67
  "@cloudflare/workers-types": "5.20261006.1",
68
68
  "typescript": "7.0.2",