@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.
- package/dist/agents/repoFiles.d.ts +30 -8
- package/dist/agents/repoFiles.d.ts.map +1 -1
- package/dist/agents/repoFiles.js +43 -14
- package/dist/agents/repoFiles.js.map +1 -1
- package/dist/agents/repoOrigin.d.ts +73 -0
- package/dist/agents/repoOrigin.d.ts.map +1 -0
- package/dist/agents/repoOrigin.js +91 -0
- package/dist/agents/repoOrigin.js.map +1 -0
- package/dist/agents/toolServers.d.ts.map +1 -1
- package/dist/agents/toolServers.js +15 -1
- package/dist/agents/toolServers.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -0
- package/dist/app.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/agentKinds/AgentKindsController.d.ts +46 -0
- package/dist/modules/agentKinds/AgentKindsController.d.ts.map +1 -0
- package/dist/modules/agentKinds/AgentKindsController.js +56 -0
- package/dist/modules/agentKinds/AgentKindsController.js.map +1 -0
- package/dist/modules/persistence/PersistenceController.d.ts.map +1 -1
- package/dist/modules/persistence/PersistenceController.js +6 -161
- package/dist/modules/persistence/PersistenceController.js.map +1 -1
- package/dist/modules/persistence/dispatchScope.d.ts +16 -0
- package/dist/modules/persistence/dispatchScope.d.ts.map +1 -0
- package/dist/modules/persistence/dispatchScope.js +307 -0
- package/dist/modules/persistence/dispatchScope.js.map +1 -0
- package/dist/persistence/agentKinds.d.ts +43 -0
- package/dist/persistence/agentKinds.d.ts.map +1 -0
- package/dist/persistence/agentKinds.js +99 -0
- package/dist/persistence/agentKinds.js.map +1 -0
- package/dist/persistence/rpc-allowlist-libraries.d.ts +4 -0
- package/dist/persistence/rpc-allowlist-libraries.d.ts.map +1 -0
- package/dist/persistence/rpc-allowlist-libraries.js +209 -0
- package/dist/persistence/rpc-allowlist-libraries.js.map +1 -0
- package/dist/persistence/rpc-allowlist-vcs.d.ts +24 -0
- package/dist/persistence/rpc-allowlist-vcs.d.ts.map +1 -0
- package/dist/persistence/rpc-allowlist-vcs.js +119 -0
- package/dist/persistence/rpc-allowlist-vcs.js.map +1 -0
- package/dist/persistence/rpc-allowlist.d.ts.map +1 -1
- package/dist/persistence/rpc-allowlist.js +66 -249
- package/dist/persistence/rpc-allowlist.js.map +1 -1
- package/dist/persistence/rpc-scope.logic.d.ts +46 -0
- package/dist/persistence/rpc-scope.logic.d.ts.map +1 -1
- package/dist/persistence/rpc-scope.logic.js +109 -0
- package/dist/persistence/rpc-scope.logic.js.map +1 -1
- package/dist/persistence/rpc.d.ts +111 -0
- package/dist/persistence/rpc.d.ts.map +1 -1
- package/dist/persistence/rpc.js +42 -44
- package/dist/persistence/rpc.js.map +1 -1
- 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":"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"}
|
|
@@ -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;
|
|
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"}
|