@substrat-run/control-plane-api 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +26 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +287 -8
- package/dist/api.js.map +1 -1
- package/dist/auth.d.ts +46 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/deploy.d.ts +103 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +79 -0
- package/dist/deploy.js.map +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/vertical-client.d.ts.map +1 -1
- package/dist/vertical-client.js.map +1 -1
- package/dist/wfp.d.ts +26 -0
- package/dist/wfp.d.ts.map +1 -0
- package/dist/wfp.js +38 -0
- package/dist/wfp.js.map +1 -0
- package/package.json +5 -5
package/dist/api.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import type { PlatformActorId } from '@substrat-run/contracts';
|
|
3
3
|
import type { ScopeHost } from '@substrat-run/kernel';
|
|
4
|
-
import type { PlatformActorAuth } from './auth.js';
|
|
4
|
+
import type { PlatformActorAuth, BuilderAuth, Principal } from './auth.js';
|
|
5
5
|
import type { VerticalClient } from './vertical-client.js';
|
|
6
|
+
import type { DeployVerticalFn } from './deploy.js';
|
|
6
7
|
export interface ControlPlaneApiOptions {
|
|
7
8
|
host: ScopeHost;
|
|
8
9
|
/**
|
|
@@ -14,15 +15,39 @@ export interface ControlPlaneApiOptions {
|
|
|
14
15
|
* the same Workers-for-Platforms swap later.
|
|
15
16
|
*/
|
|
16
17
|
verticals?: Record<string, VerticalClient>;
|
|
18
|
+
/**
|
|
19
|
+
* Resolves a vertical dynamically — the dispatch swap for provisioning (orchestration.md
|
|
20
|
+
* §5.4), the mirror of the router's `verticalFor`. Given a slug, the host looks up the
|
|
21
|
+
* vertical's `prod` channel version and returns a `VerticalClient` over
|
|
22
|
+
* `env.DISPATCH.get(deploymentRef)`. Tried after the static `verticals` map, so a
|
|
23
|
+
* pushed vertical is provisionable with no redeploy. Absent ⇒ only static bindings.
|
|
24
|
+
*/
|
|
25
|
+
resolveVertical?: (slug: string, actor: PlatformActorId) => Promise<VerticalClient | undefined>;
|
|
26
|
+
/**
|
|
27
|
+
* Uploads a built vertical bundle to the platform runtime (a WfP dispatch
|
|
28
|
+
* namespace), injected by the host so this package holds no Cloudflare SDK and the
|
|
29
|
+
* builder never holds a Cloudflare credential (D-34). Absent ⇒ the deploy route
|
|
30
|
+
* 501s. See `deploy.ts`.
|
|
31
|
+
*/
|
|
32
|
+
deployVertical?: DeployVerticalFn;
|
|
17
33
|
/**
|
|
18
34
|
* Resolves the platform actor from the request. No default: an unauthenticated
|
|
19
35
|
* control plane is not a sensible fallback, and a package that shipped one
|
|
20
36
|
* would eventually be deployed with it (control-plane.md §6).
|
|
21
37
|
*/
|
|
22
38
|
authenticate: PlatformActorAuth;
|
|
39
|
+
/**
|
|
40
|
+
* Resolves a BUILDER principal — a tenant user acting on their own verticals
|
|
41
|
+
* (builder-plane.md §4). Tried only after `authenticate` declines, so staff and
|
|
42
|
+
* service auth are unchanged and remain a superset. Absent ⇒ no builder path:
|
|
43
|
+
* the surface is staff/service-only exactly as before. A builder is confined to
|
|
44
|
+
* the vertical-management routes and to the verticals their tenant owns.
|
|
45
|
+
*/
|
|
46
|
+
authenticateBuilder?: BuilderAuth;
|
|
23
47
|
}
|
|
24
48
|
type Vars = {
|
|
25
49
|
actor: PlatformActorId;
|
|
50
|
+
principal: Principal;
|
|
26
51
|
};
|
|
27
52
|
/**
|
|
28
53
|
* The audited HTTP surface over `HostAdmin` (control-plane.md §4.5).
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAoB5B,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChG;;;;;OAKG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC;;;;OAIG;IACH,YAAY,EAAE,iBAAiB,CAAC;IAChC;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,WAAW,CAAC;CACnC;AAKD,KAAK,IAAI,GAAG;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAkG7D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC,CAmfhG"}
|
package/dist/api.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
-
import { adminAction, createTenantInput, hostname as hostnameSchema, hostnameRegion, hostnameStatus,
|
|
2
|
+
import { adminAction, channelName, createTenantInput, hostname as hostnameSchema, hostnameRegion, hostnameStatus, promotionAcknowledgement, provisionableJurisdiction, publishVersionInput, registerVerticalInput, scopeId as scopeIdSchema, scopeStatus, storageShape, surfaceName, tenantId as tenantIdSchema, tenantStatus, z, } from '@substrat-run/contracts';
|
|
3
|
+
import { ulid } from '@substrat-run/kernel';
|
|
3
4
|
import { ControlPlaneError } from './client.js';
|
|
4
5
|
import { mapError } from './errors.js';
|
|
6
|
+
import { assertSandboxContract, deployManifest, deploymentRefFor } from './deploy.js';
|
|
5
7
|
// -- request schemas ---------------------------------------------------------
|
|
6
8
|
// Parse, don't trust: every input crosses Zod at the boundary. The ids stay
|
|
7
9
|
// CALLER-SUPPLIED rather than minted here, exactly as the contract has them —
|
|
@@ -17,7 +19,10 @@ const provisionScopeBody = z.object({
|
|
|
17
19
|
name: z.string().optional(),
|
|
18
20
|
vertical: z.string().nullable().optional(),
|
|
19
21
|
storageShape: storageShape.optional(),
|
|
20
|
-
|
|
22
|
+
// The gate: only `global` is accepted until `eu`/`us` enforcement exists (K-32).
|
|
23
|
+
// A request naming a jurisdiction we cannot yet honour is refused at the Zod
|
|
24
|
+
// boundary with 400, rather than recorded as a residency claim with no mechanism.
|
|
25
|
+
jurisdiction: provisionableJurisdiction.optional(),
|
|
21
26
|
});
|
|
22
27
|
const setTenantStatusBody = z.object({ status: tenantStatus });
|
|
23
28
|
const provisionInstanceBody = z.object({
|
|
@@ -49,6 +54,20 @@ const listScopesQuery = z.object({
|
|
|
49
54
|
status: z.array(scopeStatus).optional(),
|
|
50
55
|
vertical: z.string().optional(),
|
|
51
56
|
});
|
|
57
|
+
// -- vertical + version registry bodies (#31; orchestration.md §5.6) --------
|
|
58
|
+
// Each route below is a thin pass-through to a built `HostAdmin` method — the
|
|
59
|
+
// registry data model, admission and the digest-diff promotion gate already exist
|
|
60
|
+
// (registry.ts + both adapters). This surface exposes them; it adds no policy of its
|
|
61
|
+
// own. The `deploy` route (the uploader) is deliberately absent — that is Phase 2.
|
|
62
|
+
const rejectVersionBody = z.object({ note: z.string().min(1) });
|
|
63
|
+
const promoteVersionBody = z.object({
|
|
64
|
+
versionId: z.string().min(1),
|
|
65
|
+
// The two human checkpoints: promotion refuses a changed permission/migration
|
|
66
|
+
// digest unless the matching flag is set. Optional because an unchanged digest
|
|
67
|
+
// needs no acknowledgement.
|
|
68
|
+
acknowledge: promotionAcknowledgement.optional(),
|
|
69
|
+
});
|
|
70
|
+
const bindScopeVersionBody = z.object({ versionId: z.string().min(1) });
|
|
52
71
|
const listRolesQuery = z.object({
|
|
53
72
|
tenantId: tenantIdSchema.optional(),
|
|
54
73
|
// Free-form: a module id or 'vertical'. Not narrowed to the source union here
|
|
@@ -91,15 +110,60 @@ const auditLogQuery = z.object({
|
|
|
91
110
|
* adapter's read path, not an admin surface.
|
|
92
111
|
*/
|
|
93
112
|
export function createControlPlaneApi(options) {
|
|
94
|
-
const { host, authenticate } = options;
|
|
113
|
+
const { host, authenticate, authenticateBuilder } = options;
|
|
95
114
|
const admin = host.admin;
|
|
96
115
|
const app = new Hono();
|
|
97
|
-
// Fail closed, before any route runs: no
|
|
116
|
+
// Fail closed, before any route runs: no principal, no reach. Staff/service first
|
|
117
|
+
// (unchanged, a superset); a builder session only when staff declines.
|
|
98
118
|
app.use('*', async (c, next) => {
|
|
99
|
-
const
|
|
100
|
-
|
|
119
|
+
const staff = await authenticate(c.req.raw);
|
|
120
|
+
let principal = staff ? { kind: 'staff', actor: staff } : null;
|
|
121
|
+
if (!principal && authenticateBuilder) {
|
|
122
|
+
const builder = await authenticateBuilder(c.req.raw);
|
|
123
|
+
if (builder) {
|
|
124
|
+
principal = {
|
|
125
|
+
kind: 'builder',
|
|
126
|
+
actor: builder.actor,
|
|
127
|
+
tenantId: builder.tenantId,
|
|
128
|
+
tenantSlug: builder.tenantSlug,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!principal)
|
|
101
133
|
return c.json({ error: 'unauthenticated' }, 401);
|
|
102
|
-
c.set('
|
|
134
|
+
c.set('principal', principal);
|
|
135
|
+
c.set('actor', principal.actor);
|
|
136
|
+
await next();
|
|
137
|
+
});
|
|
138
|
+
// Confine a BUILDER to the vertical-management surface, fail-CLOSED (builder-plane.md
|
|
139
|
+
// §4). Default-deny by design: a builder reaches only the routes on this allowlist,
|
|
140
|
+
// and only for verticals its tenant owns (the per-route ownership checks below). A
|
|
141
|
+
// route not listed here 403s for a builder — forgetting to allow one costs a feature,
|
|
142
|
+
// never an escalation, which is why this is an allowlist rather than a set of guards
|
|
143
|
+
// sprinkled on the staff-only routes (a forgotten guard there would fail OPEN). Staff
|
|
144
|
+
// pass through untouched. The set deliberately excludes the staff-only
|
|
145
|
+
// `versions/:id/{admit,reject}` and `.../instances`.
|
|
146
|
+
//
|
|
147
|
+
// Matched on the request path by SUFFIX from `/verticals` (a URL-encoded prefixed slug
|
|
148
|
+
// has no literal `/`, so `[^/]+` covers it) — mount-independent: it works whether the app
|
|
149
|
+
// is standalone (`/verticals/…`) or routed under `/api` in the worker (`/api/verticals/…`).
|
|
150
|
+
// The `$` anchors deliberately exclude the staff-only `versions/:id/{admit,reject}` and
|
|
151
|
+
// `.../instances`, which end in a different segment.
|
|
152
|
+
const BUILDER_ROUTES = [
|
|
153
|
+
{ method: 'GET', re: /\/verticals$/ },
|
|
154
|
+
{ method: 'POST', re: /\/verticals$/ },
|
|
155
|
+
{ method: 'GET', re: /\/verticals\/[^/]+\/versions$/ },
|
|
156
|
+
{ method: 'POST', re: /\/verticals\/[^/]+\/versions$/ },
|
|
157
|
+
{ method: 'GET', re: /\/verticals\/[^/]+\/channels$/ },
|
|
158
|
+
{ method: 'POST', re: /\/verticals\/[^/]+\/channels\/[^/]+\/promote$/ },
|
|
159
|
+
{ method: 'POST', re: /\/verticals\/[^/]+\/deploy$/ },
|
|
160
|
+
];
|
|
161
|
+
app.use('*', async (c, next) => {
|
|
162
|
+
if (c.get('principal').kind === 'builder') {
|
|
163
|
+
const allowed = BUILDER_ROUTES.some((r) => r.method === c.req.method && r.re.test(c.req.path));
|
|
164
|
+
if (!allowed)
|
|
165
|
+
return c.json({ error: 'forbidden' }, 403);
|
|
166
|
+
}
|
|
103
167
|
await next();
|
|
104
168
|
});
|
|
105
169
|
// One error boundary for every route: adapters throw plain Errors, and each
|
|
@@ -192,6 +256,16 @@ export function createControlPlaneApi(options) {
|
|
|
192
256
|
return c.json(await admin.getScopeRecord(c.get('actor'), tenantId, scopeId));
|
|
193
257
|
});
|
|
194
258
|
}
|
|
259
|
+
// Pin a scope to a vertical version (#31; orchestration.md §4). Refuses a
|
|
260
|
+
// non-admitted version below the seam — that refusal is the registry's reason to
|
|
261
|
+
// exist. A scope operation, so it keeps the scope route shape.
|
|
262
|
+
app.post('/tenants/:tenantId/scopes/:scopeId/version', async (c) => {
|
|
263
|
+
const tenantId = tenantIdSchema.parse(c.req.param('tenantId'));
|
|
264
|
+
const scopeId = scopeIdSchema.parse(c.req.param('scopeId'));
|
|
265
|
+
const { versionId } = bindScopeVersionBody.parse(await c.req.json());
|
|
266
|
+
await admin.bindScopeVersion(c.get('actor'), tenantId, scopeId, versionId);
|
|
267
|
+
return c.json(await admin.getScopeRecord(c.get('actor'), tenantId, scopeId));
|
|
268
|
+
});
|
|
195
269
|
// -- instances (K-31) -------------------------------------------------------
|
|
196
270
|
// The one place this surface calls OUT rather than sitting over `HostAdmin`, and
|
|
197
271
|
// it is unavoidable: only the vertical can create a usable scope DO, because the
|
|
@@ -204,7 +278,9 @@ export function createControlPlaneApi(options) {
|
|
|
204
278
|
// in-between properly, and it is still unused — see the PR.
|
|
205
279
|
app.post('/verticals/:slug/instances', async (c) => {
|
|
206
280
|
const slug = c.req.param('slug');
|
|
207
|
-
|
|
281
|
+
// Static binding first (milestone-one shape), then the dispatch resolver for a
|
|
282
|
+
// pushed vertical — the provisioning mirror of the router's verticalFor.
|
|
283
|
+
const vertical = options.verticals?.[slug] ?? (await options.resolveVertical?.(slug, c.get('actor')));
|
|
208
284
|
if (!vertical) {
|
|
209
285
|
return c.json({ error: `no deployment is bound for vertical '${slug}'` }, 501);
|
|
210
286
|
}
|
|
@@ -224,6 +300,209 @@ export function createControlPlaneApi(options) {
|
|
|
224
300
|
throw e;
|
|
225
301
|
}
|
|
226
302
|
});
|
|
303
|
+
// -- vertical + version registry (#31; orchestration.md §5.6) --------------
|
|
304
|
+
// Thin pass-throughs to `HostAdmin`. Register a vertical, publish a version
|
|
305
|
+
// (lands PENDING — a push is not a deploy), admit/reject at the checkpoints,
|
|
306
|
+
// promote a channel through the digest-diff gate, pin a scope to a version.
|
|
307
|
+
//
|
|
308
|
+
// A BUILDER (builder-plane.md §4) reaches only this subset (the confinement
|
|
309
|
+
// middleware above), and only for verticals its tenant owns. `ownerOf` reads the
|
|
310
|
+
// registry row's owner_tenant (undefined ⇒ not registered — a claimable slug).
|
|
311
|
+
// `listVerticals` returns every row (the adapter does not narrow); the transport is
|
|
312
|
+
// where per-principal filtering happens — here and on GET /verticals.
|
|
313
|
+
const ownerOf = async (actor, slug) => {
|
|
314
|
+
const v = (await admin.listVerticals(actor)).find((x) => x.slug === slug);
|
|
315
|
+
return v ? v.ownerTenant : undefined;
|
|
316
|
+
};
|
|
317
|
+
// The vertical id a request actually addresses. For a BUILDER it is `<tenantSlug>/<name>`
|
|
318
|
+
// (builder-plane.md §5): they send a bare `--slug`, the control plane forms the prefix
|
|
319
|
+
// from their authenticated tenant — so two builders can each own a `helpdesk` with no
|
|
320
|
+
// global claim race, and a builder can never name another tenant's namespace (their
|
|
321
|
+
// prefix is fixed by auth). Staff address a vertical by its full id, so for them the raw
|
|
322
|
+
// slug is the identity. A builder slug that already contains `/` yields a two-slash id
|
|
323
|
+
// that fails `verticalSlug` validation / the ownership check downstream — fail-closed.
|
|
324
|
+
const effectiveSlug = (p, raw) => p.kind === 'builder' ? `${p.tenantSlug}/${raw}` : raw;
|
|
325
|
+
app.get('/verticals', async (c) => {
|
|
326
|
+
const all = await admin.listVerticals(c.get('actor'));
|
|
327
|
+
const p = c.get('principal');
|
|
328
|
+
// A builder sees only what it owns; staff see the whole registry.
|
|
329
|
+
return c.json(p.kind === 'builder' ? all.filter((v) => v.ownerTenant === p.tenantId) : all);
|
|
330
|
+
});
|
|
331
|
+
app.post('/verticals', async (c) => {
|
|
332
|
+
const input = registerVerticalInput.parse(await c.req.json());
|
|
333
|
+
const p = c.get('principal');
|
|
334
|
+
if (p.kind === 'builder') {
|
|
335
|
+
// The bare `--slug` becomes `<tenantSlug>/<name>`; claim it or re-register one this
|
|
336
|
+
// tenant already owns (a slug owned by another tenant is refused — unreachable via
|
|
337
|
+
// the prefix, backstopped by the ownership check). Owner + prefix come from the
|
|
338
|
+
// principal, never trusted from the body.
|
|
339
|
+
input.slug = effectiveSlug(p, input.slug);
|
|
340
|
+
const owner = await ownerOf(p.actor, input.slug);
|
|
341
|
+
if (owner !== undefined && owner !== p.tenantId)
|
|
342
|
+
return c.json({ error: 'forbidden' }, 403);
|
|
343
|
+
input.ownerTenant = p.tenantId;
|
|
344
|
+
}
|
|
345
|
+
await admin.registerVertical(c.get('actor'), input);
|
|
346
|
+
// Idempotent on the slug (a conflicting re-register throws below the seam), so
|
|
347
|
+
// read back rather than echo the request.
|
|
348
|
+
const registered = (await admin.listVerticals(c.get('actor'))).find((v) => v.slug === input.slug);
|
|
349
|
+
return c.json(registered, 201);
|
|
350
|
+
});
|
|
351
|
+
app.get('/verticals/:slug/versions', async (c) => {
|
|
352
|
+
const p = c.get('principal');
|
|
353
|
+
const slug = effectiveSlug(p, c.req.param('slug'));
|
|
354
|
+
// A builder reading a vertical it does not own gets 404 — indistinguishable from
|
|
355
|
+
// absent, the same fail-closed reflex K-3 uses for a cross-tenant scope.
|
|
356
|
+
if (p.kind === 'builder' && (await ownerOf(p.actor, slug)) !== p.tenantId) {
|
|
357
|
+
return c.json({ error: 'not found' }, 404);
|
|
358
|
+
}
|
|
359
|
+
return c.json(await admin.listVersions(c.get('actor'), slug));
|
|
360
|
+
});
|
|
361
|
+
app.post('/verticals/:slug/versions', async (c) => {
|
|
362
|
+
const input = publishVersionInput.parse(await c.req.json());
|
|
363
|
+
// The slug is in the path AND the body; they must agree (both bare for a builder),
|
|
364
|
+
// the same fail-closed cross-check `(tenantId, scopeId)` makes (K-3) — a mismatch is
|
|
365
|
+
// a client bug, not a silent publish under the wrong vertical.
|
|
366
|
+
if (input.verticalSlug !== c.req.param('slug')) {
|
|
367
|
+
return c.json({ error: 'verticalSlug does not match the path' }, 400);
|
|
368
|
+
}
|
|
369
|
+
const p = c.get('principal');
|
|
370
|
+
const slug = effectiveSlug(p, input.verticalSlug);
|
|
371
|
+
if (p.kind === 'builder' && (await ownerOf(p.actor, slug)) !== p.tenantId) {
|
|
372
|
+
return c.json({ error: 'forbidden' }, 403);
|
|
373
|
+
}
|
|
374
|
+
input.verticalSlug = slug;
|
|
375
|
+
await admin.publishVersion(c.get('actor'), input);
|
|
376
|
+
const version = (await admin.listVersions(c.get('actor'), slug)).find((v) => v.id === input.id);
|
|
377
|
+
return c.json(version, 201);
|
|
378
|
+
});
|
|
379
|
+
app.post('/verticals/:slug/versions/:id/admit', async (c) => {
|
|
380
|
+
const slug = c.req.param('slug');
|
|
381
|
+
const id = c.req.param('id');
|
|
382
|
+
await admin.admitVersion(c.get('actor'), id);
|
|
383
|
+
return c.json((await admin.listVersions(c.get('actor'), slug)).find((v) => v.id === id));
|
|
384
|
+
});
|
|
385
|
+
app.post('/verticals/:slug/versions/:id/reject', async (c) => {
|
|
386
|
+
const slug = c.req.param('slug');
|
|
387
|
+
const id = c.req.param('id');
|
|
388
|
+
const { note } = rejectVersionBody.parse(await c.req.json());
|
|
389
|
+
await admin.rejectVersion(c.get('actor'), id, note);
|
|
390
|
+
return c.json((await admin.listVersions(c.get('actor'), slug)).find((v) => v.id === id));
|
|
391
|
+
});
|
|
392
|
+
app.get('/verticals/:slug/channels', async (c) => {
|
|
393
|
+
const p = c.get('principal');
|
|
394
|
+
const slug = effectiveSlug(p, c.req.param('slug'));
|
|
395
|
+
if (p.kind === 'builder' && (await ownerOf(p.actor, slug)) !== p.tenantId) {
|
|
396
|
+
return c.json({ error: 'not found' }, 404);
|
|
397
|
+
}
|
|
398
|
+
return c.json(await admin.listChannels(c.get('actor'), slug));
|
|
399
|
+
});
|
|
400
|
+
app.post('/verticals/:slug/channels/:channel/promote', async (c) => {
|
|
401
|
+
const p = c.get('principal');
|
|
402
|
+
const slug = effectiveSlug(p, c.req.param('slug'));
|
|
403
|
+
const channel = channelName.parse(c.req.param('channel'));
|
|
404
|
+
if (p.kind === 'builder') {
|
|
405
|
+
// Staff keep the prod gate (model B, §2/§4): a builder self-serves dev/staging;
|
|
406
|
+
// admission and prod promotion stay a human staff decision (the trust boundary
|
|
407
|
+
// self-serve-deploy.md §3 is explicit about). And only on verticals it owns.
|
|
408
|
+
if (channel === 'prod')
|
|
409
|
+
return c.json({ error: 'promotion to prod is staff-only' }, 403);
|
|
410
|
+
if ((await ownerOf(p.actor, slug)) !== p.tenantId)
|
|
411
|
+
return c.json({ error: 'forbidden' }, 403);
|
|
412
|
+
}
|
|
413
|
+
const { versionId, acknowledge } = promoteVersionBody.parse(await c.req.json());
|
|
414
|
+
// The blast-radius moment: refuses a changed digest without the acknowledgement,
|
|
415
|
+
// and refuses a non-admitted version. Both are enforced below the seam and
|
|
416
|
+
// surface as a 4xx through mapError, not a 500.
|
|
417
|
+
await admin.promoteVersion(c.get('actor'), slug, channel, versionId, acknowledge);
|
|
418
|
+
return c.json((await admin.listChannels(c.get('actor'), slug)).find((ch) => ch.channel === channel));
|
|
419
|
+
});
|
|
420
|
+
// The deploy seam (self-serve-deploy.md): a `substrat push` uploads a built bundle
|
|
421
|
+
// here. The order is upload → record, deliberately: a failed record leaves an
|
|
422
|
+
// orphaned namespace script (invisible, GC'able) rather than a directory row
|
|
423
|
+
// pointing at a deployment that is not there. The version lands PENDING — a push
|
|
424
|
+
// is not a deploy; admission still gates serving.
|
|
425
|
+
app.post('/verticals/:slug/deploy', async (c) => {
|
|
426
|
+
if (!options.deployVertical) {
|
|
427
|
+
return c.json({ error: 'deploy is not configured on this control plane' }, 501);
|
|
428
|
+
}
|
|
429
|
+
const p = c.get('principal');
|
|
430
|
+
// A builder pushes a bare `--slug`; the registry id is `<tenantSlug>/<name>` (§5).
|
|
431
|
+
const slug = effectiveSlug(p, c.req.param('slug'));
|
|
432
|
+
// A builder pushes to a slug it owns, or claims an unregistered one (§3). Checked
|
|
433
|
+
// BEFORE the upload so a refused push never leaves an orphaned namespace script.
|
|
434
|
+
// `existingOwner` also lets a staff push stay ownership-idempotent (below).
|
|
435
|
+
const existingOwner = await ownerOf(c.get('actor'), slug);
|
|
436
|
+
if (p.kind === 'builder' && existingOwner !== undefined && existingOwner !== p.tenantId) {
|
|
437
|
+
return c.json({ error: 'forbidden' }, 403);
|
|
438
|
+
}
|
|
439
|
+
const form = await c.req.formData();
|
|
440
|
+
const raw = form.get('manifest');
|
|
441
|
+
if (typeof raw !== 'string')
|
|
442
|
+
return c.json({ error: 'missing manifest part' }, 400);
|
|
443
|
+
const manifest = deployManifest.parse(JSON.parse(raw));
|
|
444
|
+
// §4 sandbox contract, before anything reaches the namespace.
|
|
445
|
+
assertSandboxContract(manifest);
|
|
446
|
+
const modules = [];
|
|
447
|
+
for (const [name, value] of form.entries()) {
|
|
448
|
+
if (name === 'manifest')
|
|
449
|
+
continue;
|
|
450
|
+
if (value instanceof File) {
|
|
451
|
+
modules.push({
|
|
452
|
+
name,
|
|
453
|
+
content: new Uint8Array(await value.arrayBuffer()),
|
|
454
|
+
contentType: value.type || 'application/javascript+module',
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (!modules.some((m) => m.name === manifest.entry)) {
|
|
459
|
+
return c.json({ error: `entry module '${manifest.entry}' is not among the uploaded files` }, 400);
|
|
460
|
+
}
|
|
461
|
+
// Mint the version id first: the deploymentRef (the dispatch script name) is keyed
|
|
462
|
+
// on it, so it is CF-valid and unique per version.
|
|
463
|
+
const id = ulid();
|
|
464
|
+
const deploymentRef = deploymentRefFor(slug, id);
|
|
465
|
+
try {
|
|
466
|
+
await options.deployVertical(deploymentRef, {
|
|
467
|
+
entry: manifest.entry,
|
|
468
|
+
compatibilityDate: manifest.compatibilityDate,
|
|
469
|
+
compatibilityFlags: manifest.compatibilityFlags,
|
|
470
|
+
modules,
|
|
471
|
+
doClasses: manifest.doClasses,
|
|
472
|
+
bindings: manifest.bindings,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
catch (e) {
|
|
476
|
+
// The upload to the runtime failed (e.g. Cloudflare rejected the script). This is
|
|
477
|
+
// a platform/runtime error, not a bad request — surface the detail (the builder is
|
|
478
|
+
// authenticated) rather than the anonymous 500 the generic handler would give, so a
|
|
479
|
+
// push failure is diagnosable without reading worker logs.
|
|
480
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
481
|
+
console.error('deploy.upload.failed', { slug, deploymentRef, detail });
|
|
482
|
+
return c.json({ error: 'deploy upload failed', detail }, 502);
|
|
483
|
+
}
|
|
484
|
+
// Register-then-publish, both idempotent-ish below the seam: a first push of a
|
|
485
|
+
// slug registers it; publishVersion lands the version pending with deploymentRef.
|
|
486
|
+
// A builder push claims the slug for its tenant; a staff push preserves the existing
|
|
487
|
+
// owner (null ⇒ platform-owned for a first-party vertical) rather than clobbering it.
|
|
488
|
+
await admin.registerVertical(c.get('actor'), {
|
|
489
|
+
slug,
|
|
490
|
+
name: manifest.name ?? slug,
|
|
491
|
+
source: 'cli',
|
|
492
|
+
ownerTenant: p.kind === 'builder' ? p.tenantId : (existingOwner ?? null),
|
|
493
|
+
});
|
|
494
|
+
await admin.publishVersion(c.get('actor'), {
|
|
495
|
+
id,
|
|
496
|
+
verticalSlug: slug,
|
|
497
|
+
version: manifest.version,
|
|
498
|
+
manifestDigest: manifest.digests.manifest,
|
|
499
|
+
permissionDigest: manifest.digests.permission,
|
|
500
|
+
migrationDigest: manifest.digests.migration,
|
|
501
|
+
deploymentRef,
|
|
502
|
+
});
|
|
503
|
+
const version = (await admin.listVersions(c.get('actor'), slug)).find((v) => v.id === id);
|
|
504
|
+
return c.json(version, 201);
|
|
505
|
+
});
|
|
227
506
|
// -- the hostname map (§4.7, K-26) -----------------------------------------
|
|
228
507
|
// The three STAFF actions land here. `resolveHostname` deliberately does NOT:
|
|
229
508
|
// it is the router's per-request machine path, unaudited by design (K-24), and
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type PlatformActorId } from '@substrat-run/contracts';
|
|
1
|
+
import { type PlatformActorId, type TenantId } from '@substrat-run/contracts';
|
|
2
2
|
/**
|
|
3
3
|
* The identity seam for the control plane (control-plane.md §6).
|
|
4
4
|
*
|
|
@@ -86,4 +86,49 @@ export declare function staffAllowlist(entries: ReadonlyArray<{
|
|
|
86
86
|
email: string;
|
|
87
87
|
actor: PlatformActorId;
|
|
88
88
|
}>): StaffActorResolver;
|
|
89
|
+
/**
|
|
90
|
+
* A tenant user resolved from an authenticated request — the builder-plane mirror
|
|
91
|
+
* of `StaffIdentity`/`PlatformActorId`.
|
|
92
|
+
*
|
|
93
|
+
* `actor` is the audited subject (a stable `PlatformActorId` per builder user — the
|
|
94
|
+
* admin log names WHO acted, §4.4, and a builder is as nameable as staff). `tenantId`
|
|
95
|
+
* is the SELECTED tenant they act for; ownership authz is `vertical.ownerTenant ===
|
|
96
|
+
* tenantId`. Both are supplied by whatever resolves the session → user → tenant (the
|
|
97
|
+
* dashboard's `listIdentityTenants` narrowed to the chosen tenant), so this package
|
|
98
|
+
* holds no identity provider — the same swappable-adapter seam D-16 commits to.
|
|
99
|
+
*/
|
|
100
|
+
export interface BuilderIdentity {
|
|
101
|
+
actor: PlatformActorId;
|
|
102
|
+
tenantId: TenantId;
|
|
103
|
+
/**
|
|
104
|
+
* The owning tenant's slug — the prefix the control plane prepends to a builder's bare
|
|
105
|
+
* slug to form the vertical id `<tenantSlug>/<name>` (builder-plane.md §5). Resolved by
|
|
106
|
+
* the reader (it already looked the tenant up), so the transport never needs a second
|
|
107
|
+
* round-trip to prefix. A builder never types this; they push `--slug <name>`.
|
|
108
|
+
*/
|
|
109
|
+
tenantSlug: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resolves a request to a builder principal, or null to decline. The tenant-user
|
|
113
|
+
* counterpart of `PlatformActorAuth`. Null is not an error — it means "not a builder
|
|
114
|
+
* session", and the surface falls through to fail-closed (no staff, no builder → 401).
|
|
115
|
+
*/
|
|
116
|
+
export type BuilderAuth = (request: Request) => Promise<BuilderIdentity | null> | BuilderIdentity | null;
|
|
117
|
+
/**
|
|
118
|
+
* Who is acting on the control-plane surface, once authenticated.
|
|
119
|
+
*
|
|
120
|
+
* `staff` has cross-tenant reach (the console, service registration). `builder` is
|
|
121
|
+
* narrowed: it may only reach the vertical-management subset, and only for verticals
|
|
122
|
+
* its `tenantId` owns. The distinction is carried here, not by the actor-id brand —
|
|
123
|
+
* `actor` is just "the audited subject", staff or builder alike.
|
|
124
|
+
*/
|
|
125
|
+
export type Principal = {
|
|
126
|
+
kind: 'staff';
|
|
127
|
+
actor: PlatformActorId;
|
|
128
|
+
} | {
|
|
129
|
+
kind: 'builder';
|
|
130
|
+
actor: PlatformActorId;
|
|
131
|
+
tenantId: TenantId;
|
|
132
|
+
tenantSlug: string;
|
|
133
|
+
};
|
|
89
134
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE/F;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;AAE/G,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,iBAAiB,CAQzF;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,GAAG,KAAK,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,CAQvF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,IAAI,iBAAiB,CAO/D;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kFAAkF;AAClF,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,QAAQ,EAAE,aAAa,KACpB,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAE9D;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,kBAAkB,GAC/B,iBAAiB,CAMnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC,GAChE,kBAAkB,CAGpB;AAUD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuC,MAAM,yBAAyB,CAAC;AAkB/F,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAEnD,uFAAuF;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,KAAsB;IACpE,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC3E,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,sBAAsB,CAAC,GAAG,KAA0B;IAClE,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AA0BD;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAA+B,EAC/B,YAAgC;IAEhC,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAiE;IAEjE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACrE,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -40,7 +40,7 @@ export interface ClientProvisionScopeInput {
|
|
|
40
40
|
kind?: string;
|
|
41
41
|
name?: string;
|
|
42
42
|
vertical?: string | null;
|
|
43
|
-
jurisdiction?: 'eu' |
|
|
43
|
+
jurisdiction?: 'eu' | 'us' | 'global';
|
|
44
44
|
}
|
|
45
45
|
/** A non-2xx (or unreachable) control-plane response. `status` is 0 on a transport error. */
|
|
46
46
|
export declare class ControlPlaneError extends Error {
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,yBAAyB;IACxC,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,yBAAyB;IACxC,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;CACvC;AAED,6FAA6F;AAC7F,qBAAa,iBAAkB,SAAQ,KAAK;IAExC,QAAQ,CAAC,MAAM,EAAE,MAAM;IADzB,YACW,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IAEpD,YAAY,OAAO,EAAE,yBAAyB,EAQ7C;YAEa,IAAI;IA2BlB,YAAY,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjF;IAED,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnE;IAED,cAAc,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,KAAK,CAAC,CAE/D;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAElE;IAID,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEzD;IAED,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAE/E;IAED,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEtD;IAED;;;;;OAKG;IACG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3E;CACF"}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/deploy.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from '@substrat-run/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* The deploy seam (self-serve-deploy.md). A `substrat push` uploads a *built* worker
|
|
4
|
+
* bundle; this layer forwards it to the platform's runtime (a Workers-for-Platforms
|
|
5
|
+
* dispatch namespace) and records a **pending** version. The push is not a deploy —
|
|
6
|
+
* admission still gates serving.
|
|
7
|
+
*
|
|
8
|
+
* Two rules live here, and they are the reason an untrusted bundle can be accepted at
|
|
9
|
+
* all:
|
|
10
|
+
*
|
|
11
|
+
* 1. **The platform holds the Cloudflare credential, never the builder** (D-34). The
|
|
12
|
+
* upload itself is `DeployVerticalFn`, injected by the host (the Worker holds the
|
|
13
|
+
* WfP-scoped token) so this package stays host-agnostic and unit-testable.
|
|
14
|
+
* 2. **The sandbox contract** (self-serve-deploy.md §4): a vertical gets its OWN DO
|
|
15
|
+
* classes only — never the platform's `CONTROL_PLANE` binding, cross-script reach,
|
|
16
|
+
* or a service binding to a platform worker. `assertSandboxContract` refuses an
|
|
17
|
+
* upload that declares more, *before* it reaches the namespace. That structural
|
|
18
|
+
* refusal — not inspecting minified code — is the primary defence.
|
|
19
|
+
*/
|
|
20
|
+
/** A binding the uploaded worker declares, as far as the contract check needs it. */
|
|
21
|
+
export interface DeclaredBinding {
|
|
22
|
+
type: string;
|
|
23
|
+
name: string;
|
|
24
|
+
class_name?: string;
|
|
25
|
+
script_name?: string;
|
|
26
|
+
/** For a `d1` binding: the database id — a vertical's OWN store (see the contract below). */
|
|
27
|
+
id?: string;
|
|
28
|
+
}
|
|
29
|
+
/** A built vertical, ready to upload. `modules` are the bundled ESM parts. */
|
|
30
|
+
export interface VerticalBundle {
|
|
31
|
+
entry: string;
|
|
32
|
+
compatibilityDate: string;
|
|
33
|
+
/** Runtime compat flags (e.g. `nodejs_compat`). Without these a script that imports
|
|
34
|
+
* `node:*` cannot start, and the upload is rejected — so they must travel. */
|
|
35
|
+
compatibilityFlags: string[];
|
|
36
|
+
modules: {
|
|
37
|
+
name: string;
|
|
38
|
+
content: Uint8Array;
|
|
39
|
+
contentType: string;
|
|
40
|
+
}[];
|
|
41
|
+
/** DO classes to migrate as SQLite (`new_sqlite_classes`). */
|
|
42
|
+
doClasses: string[];
|
|
43
|
+
bindings: DeclaredBinding[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Upload a built bundle to the platform runtime under `deploymentRef`. Injected by the
|
|
47
|
+
* host so the transport package never imports a Cloudflare SDK and tests use a fake.
|
|
48
|
+
*/
|
|
49
|
+
export type DeployVerticalFn = (deploymentRef: string, bundle: VerticalBundle) => Promise<void>;
|
|
50
|
+
/** The JSON part a `substrat push` sends alongside the module files. */
|
|
51
|
+
export declare const deployManifest: z.ZodObject<{
|
|
52
|
+
version: z.ZodString;
|
|
53
|
+
name: z.ZodOptional<z.ZodString>;
|
|
54
|
+
entry: z.ZodString;
|
|
55
|
+
compatibilityDate: z.ZodString;
|
|
56
|
+
compatibilityFlags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
57
|
+
doClasses: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
58
|
+
bindings: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
59
|
+
type: z.ZodString;
|
|
60
|
+
name: z.ZodString;
|
|
61
|
+
class_name: z.ZodOptional<z.ZodString>;
|
|
62
|
+
script_name: z.ZodOptional<z.ZodString>;
|
|
63
|
+
id: z.ZodOptional<z.ZodString>;
|
|
64
|
+
}, z.core.$strip>>>;
|
|
65
|
+
digests: z.ZodObject<{
|
|
66
|
+
manifest: z.ZodString;
|
|
67
|
+
permission: z.ZodString;
|
|
68
|
+
migration: z.ZodString;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
export type DeployManifest = z.infer<typeof deployManifest>;
|
|
72
|
+
/**
|
|
73
|
+
* The §4 sandbox contract. Throws (mapped to a 4xx by errors.ts via "deploy refused")
|
|
74
|
+
* if the declared bindings would give the vertical reach into platform infrastructure.
|
|
75
|
+
*
|
|
76
|
+
* What it REFUSES is the platform's own infrastructure: the `CONTROL_PLANE` directory,
|
|
77
|
+
* a service binding to a platform worker, and any DO binding that is not one of the
|
|
78
|
+
* vertical's own classes (cross-script, or a class it didn't declare). Everything a
|
|
79
|
+
* vertical legitimately owns falls through and is allowed — its own `ScopeDO`, and its
|
|
80
|
+
* own data stores like a `d1` binding for a Better-Auth `AUTH_DB` (self-serve-deploy.md
|
|
81
|
+
* §4: "no `AUTH_DB` it did not create", i.e. its OWN store is fine).
|
|
82
|
+
*
|
|
83
|
+
* Open question (§4, model B): a `d1` binding names a `database_id`, and this check does
|
|
84
|
+
* not yet prove the vertical *owns* that id rather than pointing at another tenant's DB.
|
|
85
|
+
* Under model B that gap is closed by human admission — a person trusts the builder's
|
|
86
|
+
* declared bindings before the version can serve — not by this structural check. When
|
|
87
|
+
* self-serve opens wider, per-vertical store PROVISIONING (the platform mints the D1 and
|
|
88
|
+
* injects the id) replaces a bundle-chosen id; that is a deploy-pipeline change, not here.
|
|
89
|
+
*/
|
|
90
|
+
export declare function assertSandboxContract(m: DeployManifest): void;
|
|
91
|
+
/**
|
|
92
|
+
* The dispatch script name a version deploys under, and what the router will dispatch
|
|
93
|
+
* on (orchestration.md §5.3). Keyed on the version's ULID rather than the `@version`
|
|
94
|
+
* label the RFC sketched, because **it is a Cloudflare Worker script name** — no `@`
|
|
95
|
+
* or `.`, only `[a-z0-9_-]`. A lowercased ULID is valid by construction and unique per
|
|
96
|
+
* version; the human-readable label lives on the version record's `version` field.
|
|
97
|
+
*
|
|
98
|
+
* A builder-owned vertical's slug is `<tenant>/<name>` (builder-plane.md) — the `/` is
|
|
99
|
+
* not script-name-safe, so it (and any other stray char) is flattened to `-`. A bare
|
|
100
|
+
* platform slug is unaffected (`callout-<id>`), so this is backward-compatible.
|
|
101
|
+
*/
|
|
102
|
+
export declare function deploymentRefFor(slug: string, versionId: string): string;
|
|
103
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAE5C;;;;;;;;;;;;;;;;;GAiBG;AAEH,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6FAA6F;IAC7F,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B;mFAC+E;IAC/E,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtE,8DAA8D;IAC9D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAUhG,wEAAwE;AACxE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;iBAgBzB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CA0B7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGxE"}
|
package/dist/deploy.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from '@substrat-run/contracts';
|
|
2
|
+
const declaredBinding = z.object({
|
|
3
|
+
type: z.string().min(1),
|
|
4
|
+
name: z.string().min(1),
|
|
5
|
+
class_name: z.string().optional(),
|
|
6
|
+
script_name: z.string().optional(),
|
|
7
|
+
id: z.string().optional(),
|
|
8
|
+
});
|
|
9
|
+
/** The JSON part a `substrat push` sends alongside the module files. */
|
|
10
|
+
export const deployManifest = z.object({
|
|
11
|
+
version: z.string().min(1),
|
|
12
|
+
/** Display name for a first-time register; defaults to the slug. */
|
|
13
|
+
name: z.string().min(1).optional(),
|
|
14
|
+
/** Filename of the main module among the uploaded parts. */
|
|
15
|
+
entry: z.string().min(1),
|
|
16
|
+
compatibilityDate: z.string().min(1),
|
|
17
|
+
compatibilityFlags: z.array(z.string().min(1)).default([]),
|
|
18
|
+
doClasses: z.array(z.string().min(1)).default([]),
|
|
19
|
+
bindings: z.array(declaredBinding).default([]),
|
|
20
|
+
/** Computed by the builder's toolchain; what the promotion checkpoint compares. */
|
|
21
|
+
digests: z.object({
|
|
22
|
+
manifest: z.string().min(1),
|
|
23
|
+
permission: z.string().min(1),
|
|
24
|
+
migration: z.string().min(1),
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* The §4 sandbox contract. Throws (mapped to a 4xx by errors.ts via "deploy refused")
|
|
29
|
+
* if the declared bindings would give the vertical reach into platform infrastructure.
|
|
30
|
+
*
|
|
31
|
+
* What it REFUSES is the platform's own infrastructure: the `CONTROL_PLANE` directory,
|
|
32
|
+
* a service binding to a platform worker, and any DO binding that is not one of the
|
|
33
|
+
* vertical's own classes (cross-script, or a class it didn't declare). Everything a
|
|
34
|
+
* vertical legitimately owns falls through and is allowed — its own `ScopeDO`, and its
|
|
35
|
+
* own data stores like a `d1` binding for a Better-Auth `AUTH_DB` (self-serve-deploy.md
|
|
36
|
+
* §4: "no `AUTH_DB` it did not create", i.e. its OWN store is fine).
|
|
37
|
+
*
|
|
38
|
+
* Open question (§4, model B): a `d1` binding names a `database_id`, and this check does
|
|
39
|
+
* not yet prove the vertical *owns* that id rather than pointing at another tenant's DB.
|
|
40
|
+
* Under model B that gap is closed by human admission — a person trusts the builder's
|
|
41
|
+
* declared bindings before the version can serve — not by this structural check. When
|
|
42
|
+
* self-serve opens wider, per-vertical store PROVISIONING (the platform mints the D1 and
|
|
43
|
+
* injects the id) replaces a bundle-chosen id; that is a deploy-pipeline change, not here.
|
|
44
|
+
*/
|
|
45
|
+
export function assertSandboxContract(m) {
|
|
46
|
+
const own = new Set(m.doClasses);
|
|
47
|
+
for (const b of m.bindings) {
|
|
48
|
+
if (b.name === 'CONTROL_PLANE') {
|
|
49
|
+
throw new Error(`deploy refused: binding 'CONTROL_PLANE' is the platform's directory, not a vertical's`);
|
|
50
|
+
}
|
|
51
|
+
if (b.type === 'service') {
|
|
52
|
+
throw new Error(`deploy refused: service binding '${b.name}' — a vertical reaches the platform through the router (K-27), never a binding`);
|
|
53
|
+
}
|
|
54
|
+
if (b.type === 'durable_object_namespace') {
|
|
55
|
+
if (b.script_name) {
|
|
56
|
+
throw new Error(`deploy refused: cross-script DO binding '${b.name}' (script '${b.script_name}') — a vertical may bind only its OWN DO classes`);
|
|
57
|
+
}
|
|
58
|
+
if (b.class_name && !own.has(b.class_name)) {
|
|
59
|
+
throw new Error(`deploy refused: DO binding '${b.name}' → '${b.class_name}', not one of the vertical's own classes [${m.doClasses.join(', ') || 'none'}]`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The dispatch script name a version deploys under, and what the router will dispatch
|
|
66
|
+
* on (orchestration.md §5.3). Keyed on the version's ULID rather than the `@version`
|
|
67
|
+
* label the RFC sketched, because **it is a Cloudflare Worker script name** — no `@`
|
|
68
|
+
* or `.`, only `[a-z0-9_-]`. A lowercased ULID is valid by construction and unique per
|
|
69
|
+
* version; the human-readable label lives on the version record's `version` field.
|
|
70
|
+
*
|
|
71
|
+
* A builder-owned vertical's slug is `<tenant>/<name>` (builder-plane.md) — the `/` is
|
|
72
|
+
* not script-name-safe, so it (and any other stray char) is flattened to `-`. A bare
|
|
73
|
+
* platform slug is unaffected (`callout-<id>`), so this is backward-compatible.
|
|
74
|
+
*/
|
|
75
|
+
export function deploymentRefFor(slug, versionId) {
|
|
76
|
+
const safe = slug.toLowerCase().replace(/[^a-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');
|
|
77
|
+
return `${safe}-${versionId.toLowerCase()}`;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,yBAAyB,CAAC;AAkD5C,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC1B,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,oEAAoE;IACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,4DAA4D;IAC5D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1D,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,mFAAmF;IACnF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC;AAGH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,CAAiB;IACrD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,oCAAoC,CAAC,CAAC,IAAI,gFAAgF,CAC3H,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,4CAA4C,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,WAAW,kDAAkD,CAChI,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CACb,+BAA+B,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,UAAU,6CAA6C,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAC1I,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACtF,OAAO,GAAG,IAAI,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;AAC9C,CAAC"}
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AA+DnE,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACzB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAM/C"}
|
package/dist/errors.js
CHANGED
|
@@ -34,10 +34,28 @@ const STATUS_PATTERNS = [
|
|
|
34
34
|
[/illegal scope transition/, 409],
|
|
35
35
|
[/non-active tenant/, 409],
|
|
36
36
|
[/not active \(status:/, 409],
|
|
37
|
+
// Registry (#31): well-formed, but conflicts with a version's admission state or
|
|
38
|
+
// ownership, or needs an unacknowledged change acknowledged (the two checkpoints).
|
|
39
|
+
[/is already registered/, 409],
|
|
40
|
+
// claim-on-first-push (builder-plane.md): a slug's owner is fixed at first push.
|
|
41
|
+
// A staff re-registration under a different owner is a conflict; a builder is
|
|
42
|
+
// refused with 403 in the transport before it reaches this throw.
|
|
43
|
+
[/is owned by /, 409],
|
|
44
|
+
[/was rejected — publish a new one/, 409],
|
|
45
|
+
[/is already admitted/, 409],
|
|
46
|
+
[/belongs to '/, 409],
|
|
47
|
+
[/not admitted/, 409],
|
|
48
|
+
[/acknowledge it explicitly to promote/, 409],
|
|
49
|
+
// The §4 sandbox contract: a declared binding reaches platform infrastructure.
|
|
50
|
+
// Forbidden, not a conflict — the upload is well-formed and still refused.
|
|
51
|
+
[/deploy refused:/, 403],
|
|
37
52
|
// The ADDRESSED resource does not exist — including the K-3 fail-closed case
|
|
38
53
|
// where it exists under a DIFFERENT tenant and must read as absent.
|
|
39
54
|
[/unknown tenant:/, 404],
|
|
40
55
|
[/unknown scope for tenant/, 404],
|
|
56
|
+
[/unknown scope /, 404],
|
|
57
|
+
[/unknown vertical /, 404],
|
|
58
|
+
[/unknown version /, 404],
|
|
41
59
|
[/scope has no tenant record/, 404],
|
|
42
60
|
];
|
|
43
61
|
export function mapError(err) {
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;;;;;;;GAOG;AACH,MAAM,eAAe,GAA8C;IACjE,gFAAgF;IAChF,wEAAwE;IACxE,CAAC,6CAA6C,EAAE,GAAG,CAAC;IACpD,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,6EAA6E;IAC7E,oEAAoE;IACpE,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,4BAA4B,EAAE,GAAG,CAAC;CACpC,CAAC;AAOF,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC;AAC5D,CAAC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;;;;;;;GAOG;AACH,MAAM,eAAe,GAA8C;IACjE,gFAAgF;IAChF,wEAAwE;IACxE,CAAC,6CAA6C,EAAE,GAAG,CAAC;IACpD,CAAC,eAAe,EAAE,GAAG,CAAC;IACtB,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,sBAAsB,EAAE,GAAG,CAAC;IAC7B,iFAAiF;IACjF,mFAAmF;IACnF,CAAC,uBAAuB,EAAE,GAAG,CAAC;IAC9B,iFAAiF;IACjF,8EAA8E;IAC9E,kEAAkE;IAClE,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,kCAAkC,EAAE,GAAG,CAAC;IACzC,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAC5B,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,sCAAsC,EAAE,GAAG,CAAC;IAC7C,+EAA+E;IAC/E,2EAA2E;IAC3E,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,6EAA6E;IAC7E,oEAAoE;IACpE,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,0BAA0B,EAAE,GAAG,CAAC;IACjC,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACvB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,kBAAkB,EAAE,GAAG,CAAC;IACzB,CAAC,4BAA4B,EAAE,GAAG,CAAC;CACpC,CAAC;AAOF,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export { createControlPlaneApi } from './api.js';
|
|
2
2
|
export type { ControlPlaneApiOptions } from './api.js';
|
|
3
3
|
export { DEV_ACTOR_HEADER, SERVICE_TOKEN_HEADER, UNSAFE_devPlatformActorAuth, sessionPlatformAuth, staffAllowlist, serviceTokenAuth, firstPlatformActorAuth, } from './auth.js';
|
|
4
|
-
export type { PlatformActorAuth, StaffIdentity, StaffSessionReader, StaffActorResolver, } from './auth.js';
|
|
4
|
+
export type { PlatformActorAuth, StaffIdentity, StaffSessionReader, StaffActorResolver, BuilderIdentity, BuilderAuth, Principal, } from './auth.js';
|
|
5
5
|
export { ControlPlaneClient, ControlPlaneError } from './client.js';
|
|
6
6
|
export type { ControlPlaneClientOptions, ClientProvisionScopeInput } from './client.js';
|
|
7
7
|
export { VerticalClient } from './vertical-client.js';
|
|
8
8
|
export type { VerticalClientOptions, ProvisionInstanceInput, ProvisionedInstance, } from './vertical-client.js';
|
|
9
|
+
export { assertSandboxContract, deployManifest, deploymentRefFor } from './deploy.js';
|
|
10
|
+
export type { DeployVerticalFn, VerticalBundle, DeclaredBinding, DeployManifest } from './deploy.js';
|
|
11
|
+
export { createWfpUploader } from './wfp.js';
|
|
12
|
+
export type { WfpUploaderOptions } from './wfp.js';
|
|
9
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtF,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,4 +2,6 @@ export { createControlPlaneApi } from './api.js';
|
|
|
2
2
|
export { DEV_ACTOR_HEADER, SERVICE_TOKEN_HEADER, UNSAFE_devPlatformActorAuth, sessionPlatformAuth, staffAllowlist, serviceTokenAuth, firstPlatformActorAuth, } from './auth.js';
|
|
3
3
|
export { ControlPlaneClient, ControlPlaneError } from './client.js';
|
|
4
4
|
export { VerticalClient } from './vertical-client.js';
|
|
5
|
+
export { assertSandboxContract, deployManifest, deploymentRefFor } from './deploy.js';
|
|
6
|
+
export { createWfpUploader } from './wfp.js';
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAUnB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMtD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertical-client.d.ts","sourceRoot":"","sources":["../src/vertical-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAI9E;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"vertical-client.d.ts","sourceRoot":"","sources":["../src/vertical-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAI9E;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,qBAAqB,EAAI;IAE/D;;;;;;OAMG;IACG,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqBnF;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertical-client.js","sourceRoot":"","sources":["../src/vertical-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA4ChD,MAAM,OAAO,cAAc;IACI;
|
|
1
|
+
{"version":3,"file":"vertical-client.js","sourceRoot":"","sources":["../src/vertical-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA4ChD,MAAM,OAAO,cAAc;IACI,OAAO;IAApC,YAA6B,OAA8B;uBAA9B,OAAO;IAA0B,CAAC;IAE/D;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAA6B;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,0BAA0B,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,qBAAqB,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;aACtD;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAA8B,CAAC;YAC/E,6EAA6E;YAC7E,kFAAkF;YAClF,MAAM,IAAI,iBAAiB,CACzB,GAAG,CAAC,MAAM,EACV,IAAI,EAAE,KAAK,IAAI,kCAAkC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAChF,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;IACnD,CAAC;CACF"}
|
package/dist/wfp.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DeployVerticalFn } from './deploy.js';
|
|
2
|
+
/**
|
|
3
|
+
* A `DeployVerticalFn` that uploads a bundle into a Workers-for-Platforms **dispatch
|
|
4
|
+
* namespace** (orchestration.md §5.2). It is pure web-standard `fetch` + `FormData` —
|
|
5
|
+
* no Cloudflare SDK, no node built-ins — so it runs unchanged in a Worker (the control
|
|
6
|
+
* plane holds the token as a secret) or in node (the dev server, tests against a real
|
|
7
|
+
* namespace). The multipart shape is exactly what `wrangler deploy` sends and what the
|
|
8
|
+
* K-28 spike verified.
|
|
9
|
+
*/
|
|
10
|
+
export interface WfpUploaderOptions {
|
|
11
|
+
accountId: string;
|
|
12
|
+
namespace: string;
|
|
13
|
+
/** A Cloudflare API token with Workers Scripts / dispatch write. Platform-held. */
|
|
14
|
+
apiToken: string;
|
|
15
|
+
/**
|
|
16
|
+
* Platform-owned secrets injected as `secret_text` bindings on every pushed script —
|
|
17
|
+
* the ambient credentials a vertical needs to VERIFY inbound platform/router calls
|
|
18
|
+
* (`PLATFORM_SECRET` for `/internal/provision`, K-31; `ROUTER_SECRET` for the routed
|
|
19
|
+
* node, K-27). The vertical does not declare these (they'd fail the §4 sandbox check
|
|
20
|
+
* with no value to give); the platform provides them at deploy from its own env.
|
|
21
|
+
* Names with an undefined/empty value are skipped.
|
|
22
|
+
*/
|
|
23
|
+
injectSecrets?: Record<string, string | undefined>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createWfpUploader(opts: WfpUploaderOptions): DeployVerticalFn;
|
|
26
|
+
//# sourceMappingURL=wfp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wfp.d.ts","sourceRoot":"","sources":["../src/wfp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACpD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,CAwC5E"}
|
package/dist/wfp.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function createWfpUploader(opts) {
|
|
2
|
+
const injected = Object.entries(opts.injectSecrets ?? {})
|
|
3
|
+
.filter(([, text]) => text)
|
|
4
|
+
.map(([name, text]) => ({ type: 'secret_text', name, text: text }));
|
|
5
|
+
return async (deploymentRef, bundle) => {
|
|
6
|
+
const metadata = {
|
|
7
|
+
main_module: bundle.entry,
|
|
8
|
+
compatibility_date: bundle.compatibilityDate,
|
|
9
|
+
// Without the declared flags (e.g. `nodejs_compat`) a script importing `node:*`
|
|
10
|
+
// fails to start and the upload is rejected — carry them through.
|
|
11
|
+
compatibility_flags: bundle.compatibilityFlags,
|
|
12
|
+
// The vertical's own bindings, plus the platform's injected secrets (added here,
|
|
13
|
+
// AFTER the §4 sandbox check on the declared set — the platform is granting the
|
|
14
|
+
// vertical verification secrets, not the vertical reaching for a platform binding).
|
|
15
|
+
bindings: [...bundle.bindings, ...injected],
|
|
16
|
+
// Every Substrat scope DO is SQLite-backed (new_sqlite_classes, not new_classes).
|
|
17
|
+
migrations: { new_tag: 'v1', new_sqlite_classes: bundle.doClasses },
|
|
18
|
+
};
|
|
19
|
+
const form = new FormData();
|
|
20
|
+
form.set('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }), 'metadata.json');
|
|
21
|
+
for (const m of bundle.modules) {
|
|
22
|
+
form.set(m.name, new Blob([m.content], { type: m.contentType }), m.name);
|
|
23
|
+
}
|
|
24
|
+
const url = `https://api.cloudflare.com/client/v4/accounts/${opts.accountId}` +
|
|
25
|
+
`/workers/dispatch/namespaces/${opts.namespace}/scripts/${encodeURIComponent(deploymentRef)}`;
|
|
26
|
+
const res = await fetch(url, {
|
|
27
|
+
method: 'PUT',
|
|
28
|
+
headers: { authorization: `Bearer ${opts.apiToken}` },
|
|
29
|
+
body: form,
|
|
30
|
+
});
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
const body = await res.text().catch(() => '');
|
|
33
|
+
// Surfaced as a 502-ish deploy failure by the caller; not a sandbox refusal.
|
|
34
|
+
throw new Error(`WfP upload failed (${res.status}) for '${deploymentRef}': ${body.slice(0, 400)}`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=wfp.js.map
|
package/dist/wfp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wfp.js","sourceRoot":"","sources":["../src/wfp.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;SACtD,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAc,EAAE,CAAC,CAAC,CAAC;IAEhF,OAAO,KAAK,EAAE,aAAqB,EAAE,MAAsB,EAAE,EAAE;QAC7D,MAAM,QAAQ,GAAG;YACf,WAAW,EAAE,MAAM,CAAC,KAAK;YACzB,kBAAkB,EAAE,MAAM,CAAC,iBAAiB;YAC5C,gFAAgF;YAChF,kEAAkE;YAClE,mBAAmB,EAAE,MAAM,CAAC,kBAAkB;YAC9C,iFAAiF;YACjF,gFAAgF;YAChF,oFAAoF;YACpF,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC;YAC3C,kFAAkF;YAClF,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,SAAS,EAAE;SACpE,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QAC1G,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,GAAG,GACP,iDAAiD,IAAI,CAAC,SAAS,EAAE;YACjE,gCAAgC,IAAI,CAAC,SAAS,YAAY,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;QAChG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE;YACrD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,6EAA6E;YAC7E,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,UAAU,aAAa,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@substrat-run/control-plane-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "HTTP surface over HostAdmin — the audited control-plane transport (control-plane.md §4.5)",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"repository": {
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"hono": "^4.6.0",
|
|
26
|
-
"@substrat-run/contracts": "^0.
|
|
27
|
-
"@substrat-run/kernel": "^0.
|
|
26
|
+
"@substrat-run/contracts": "^0.12.0",
|
|
27
|
+
"@substrat-run/kernel": "^0.12.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@hono/node-server": "^1.13.0",
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
"better-sqlite3": "^12.0.0",
|
|
34
34
|
"hono": "^4.6.0",
|
|
35
35
|
"tsx": "^4.19.0",
|
|
36
|
-
"typescript": "^
|
|
36
|
+
"typescript": "^7.0.0",
|
|
37
37
|
"vitest": "^3.0.0",
|
|
38
|
-
"@substrat-run/adapter-sqlite": "^0.
|
|
38
|
+
"@substrat-run/adapter-sqlite": "^0.12.0"
|
|
39
39
|
},
|
|
40
40
|
"publishConfig": {
|
|
41
41
|
"access": "public"
|