@cat-factory/server 0.295.0 → 0.296.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 (53) hide show
  1. package/dist/agents/repoFiles.d.ts +30 -8
  2. package/dist/agents/repoFiles.d.ts.map +1 -1
  3. package/dist/agents/repoFiles.js +43 -14
  4. package/dist/agents/repoFiles.js.map +1 -1
  5. package/dist/agents/repoOrigin.d.ts +73 -0
  6. package/dist/agents/repoOrigin.d.ts.map +1 -0
  7. package/dist/agents/repoOrigin.js +91 -0
  8. package/dist/agents/repoOrigin.js.map +1 -0
  9. package/dist/agents/toolServers.d.ts.map +1 -1
  10. package/dist/agents/toolServers.js +15 -1
  11. package/dist/agents/toolServers.js.map +1 -1
  12. package/dist/app.d.ts.map +1 -1
  13. package/dist/app.js +10 -0
  14. package/dist/app.js.map +1 -1
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/modules/agentKinds/AgentKindsController.d.ts +46 -0
  20. package/dist/modules/agentKinds/AgentKindsController.d.ts.map +1 -0
  21. package/dist/modules/agentKinds/AgentKindsController.js +56 -0
  22. package/dist/modules/agentKinds/AgentKindsController.js.map +1 -0
  23. package/dist/modules/persistence/PersistenceController.d.ts.map +1 -1
  24. package/dist/modules/persistence/PersistenceController.js +6 -161
  25. package/dist/modules/persistence/PersistenceController.js.map +1 -1
  26. package/dist/modules/persistence/dispatchScope.d.ts +16 -0
  27. package/dist/modules/persistence/dispatchScope.d.ts.map +1 -0
  28. package/dist/modules/persistence/dispatchScope.js +307 -0
  29. package/dist/modules/persistence/dispatchScope.js.map +1 -0
  30. package/dist/persistence/agentKinds.d.ts +43 -0
  31. package/dist/persistence/agentKinds.d.ts.map +1 -0
  32. package/dist/persistence/agentKinds.js +99 -0
  33. package/dist/persistence/agentKinds.js.map +1 -0
  34. package/dist/persistence/rpc-allowlist-libraries.d.ts +4 -0
  35. package/dist/persistence/rpc-allowlist-libraries.d.ts.map +1 -0
  36. package/dist/persistence/rpc-allowlist-libraries.js +209 -0
  37. package/dist/persistence/rpc-allowlist-libraries.js.map +1 -0
  38. package/dist/persistence/rpc-allowlist-vcs.d.ts +24 -0
  39. package/dist/persistence/rpc-allowlist-vcs.d.ts.map +1 -0
  40. package/dist/persistence/rpc-allowlist-vcs.js +119 -0
  41. package/dist/persistence/rpc-allowlist-vcs.js.map +1 -0
  42. package/dist/persistence/rpc-allowlist.d.ts.map +1 -1
  43. package/dist/persistence/rpc-allowlist.js +66 -249
  44. package/dist/persistence/rpc-allowlist.js.map +1 -1
  45. package/dist/persistence/rpc-scope.logic.d.ts +46 -0
  46. package/dist/persistence/rpc-scope.logic.d.ts.map +1 -1
  47. package/dist/persistence/rpc-scope.logic.js +109 -0
  48. package/dist/persistence/rpc-scope.logic.js.map +1 -1
  49. package/dist/persistence/rpc.d.ts +111 -0
  50. package/dist/persistence/rpc.d.ts.map +1 -1
  51. package/dist/persistence/rpc.js +42 -44
  52. package/dist/persistence/rpc.js.map +1 -1
  53. package/package.json +6 -6
@@ -0,0 +1,209 @@
1
+ // The repo-sourced CONTENT LIBRARY half of the mothership-mode persistence allow-list: prompt
2
+ // fragments, Claude Skills and foundational services, with their generated briefs, contract
3
+ // manifests and the three source tables their repo sync writes.
4
+ //
5
+ // Split out of `rpc-allowlist.ts` when that file reached its size budget. These belong together for
6
+ // a reason beyond size: all three are tenant-owned catalogs a RUN resolves, all three sync from a
7
+ // git repo through a source row, and all three bind through the owner-pair rules (`owner` /
8
+ // `ownerField` / `ownerFieldUpsert` / `librarySource`, and the account-keyed `skillSource` twin)
9
+ // rather than through a workspace argument. Spread into `REMOTE_PERSISTENCE_METHODS`; the merged
10
+ // table is what the dispatcher and the drift guard read.
11
+ /** The content libraries' remote surface. See `rpc-allowlist.ts` for the table's contract. */
12
+ export const LIBRARY_PERSISTENCE_METHODS = {
13
+ // --- Prompt-fragment library management surface ---------------------------------
14
+ // The tenant-scoped prompt-fragment library (ADR 0006) a mothership-mode SPA curates
15
+ // (`FragmentLibraryController` → `FragmentLibraryService`): list / create / update / delete
16
+ // hand-authored fragments at either tier. The library module assembles from
17
+ // `promptFragmentRepository` ALONE (no connection/secret repo — unlike the document/task
18
+ // integrations, whose modules require a decrypt-inside connection repo and so stay off), and its
19
+ // rows carry NO secrets, so the whole management surface is remote. Every method is keyed by an
20
+ // `(ownerKind, ownerId)` PAIR (`ownerKind` ∈ `workspace` | `account`), bound by the `owner` scope
21
+ // rule (positional pair) / `ownerField` rule (the record's fields on `upsert`): a `workspace`
22
+ // owner resolves its account like the `workspace` rule, an `account` owner IS the accountId — so a
23
+ // machine token scoped to one account can never read/write another tenant's fragments. Both tiers'
24
+ // endpoints are member-level (account-tier routes guard on `requireMember`, NOT `requireAdmin`), so
25
+ // this follows the same member-level policy as the other settings/library panels above.
26
+ //
27
+ // `listBySource` (the repo-sync reconcile read) joins them: see the `librarySource` note on
28
+ // `fragmentSourceRepository` below for why the sync surface is no longer deferred.
29
+ promptFragmentRepository: {
30
+ listByOwner: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
31
+ get: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
32
+ upsert: { scope: { kind: 'ownerField', arg: 0 } },
33
+ softDelete: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
34
+ // The source-keyed reconcile pair, mirroring the skill and foundational-service libraries':
35
+ // list a source's live fragments to diff against the repo listing, and tombstone all of them
36
+ // in one write on unlink. Each method carries a source id and nothing else, so the
37
+ // `librarySource` rule resolves that source's owning tier pair server-side (`fragmentSource`
38
+ // names the table it lives in).
39
+ listBySource: { scope: { kind: 'librarySource', arg: 0, entity: 'fragmentSource' } },
40
+ softDeleteBySource: { scope: { kind: 'librarySource', arg: 0, entity: 'fragmentSource' } },
41
+ },
42
+ // Model-GENERATED condensed briefs for long standards (`FragmentBriefService`), read and
43
+ // written on the RUN path: a mothership-mode implementer dispatch resolves them alongside the
44
+ // fragment bodies above, so leaving them off would silently fold full standards on every turn
45
+ // of every local loop — the exact cost this feature exists to remove. `remote`, not
46
+ // `local-first`: they are org-durable derived state (a condensation an account paid a model
47
+ // for, reused by every board in it), not per-user runner telemetry. The rows hold model output
48
+ // condensing a standard the same token already reads in full through `promptFragmentRepository`,
49
+ // so they widen no exposure, and every method is keyed by the same `(ownerKind, ownerId)` pair —
50
+ // bound by the `owner` rule (positional) / `ownerField` rule (the record's fields on `upsert`),
51
+ // so a token scoped to one account can neither read nor overwrite another tenant's briefs.
52
+ fragmentBriefRepository: {
53
+ listByOwner: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
54
+ upsert: { scope: { kind: 'ownerField', arg: 0 } },
55
+ delete: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
56
+ },
57
+ // The fragment-source (repo-linkage) library the SPA lists, links and SYNCS
58
+ // (`FragmentSourceService`), owner scoped exactly like the fragments above. `listByOwner` is bound
59
+ // by the `owner` rule; the sourceId-keyed sync methods by `librarySource`, which resolves a
60
+ // source's owning `(ownerKind, ownerId)` pair server-side.
61
+ //
62
+ // The sync half was deferred on a premise that is no longer true: that a mothership-mode node has
63
+ // no GitHub client. Token delegation gave it one (`DelegatedAppTokenSource` mints the tier's App
64
+ // token over the same machine API), which is what already made the SKILLS library's sync surface
65
+ // remote — so these routes were reachable and broken, the state that is worse than either serving
66
+ // them or hiding them. `librarySource` is `skillSource` generalised to a tier PAIR, because a
67
+ // fragment source can be owned by a workspace as well as an account.
68
+ //
69
+ // `upsert(record)` takes `ownerFieldUpsert`, NOT the plain `ownerField` the fragments above use.
70
+ // This is the gap the skills slice named and could not close: the write conflicts on the `id`
71
+ // ALONE and never re-`SET`s the owner columns, so binding only the DECLARED owner would let an
72
+ // in-scope caller name a foreign source id and repoint another tenant's link at a repo it
73
+ // controls, whose Markdown bodies the victim's next sync folds into their prompts as standards.
74
+ // The rule binds the STORED row's owner too; a create (no such row) still passes on the declared
75
+ // half. `ownerFieldUpsert` is the owner-pair analogue of `accountFieldUpsert` above, and is what
76
+ // any new id-keyed library upsert must use.
77
+ fragmentSourceRepository: {
78
+ listByOwner: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
79
+ upsert: { scope: { kind: 'ownerFieldUpsert', arg: 0, entity: 'fragmentSource' } },
80
+ get: { scope: { kind: 'librarySource', arg: 0, entity: 'fragmentSource' } },
81
+ updateSyncState: { scope: { kind: 'librarySource', arg: 0, entity: 'fragmentSource' } },
82
+ softDelete: { scope: { kind: 'librarySource', arg: 0, entity: 'fragmentSource' } },
83
+ },
84
+ // --- Repo-sourced Claude Skills library (ADR 0024) ------------------------------
85
+ // Skills live in ONE tier — the ACCOUNT — so every method here binds on an accountId rather
86
+ // than the `(ownerKind, ownerId)` pair the fragment library uses: positionally via the `account`
87
+ // rule, on a record's `accountId` FIELD via `accountField` / `accountFieldUpsert`, or (the sync
88
+ // surface) via the `skillSource` rule, which resolves a source id to its owning account
89
+ // server-side. A machine token scoped to one account can therefore neither read nor write another
90
+ // tenant's skills.
91
+ //
92
+ // Remote rather than `telemetry` or `local-sqlite` for the reason the bucket test names: what
93
+ // READS this is a RUN. `SkillRunResolver` resolves the picked skill (and ADR 0029's declared
94
+ // `{ catalogSkillId }` capabilities) out of `accountSkillRepository` at every dispatch, and
95
+ // `skillResolver` is a HARD dependency for a `skill` step — so leaving the catalog off would
96
+ // not merely blank a panel, it would fail every skill-running dispatch on a mothership-mode
97
+ // node with `unknown_method`. The rows carry no secrets (a `SKILL.md` body plus a resource
98
+ // manifest of `{ path, sha, size }`); the resource BODIES are fetched from the repo at
99
+ // dispatch and never stored, so nothing credential-bearing crosses the machine API.
100
+ //
101
+ // This was the FIRST library whose repo-SYNC surface went remote. A sync needs a GitHub client,
102
+ // and a mothership-mode node HAS one (`DelegatedAppTokenSource` mints the account's App token
103
+ // over the same machine API), so its `SkillSourceService` assembles and its link/sync/unlink
104
+ // routes are live. Leaving the sourceId-keyed methods off would leave those routes reachable and
105
+ // broken, which is worse than either serving them or hiding them. `skillSource` is the rule that
106
+ // binds them (skills live in one tier, so it resolves a bare accountId); the sibling
107
+ // libraries have since adopted it, in its owner-pair form (`librarySource`).
108
+ accountSkillRepository: {
109
+ // Catalog reads: the account library panel, the pipeline builder's skill picker, and the RUN
110
+ // path (`SkillCatalogService.list`/`get`, behind the per-account `skillCatalog` cache slice).
111
+ listByAccount: { scope: { kind: 'account', arg: 0 } },
112
+ get: { scope: { kind: 'account', arg: 0 } },
113
+ // Sync writes. `upsert(record)` binds on the record's `accountId` FIELD, so a synced skill can
114
+ // only ever land under an in-scope account. Plain `accountField` is sufficient HERE (and NOT for
115
+ // `skillSourceRepository.upsert` below) because this write conflicts on `(account_id, skill_id)`
116
+ // on both runtimes: the bound account is part of the key, so a foreign `skillId` inserts a fresh
117
+ // row under the caller's own account and can never mutate another tenant's. `softDelete(accountId,
118
+ // skillId, at)` is positional.
119
+ upsert: { scope: { kind: 'accountField', arg: 0 } },
120
+ softDelete: { scope: { kind: 'account', arg: 0 } },
121
+ // The source-keyed reconcile pair: list a source's live skills to diff against the repo, and
122
+ // tombstone all of them in one write on unlink. Both bind through `skillSource`.
123
+ listBySource: { scope: { kind: 'skillSource', arg: 0 } },
124
+ softDeleteBySource: { scope: { kind: 'skillSource', arg: 0 } },
125
+ },
126
+ // The repo-linkage rows the library panel lists and the sync pins its head commit on.
127
+ // `listByAccount` is positional; the three sourceId-keyed methods bind through `skillSource`.
128
+ //
129
+ // `upsert(record)` takes `accountFieldUpsert`, NOT the plain `accountField` its sibling above uses,
130
+ // because this write conflicts on the `id` ALONE and does not re-`SET account_id` (D1
131
+ // `ON CONFLICT (id) DO UPDATE`, Drizzle `target: skillSources.id`). The row it lands on is therefore
132
+ // chosen by the id, not by the bound account — so binding only the DECLARED `accountId` would let a
133
+ // token scoped to account A name account B's source id, declare its own account to pass the check,
134
+ // and repoint B's link at an attacker-controlled repo; B's next sync folds that repo's `SKILL.md`
135
+ // bodies — agent INSTRUCTIONS — into B's catalog. `accountFieldUpsert` additionally binds the STORED
136
+ // row's account, so an existing foreign row is refused while a create (no such row) still passes.
137
+ //
138
+ // `listByRepo` is deliberately absent: it is the GLOBAL `(repoOwner, repoName)` → sources reverse
139
+ // lookup the push-webhook fan-out uses, spanning every account by construction, so no rule can
140
+ // bind it. It runs on the mothership (which receives the webhook), never on a laptop — the same
141
+ // "unscoped, mothership-internal" bucket as `slackConnectionRepository.getByTeam`.
142
+ skillSourceRepository: {
143
+ listByAccount: { scope: { kind: 'account', arg: 0 } },
144
+ get: { scope: { kind: 'skillSource', arg: 0 } },
145
+ upsert: { scope: { kind: 'accountFieldUpsert', arg: 0, entity: 'skillSource' } },
146
+ updateSyncState: { scope: { kind: 'skillSource', arg: 0 } },
147
+ softDelete: { scope: { kind: 'skillSource', arg: 0 } },
148
+ },
149
+ // --- Foundational services (backend/docs/adr/0031-foundational-services.md) -----------
150
+ // The tiered catalog of shared capabilities an Architect designs against, and the API contract
151
+ // documents its consumers lazily read. Both are `(ownerKind, ownerId)`-keyed org/durable state
152
+ // — the `remote` bucket by default — and every method here binds with the same `owner` /
153
+ // `ownerField` rules the prompt-fragment library uses, so a token scoped to one account can
154
+ // neither read nor overwrite another tenant's catalog.
155
+ //
156
+ // Remote rather than `telemetry` or `local-sqlite` for the reason the bucket test names: what
157
+ // READS this is a RUN. A mothership-mode node dispatching an architect step resolves the merged
158
+ // catalog over this RPC, and its coder resolves the declared services' contract documents the
159
+ // same way — so a catalog that lived only on the laptop would make every design on a
160
+ // mothership-mode deployment silently see an empty catalog and rebuild capabilities the org
161
+ // already runs. `listByServiceIds` is the hot one (once per consumer dispatch) and is already a
162
+ // single chunked `IN` query, so it stays one round trip over the wire too.
163
+ //
164
+ // The sourceId-keyed sync methods now bind through `librarySource` (see the fragment library
165
+ // above: the same rule, the same dead premise, and the same node-side GitHub client). What stays
166
+ // OFF is `foundationalServiceSourceRepository.listStale` (the autorefresh sweep's global query)
167
+ // and `listByRepo` (the push-webhook fan-out's), both unscoped across tiers by construction and
168
+ // both running where a delivery ARRIVES, which is never a laptop.
169
+ foundationalServiceRepository: {
170
+ listByOwner: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
171
+ get: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
172
+ upsert: { scope: { kind: 'ownerField', arg: 0 } },
173
+ softDelete: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
174
+ // Lifting a board's suppression of an inherited service. Same owner rule as `softDelete` and
175
+ // the same management surface, so it belongs on the same side of the boundary: leaving it off
176
+ // would let a mothership-mode board opt OUT of an account service with no way back in.
177
+ hardDelete: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
178
+ // The source-keyed reconcile pair, mirroring `accountSkillRepository`'s: list a source's live
179
+ // services to diff against the repo, and tombstone all of them in one write on unlink.
180
+ listBySource: {
181
+ scope: { kind: 'librarySource', arg: 0, entity: 'foundationalServiceSource' },
182
+ },
183
+ softDeleteBySource: {
184
+ scope: { kind: 'librarySource', arg: 0, entity: 'foundationalServiceSource' },
185
+ },
186
+ },
187
+ apiContractRepository: {
188
+ listManifestByOwner: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
189
+ listByServiceIds: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
190
+ replaceForService: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
191
+ deleteForService: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
192
+ },
193
+ // `upsert` takes `ownerFieldUpsert` for exactly the reason `fragmentSourceRepository.upsert` does:
194
+ // it conflicts on the `id` alone, so the declared owner does not decide which row is written.
195
+ foundationalServiceSourceRepository: {
196
+ listByOwner: { scope: { kind: 'owner', kindArg: 0, idArg: 1 } },
197
+ upsert: {
198
+ scope: { kind: 'ownerFieldUpsert', arg: 0, entity: 'foundationalServiceSource' },
199
+ },
200
+ get: { scope: { kind: 'librarySource', arg: 0, entity: 'foundationalServiceSource' } },
201
+ updateSyncState: {
202
+ scope: { kind: 'librarySource', arg: 0, entity: 'foundationalServiceSource' },
203
+ },
204
+ softDelete: {
205
+ scope: { kind: 'librarySource', arg: 0, entity: 'foundationalServiceSource' },
206
+ },
207
+ },
208
+ };
209
+ //# sourceMappingURL=rpc-allowlist-libraries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-allowlist-libraries.js","sourceRoot":"","sources":["../../src/persistence/rpc-allowlist-libraries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { PersistenceMethodTable } from './rpc.js';
2
+ /**
3
+ * The VCS installation + projection surface a mothership-mode node may reach.
4
+ *
5
+ * **Why the WRITE half is open now.** The projection writes were parked on "the mothership owns
6
+ * GitHub sync, since the App and the webhooks live there", and the specific fear was that opening
7
+ * `repoProjectionRepository.get` alone would let a repo-write endpoint perform the real GitHub
8
+ * write and then fail on the un-remoted `upsertMany` refresh. That is an argument for opening the
9
+ * two TOGETHER, which is what happens here: token delegation (`/internal/github/installation-token`)
10
+ * gave a node a real GitHub client, so create-branch / open-PR / merge / comment already run there,
11
+ * and their projection refresh is the only half still failing.
12
+ *
13
+ * A node still does not RECEIVE webhooks (a delivery reaches the deployment holding the public URL)
14
+ * and does not run the reconcile cron, so `listStale` and the fan-out reads stay mothership-internal.
15
+ * What is open is the refresh a node's OWN write earns, plus the incremental-sync cursors that keep
16
+ * it from re-fetching what the mothership already fetched.
17
+ *
18
+ * Scope rules: everything workspace-keyed takes the plain `workspace` rule on arg0, which is what
19
+ * the projections are indexed by. The installation-keyed methods take the `installation` rule
20
+ * (installation id → the binding's account, resolved server-side) and `linkedWorkspaces` binds its
21
+ * CANDIDATE list (`workspaceList`).
22
+ */
23
+ export declare const VCS_PERSISTENCE_METHODS: PersistenceMethodTable;
24
+ //# sourceMappingURL=rpc-allowlist-vcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-allowlist-vcs.d.ts","sourceRoot":"","sources":["../../src/persistence/rpc-allowlist-vcs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAYtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,uBAAuB,EAAE,sBAuFrC,CAAA"}
@@ -0,0 +1,119 @@
1
+ // The VCS half of the mothership-mode persistence allow-list: the installation bindings and the
2
+ // six GitHub/GitLab read-model projections. Split out of `rpc-allowlist.ts` when the sync +
3
+ // repo-write surface landed, because that file had reached its size budget and this is the one
4
+ // cohesive block inside it: every entry here is about a repository host rather than about the
5
+ // board, and they share one argument shape (a workspaceId, or an installation id) and one
6
+ // question ("may this node write what its GitHub client just read?").
7
+ //
8
+ // Spread into `REMOTE_PERSISTENCE_METHODS`; the drift guard reads the merged table, so an entry
9
+ // here is indistinguishable from one there to everything downstream.
10
+ /**
11
+ * The VCS installation + projection surface a mothership-mode node may reach.
12
+ *
13
+ * **Why the WRITE half is open now.** The projection writes were parked on "the mothership owns
14
+ * GitHub sync, since the App and the webhooks live there", and the specific fear was that opening
15
+ * `repoProjectionRepository.get` alone would let a repo-write endpoint perform the real GitHub
16
+ * write and then fail on the un-remoted `upsertMany` refresh. That is an argument for opening the
17
+ * two TOGETHER, which is what happens here: token delegation (`/internal/github/installation-token`)
18
+ * gave a node a real GitHub client, so create-branch / open-PR / merge / comment already run there,
19
+ * and their projection refresh is the only half still failing.
20
+ *
21
+ * A node still does not RECEIVE webhooks (a delivery reaches the deployment holding the public URL)
22
+ * and does not run the reconcile cron, so `listStale` and the fan-out reads stay mothership-internal.
23
+ * What is open is the refresh a node's OWN write earns, plus the incremental-sync cursors that keep
24
+ * it from re-fetching what the mothership already fetched.
25
+ *
26
+ * Scope rules: everything workspace-keyed takes the plain `workspace` rule on arg0, which is what
27
+ * the projections are indexed by. The installation-keyed methods take the `installation` rule
28
+ * (installation id → the binding's account, resolved server-side) and `linkedWorkspaces` binds its
29
+ * CANDIDATE list (`workspaceList`).
30
+ */
31
+ export const VCS_PERSISTENCE_METHODS = {
32
+ // --- Installation bindings -------------------------------------------------------
33
+ // `getByWorkspace` is the run path's first read: `resolveRepoTarget` runs it on EVERY
34
+ // container-agent dispatch (installation → then the `github_repos` projection). The
35
+ // installation-keyed reads back the binding surface around it: `listByInstallationIds` annotates
36
+ // a list of candidate ids, `getByInstallationId` recovers GitHub's stateless setup redirect, and
37
+ // `listWorkspacesForInstallation` is the sync fan-out's "which boards does this installation
38
+ // reach" (bound by the installation's own account, and it answers with workspace ids of that
39
+ // account only, so it discloses nothing the account's roster does not).
40
+ //
41
+ // Still OFF, and permanently:
42
+ //
43
+ // - `listActive`, the cron's every-tenant read. It takes no argument, so no rule can bind it,
44
+ // which is exactly why `listActiveForAccount` exists beside it.
45
+ // - `upsert` / `softDelete`, the connect and disconnect WRITES. Both are `integrations.manage`
46
+ // in the service layer (`GitHubController` / `GitLabController` mount that permission), and
47
+ // the machine token scopes ACCOUNTS, not roles: a plain member of an account holds one, so
48
+ // opening these would let them rebind or tear down the org's VCS connection. That is the same
49
+ // reason `emailConnectionRepository.upsert`/`softDelete` and the invitation writes are
50
+ // excluded, and no scope rule can substitute for the role check the RPC bypasses.
51
+ //
52
+ // The binding they would write is also not something a node can compose. App connect probes
53
+ // the installation through an app-JWT call, and a node's `DelegatedAppTokenSource` refuses
54
+ // every app-JWT path by design (the App key never leaves the mothership); the GitLab PAT
55
+ // connect seals its token with the LOCAL `SecretCipher`, so a node-sealed row is one the
56
+ // mothership cannot open. Connect stays where the App and the key are.
57
+ githubInstallationRepository: {
58
+ getByWorkspace: { scope: { kind: 'workspace', arg: 0 } },
59
+ listActiveForAccount: { scope: { kind: 'account', arg: 0 } },
60
+ getByInstallationId: { scope: { kind: 'installation', arg: 0 } },
61
+ listByInstallationIds: { scope: { kind: 'installationList', arg: 0 } },
62
+ listWorkspacesForInstallation: { scope: { kind: 'installation', arg: 0 } },
63
+ },
64
+ // --- Repo projection -------------------------------------------------------------
65
+ // `list` is the SPA's repos panel and the run path's projection walk. `get` is the repo-WRITE
66
+ // facade's resolve step, and `upsertMany`/`tombstoneMissing` the refresh that follows a write or
67
+ // a seed; `setMonorepo` is the board-owned flag `addServiceFromRepo` sets when a frame is linked
68
+ // to a subdirectory. `linkedWorkspaces` binds its candidate list rather than the repo id: the
69
+ // answer is a subset of what the caller passed in, so an out-of-scope candidate is refused
70
+ // instead of quietly filtered, which would turn the read into a probe.
71
+ //
72
+ // The cursors are keyed by installation + repo (a repo is fetched once per org and fanned out),
73
+ // so they take the `installation` rule. Without them a node's own sync would re-fetch every
74
+ // page the mothership already has, which is the rate-limit budget this table exists to protect.
75
+ //
76
+ // Still OFF: `listStale` (the reconcile cron's cross-tenant read) and `listByInstallation` (the
77
+ // delegation mint's own repo-scoping read, unscoped across an installation's workspaces).
78
+ repoProjectionRepository: {
79
+ list: { scope: { kind: 'workspace', arg: 0 } },
80
+ get: { scope: { kind: 'workspace', arg: 0 } },
81
+ upsertMany: { scope: { kind: 'workspace', arg: 0 } },
82
+ tombstoneMissing: { scope: { kind: 'workspace', arg: 0 } },
83
+ setMonorepo: { scope: { kind: 'workspace', arg: 0 } },
84
+ linkedWorkspaces: { scope: { kind: 'workspaceList', arg: 1 } },
85
+ getCursor: { scope: { kind: 'installation', arg: 0 } },
86
+ setCursor: { scope: { kind: 'installation', arg: 0 } },
87
+ },
88
+ // --- Entity projections ----------------------------------------------------------
89
+ // The four read models the SPA's VCS panels display and the sync ingest writes, all keyed by
90
+ // workspace on arg0. Reads and writes move together for the reason stated above: a node whose
91
+ // GitHub client just opened a PR must be able to project it, or the panel shows a repo that has
92
+ // no PR the run just created.
93
+ branchProjectionRepository: {
94
+ listByRepo: { scope: { kind: 'workspace', arg: 0 } },
95
+ upsertMany: { scope: { kind: 'workspace', arg: 0 } },
96
+ },
97
+ pullRequestProjectionRepository: {
98
+ listByWorkspace: { scope: { kind: 'workspace', arg: 0 } },
99
+ listByRepo: { scope: { kind: 'workspace', arg: 0 } },
100
+ upsertMany: { scope: { kind: 'workspace', arg: 0 } },
101
+ },
102
+ issueProjectionRepository: {
103
+ listByWorkspace: { scope: { kind: 'workspace', arg: 0 } },
104
+ listByRepo: { scope: { kind: 'workspace', arg: 0 } },
105
+ upsertMany: { scope: { kind: 'workspace', arg: 0 } },
106
+ },
107
+ commitProjectionRepository: {
108
+ listByRepo: { scope: { kind: 'workspace', arg: 0 } },
109
+ upsertMany: { scope: { kind: 'workspace', arg: 0 } },
110
+ },
111
+ // The check-run projection the `ci` gate's precheck reads by head SHA. Its absence was a run-path
112
+ // gap, not only a panel one: a gate that cannot read the projection falls back to the provider on
113
+ // every poll.
114
+ checkRunProjectionRepository: {
115
+ listBySha: { scope: { kind: 'workspace', arg: 0 } },
116
+ upsertMany: { scope: { kind: 'workspace', arg: 0 } },
117
+ },
118
+ };
119
+ //# sourceMappingURL=rpc-allowlist-vcs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-allowlist-vcs.js","sourceRoot":"","sources":["../../src/persistence/rpc-allowlist-vcs.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,4FAA4F;AAC5F,+FAA+F;AAC/F,8FAA8F;AAC9F,0FAA0F;AAC1F,sEAAsE;AACtE,EAAE;AACF,gGAAgG;AAChG,qEAAqE;AAErE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC7D,oFAAoF;IACpF,sFAAsF;IACtF,oFAAoF;IACpF,iGAAiG;IACjG,iGAAiG;IACjG,6FAA6F;IAC7F,6FAA6F;IAC7F,wEAAwE;IACxE,EAAE;IACF,8BAA8B;IAC9B,EAAE;IACF,8FAA8F;IAC9F,kEAAkE;IAClE,+FAA+F;IAC/F,8FAA8F;IAC9F,6FAA6F;IAC7F,gGAAgG;IAChG,yFAAyF;IACzF,oFAAoF;IACpF,EAAE;IACF,8FAA8F;IAC9F,6FAA6F;IAC7F,2FAA2F;IAC3F,2FAA2F;IAC3F,yEAAyE;IACzE,4BAA4B,EAAE;QAC5B,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACxD,oBAAoB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC5D,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAChE,qBAAqB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACtE,6BAA6B,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;KAC3E;IACD,oFAAoF;IACpF,8FAA8F;IAC9F,iGAAiG;IACjG,iGAAiG;IACjG,8FAA8F;IAC9F,2FAA2F;IAC3F,uEAAuE;IACvE,EAAE;IACF,gGAAgG;IAChG,4FAA4F;IAC5F,gGAAgG;IAChG,EAAE;IACF,gGAAgG;IAChG,0FAA0F;IAC1F,wBAAwB,EAAE;QACxB,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC9C,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC7C,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC1D,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACrD,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC9D,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACtD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;KACvD;IACD,oFAAoF;IACpF,6FAA6F;IAC7F,8FAA8F;IAC9F,gGAAgG;IAChG,8BAA8B;IAC9B,0BAA0B,EAAE;QAC1B,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;KACrD;IACD,+BAA+B,EAAE;QAC/B,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACzD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;KACrD;IACD,yBAAyB,EAAE;QACzB,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACzD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;KACrD;IACD,0BAA0B,EAAE;QAC1B,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;KACrD;IACD,kGAAkG;IAClG,kGAAkG;IAClG,cAAc;IACd,4BAA4B,EAAE;QAC5B,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACnD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;KACrD;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-allowlist.d.ts","sourceRoot":"","sources":["../../src/persistence/rpc-allowlist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAgBtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,0BAA0B,EAAE,sBAw3CxC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,oCAAoC,YAC/C,yBAAyB,EACzB,gCAAgC,EAChC,4BAA4B,EAC5B,yBAAyB,EACzB,2BAA2B,EAC3B,kCAAkC,CAC1B,CAAA;AAEV,yEAAyE;AACzE,MAAM,MAAM,+BAA+B,GAAG,CAAC,OAAO,oCAAoC,CAAC,CAAC,MAAM,CAAC,CAAA"}
1
+ {"version":3,"file":"rpc-allowlist.d.ts","sourceRoot":"","sources":["../../src/persistence/rpc-allowlist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAkBtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,0BAA0B,EAAE,sBA+rCxC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,oCAAoC,YAC/C,yBAAyB,EACzB,gCAAgC,EAChC,4BAA4B,EAC5B,yBAAyB,EACzB,2BAA2B,EAC3B,kCAAkC,CAC1B,CAAA;AAEV,yEAAyE;AACzE,MAAM,MAAM,+BAA+B,GAAG,CAAC,OAAO,oCAAoC,CAAC,CAAC,MAAM,CAAC,CAAA"}