@nimbus-sh/worker 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_shared/preview-host.d.ts +26 -8
- package/dist/_shared/preview-host.d.ts.map +1 -1
- package/dist/_shared/preview-host.js +51 -11
- package/dist/facets/durable-images.d.ts +9 -0
- package/dist/facets/durable-images.d.ts.map +1 -1
- package/dist/facets/durable-images.js +20 -1
- package/dist/facets/durable-slots.d.ts +1 -1
- package/dist/facets/durable-slots.d.ts.map +1 -1
- package/dist/facets/durable-slots.js +2 -1
- package/dist/facets/manager.d.ts +98 -15
- package/dist/facets/manager.d.ts.map +1 -1
- package/dist/facets/manager.js +443 -116
- package/dist/facets/resident-identity.d.ts +23 -0
- package/dist/facets/resident-identity.d.ts.map +1 -0
- package/dist/facets/resident-identity.js +31 -0
- package/dist/git/commands.d.ts +0 -1
- package/dist/git/commands.d.ts.map +1 -1
- package/dist/git/commands.js +0 -3
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +47 -10
- package/dist/router/public-directory.d.ts +5 -1
- package/dist/router/public-directory.d.ts.map +1 -1
- package/dist/router/public-directory.js +9 -2
- package/dist/router/remote-api.d.ts +18 -0
- package/dist/router/remote-api.d.ts.map +1 -1
- package/dist/router/remote-api.js +33 -4
- package/dist/runtime/cpython-resident.d.ts.map +1 -1
- package/dist/runtime/cpython-resident.js +3 -1
- package/dist/runtime/package-manager.d.ts +44 -1
- package/dist/runtime/package-manager.d.ts.map +1 -1
- package/dist/runtime/package-manager.js +168 -3
- package/dist/runtime/ruby-resident.d.ts.map +1 -1
- package/dist/runtime/ruby-resident.js +2 -0
- package/dist/session/agent.d.ts.map +1 -1
- package/dist/session/agent.js +28 -1
- package/dist/session/init.d.ts.map +1 -1
- package/dist/session/init.js +9 -0
- package/dist/session/keys.d.ts +4 -0
- package/dist/session/keys.d.ts.map +1 -1
- package/dist/session/keys.js +4 -0
- package/dist/session/nimbus-session.d.ts +34 -1
- package/dist/session/nimbus-session.d.ts.map +1 -1
- package/dist/session/nimbus-session.js +71 -10
- package/dist/session/port-capability.d.ts +46 -0
- package/dist/session/port-capability.d.ts.map +1 -1
- package/dist/session/port-capability.js +109 -9
- package/dist/session/programmatic.d.ts +95 -1
- package/dist/session/programmatic.d.ts.map +1 -1
- package/dist/session/programmatic.js +350 -26
- package/dist/session/routes.d.ts +9 -0
- package/dist/session/routes.d.ts.map +1 -1
- package/dist/session/routes.js +27 -2
- package/dist/session/rpc.d.ts +24 -1
- package/dist/session/rpc.d.ts.map +1 -1
- package/dist/session/rpc.js +51 -94
- package/dist/session/supervisor-op.d.ts +41 -4
- package/dist/session/supervisor-op.d.ts.map +1 -1
- package/dist/session/supervisor-op.js +95 -73
- package/dist/session/supervisor-rpc.d.ts.map +1 -1
- package/dist/session/supervisor-rpc.js +2 -3
- package/package.json +4 -4
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* facets/resident-identity.ts — the derived identity of an ordinary resident.
|
|
3
|
+
*
|
|
4
|
+
* A durable application used to be whatever an embedder reserved a port for.
|
|
5
|
+
* Under the universal model every resident has an identity from the moment
|
|
6
|
+
* it is spawned, derived from what the user typed: the working directory
|
|
7
|
+
* and the argv. Two spawns of `node server.js` from the same directory are
|
|
8
|
+
* the same application — before, after and across a supervisor reset — and
|
|
9
|
+
* that is what a lazily created reservation binds to.
|
|
10
|
+
*
|
|
11
|
+
* The environment is deliberately NOT an input: a rotated secret, a changed
|
|
12
|
+
* `PORT`, a different `TERM` must not turn one application into another.
|
|
13
|
+
*
|
|
14
|
+
* The derived form is namespaced (`auto:`) so it can never collide with an
|
|
15
|
+
* ordinary caller-chosen owner. Reservation policy is NOT inferred from
|
|
16
|
+
* this prefix: the reservation's persisted explicit/derived kind determines
|
|
17
|
+
* whether its first binder adopts an owner or must already match it.
|
|
18
|
+
*/
|
|
19
|
+
export declare const DERIVED_OWNER_PREFIX = "auto:";
|
|
20
|
+
/** `auto:` + the first 24 hex of sha256(cwd ++ NUL ++ argv.join(NUL)). */
|
|
21
|
+
export declare function deriveResidentOwner(cwd: string, argv: readonly string[]): Promise<string>;
|
|
22
|
+
export declare function isDerivedOwner(owner: string): boolean;
|
|
23
|
+
//# sourceMappingURL=resident-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resident-identity.d.ts","sourceRoot":"","sources":["../../src/facets/resident-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C,0EAA0E;AAC1E,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* facets/resident-identity.ts — the derived identity of an ordinary resident.
|
|
3
|
+
*
|
|
4
|
+
* A durable application used to be whatever an embedder reserved a port for.
|
|
5
|
+
* Under the universal model every resident has an identity from the moment
|
|
6
|
+
* it is spawned, derived from what the user typed: the working directory
|
|
7
|
+
* and the argv. Two spawns of `node server.js` from the same directory are
|
|
8
|
+
* the same application — before, after and across a supervisor reset — and
|
|
9
|
+
* that is what a lazily created reservation binds to.
|
|
10
|
+
*
|
|
11
|
+
* The environment is deliberately NOT an input: a rotated secret, a changed
|
|
12
|
+
* `PORT`, a different `TERM` must not turn one application into another.
|
|
13
|
+
*
|
|
14
|
+
* The derived form is namespaced (`auto:`) so it can never collide with an
|
|
15
|
+
* ordinary caller-chosen owner. Reservation policy is NOT inferred from
|
|
16
|
+
* this prefix: the reservation's persisted explicit/derived kind determines
|
|
17
|
+
* whether its first binder adopts an owner or must already match it.
|
|
18
|
+
*/
|
|
19
|
+
export const DERIVED_OWNER_PREFIX = 'auto:';
|
|
20
|
+
/** `auto:` + the first 24 hex of sha256(cwd ++ NUL ++ argv.join(NUL)). */
|
|
21
|
+
export async function deriveResidentOwner(cwd, argv) {
|
|
22
|
+
const material = new TextEncoder().encode(`${cwd}\0${argv.join('\0')}`);
|
|
23
|
+
const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', material));
|
|
24
|
+
let hex = '';
|
|
25
|
+
for (const byte of digest)
|
|
26
|
+
hex += byte.toString(16).padStart(2, '0');
|
|
27
|
+
return `${DERIVED_OWNER_PREFIX}${hex.slice(0, 24)}`;
|
|
28
|
+
}
|
|
29
|
+
export function isDerivedOwner(owner) {
|
|
30
|
+
return owner.startsWith(DERIVED_OWNER_PREFIX);
|
|
31
|
+
}
|
package/dist/git/commands.d.ts
CHANGED
|
@@ -39,7 +39,6 @@ export declare const CLONE_USAGE = "usage: git clone [--depth <n>] [--no-shallow
|
|
|
39
39
|
* "blobless" clone that was not blobless.
|
|
40
40
|
*/
|
|
41
41
|
export declare function parseCloneArgs(args: string[]): ParsedCloneArgs;
|
|
42
|
-
export declare function registerGitCommands(registry: any, vfs: SqliteVFS, doCtx?: DurableObjectState, doEnv?: any): void;
|
|
43
42
|
/**
|
|
44
43
|
* The `git` command handler. Split out from registration so it can be
|
|
45
44
|
* lazy-loaded (`await import('./commands.js')`) on first `git` use, keeping
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/git/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,yCAAyC,CAAC;AA8JvF,KAAK,GAAG,GAAG;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnC,MAAM,EAAE;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B,CAAC;AAaF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,eAAO,MAAM,WAAW,mGAC0E,CAAC;AAEnG;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA4C9D;AAWD
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/git/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,yCAAyC,CAAC;AA8JvF,KAAK,GAAG,GAAG;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnC,MAAM,EAAE;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B,CAAC;AAaF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,eAAO,MAAM,WAAW,mGAC0E,CAAC;AAEnG;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA4C9D;AAWD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,SAAS,EACd,KAAK,CAAC,EAAE,kBAAkB,EAC1B,KAAK,CAAC,EAAE,GAAG,GACV,OAAO,CAAC,MAAM,CAAC,CA0bjB"}
|
package/dist/git/commands.js
CHANGED
|
@@ -245,9 +245,6 @@ function getAuthor(ctx) {
|
|
|
245
245
|
};
|
|
246
246
|
}
|
|
247
247
|
// ── Git subcommand implementations ──────────────────────────────────────
|
|
248
|
-
export function registerGitCommands(registry, vfs, doCtx, doEnv) {
|
|
249
|
-
registry.register('git', (ctx) => runGitCommand(ctx, vfs, doCtx, doEnv));
|
|
250
|
-
}
|
|
251
248
|
/**
|
|
252
249
|
* The `git` command handler. Split out from registration so it can be
|
|
253
250
|
* lazy-loaded (`await import('./commands.js')`) on first `git` use, keeping
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAuCH,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAuCH,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AA+CzB,YAAY,EACV,YAAY,IAAI,eAAe,EAC/B,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,GAAG,EAAE,GAAG,CAAC;CACV;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;OAGG;IACH,YAAY,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErD,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,gBAAgB,KAClB,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAEhD,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,oCAAoC;IACpC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,yEAAyE;IACzE,GAAG,CAAC,EAAE,qBAAqB,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,0BAA+B,GACvC,aAAa,CAoWf"}
|
package/dist/router/index.js
CHANGED
|
@@ -50,21 +50,30 @@ const publicTenantCache = new Map();
|
|
|
50
50
|
* The tenant segment a public capability URL forwards under. The directory
|
|
51
51
|
* is consulted first; a deployment without the binding falls back to the
|
|
52
52
|
* legacy-public DO name, which is where legacy-mode sessions already live.
|
|
53
|
+
* The directory row also carries the port and name the capability was
|
|
54
|
+
* bound with, which is what the `<cap>--<name>--<sid>` form resolves and
|
|
55
|
+
* verifies against.
|
|
53
56
|
*/
|
|
54
|
-
async function
|
|
57
|
+
async function resolvePublicCapability(capability, env, uncached = false) {
|
|
55
58
|
const cached = publicTenantCache.get(capability);
|
|
56
|
-
if (cached !== undefined)
|
|
59
|
+
if (!uncached && cached !== undefined)
|
|
57
60
|
return cached;
|
|
58
61
|
const stub = publicDirectoryStub(env);
|
|
59
62
|
if (stub === null)
|
|
60
|
-
return LEGACY_PUBLIC_DO_SEGMENT;
|
|
63
|
+
return { tenantSegment: LEGACY_PUBLIC_DO_SEGMENT, port: null, name: null };
|
|
61
64
|
const entry = await stub.resolve(capability).catch(() => null);
|
|
62
65
|
if (entry === null) {
|
|
63
66
|
// An unresolvable capability 404s: no session DO is named for it.
|
|
67
|
+
publicTenantCache.delete(capability);
|
|
64
68
|
return null;
|
|
65
69
|
}
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
const resolved = {
|
|
71
|
+
tenantSegment: entry.tenantSegment,
|
|
72
|
+
port: entry.port,
|
|
73
|
+
name: entry.name ?? null,
|
|
74
|
+
};
|
|
75
|
+
publicTenantCache.set(capability, resolved);
|
|
76
|
+
return resolved;
|
|
68
77
|
}
|
|
69
78
|
/**
|
|
70
79
|
* Build a Nimbus default-export handler. The returned object is exactly
|
|
@@ -138,16 +147,38 @@ export function createNimbusHandler(options = {}) {
|
|
|
138
147
|
// directory — a positive hit is cached for the life of this
|
|
139
148
|
// isolate, a miss 404s, and a deployment without the binding
|
|
140
149
|
// falls back to the legacy-public DO name.
|
|
141
|
-
|
|
142
|
-
|
|
150
|
+
let resolved = await resolvePublicCapability(preview.capability, env);
|
|
151
|
+
const matchesHost = (entry) => entry !== null && (preview.name !== undefined
|
|
152
|
+
? entry.name === preview.name && entry.port !== null
|
|
153
|
+
: entry.port === null || entry.port === preview.port);
|
|
154
|
+
// Rename/rebinding can leave a positive isolate cache entry behind.
|
|
155
|
+
// Verify BOTH host forms, and read through once before refusing.
|
|
156
|
+
if (resolved !== null && !matchesHost(resolved)) {
|
|
157
|
+
resolved = await resolvePublicCapability(preview.capability, env, true);
|
|
158
|
+
}
|
|
159
|
+
if (resolved === null || !matchesHost(resolved)) {
|
|
143
160
|
return new Response('Not found', { status: 404 });
|
|
144
161
|
}
|
|
162
|
+
// The name form is resolved by capability like the port form, then
|
|
163
|
+
// the name is verified against the directory row: a capability
|
|
164
|
+
// presented under a name it was not bound with is a 404, never a
|
|
165
|
+
// guess at some other application.
|
|
166
|
+
let port;
|
|
167
|
+
if (preview.name !== undefined) {
|
|
168
|
+
if (resolved.name !== preview.name || resolved.port === null) {
|
|
169
|
+
return new Response('Not found', { status: 404 });
|
|
170
|
+
}
|
|
171
|
+
port = resolved.port;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
port = preview.port;
|
|
175
|
+
}
|
|
145
176
|
return forwardToSession(request, {
|
|
146
177
|
sessionId: preview.sid,
|
|
147
|
-
innerPath: `/port/${
|
|
178
|
+
innerPath: `/port/${port}${url.pathname === '/' ? '/' : url.pathname}`,
|
|
148
179
|
basePath: '',
|
|
149
180
|
}, env, {
|
|
150
|
-
tenantSegment,
|
|
181
|
+
tenantSegment: resolved.tenantSegment,
|
|
151
182
|
extraHeaders: {
|
|
152
183
|
[PREVIEW_CAPABILITY_HEADER]: preview.capability,
|
|
153
184
|
[PUBLIC_BEARER_HEADER]: '1',
|
|
@@ -172,9 +203,15 @@ export function createNimbusHandler(options = {}) {
|
|
|
172
203
|
});
|
|
173
204
|
if (auth instanceof Response)
|
|
174
205
|
return auth;
|
|
206
|
+
// The scoped name form is resolved INSIDE the session — the name is
|
|
207
|
+
// a reservation alias only that session's records know — so it is
|
|
208
|
+
// forwarded as `/app/<name>/`, the session's own name-addressed door.
|
|
209
|
+
const scopedInner = preview.name !== undefined
|
|
210
|
+
? `/app/${preview.name}`
|
|
211
|
+
: `/port/${preview.port}`;
|
|
175
212
|
return forwardToSession(request, {
|
|
176
213
|
sessionId: preview.sid,
|
|
177
|
-
innerPath:
|
|
214
|
+
innerPath: `${scopedInner}${url.pathname === '/' ? '/' : url.pathname}`,
|
|
178
215
|
basePath: '',
|
|
179
216
|
}, env, { tenantSegment: auth.tenantSegment });
|
|
180
217
|
}
|
|
@@ -14,6 +14,9 @@ export interface PublicDirectoryEntry {
|
|
|
14
14
|
readonly tenantSegment: string;
|
|
15
15
|
readonly sid: string;
|
|
16
16
|
readonly port: number;
|
|
17
|
+
/** The reservation's name alias, when the capability was bound with one —
|
|
18
|
+
* what the `<cap>--<name>--<sid>` host form is verified against. */
|
|
19
|
+
readonly name?: string;
|
|
17
20
|
}
|
|
18
21
|
/** The DO body, usable with any `{ storage }` the tests hand it. */
|
|
19
22
|
export declare class PublicDirectoryStore {
|
|
@@ -29,6 +32,7 @@ export declare class PublicDirectoryStore {
|
|
|
29
32
|
tenantSegment: string;
|
|
30
33
|
sid: string;
|
|
31
34
|
port: number;
|
|
35
|
+
name?: string;
|
|
32
36
|
}): Promise<void>;
|
|
33
37
|
unbind(capability: string): Promise<void>;
|
|
34
38
|
resolve(capability: string): Promise<PublicDirectoryEntry | null>;
|
|
@@ -60,7 +64,7 @@ export declare function bindPublicPortCapability(host: {
|
|
|
60
64
|
};
|
|
61
65
|
tenantSegment?: string;
|
|
62
66
|
sessionId?: string;
|
|
63
|
-
}, capability: string, port: number): Promise<void>;
|
|
67
|
+
}, capability: string, port: number, name?: string): Promise<void>;
|
|
64
68
|
/** Retire a public port's capability from the routing directory. */
|
|
65
69
|
export declare function unbindPublicPortCapability(host: {
|
|
66
70
|
env?: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-directory.d.ts","sourceRoot":"","sources":["../../src/router/public-directory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"public-directory.d.ts","sourceRoot":"","sources":["../../src/router/public-directory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;yEACqE;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,oEAAoE;AACpE,qBAAa,oBAAoB;IACnB,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE;QAAE,OAAO,EAAE;YAClC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;YACtD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;SACvC,CAAA;KAAE;IAEG,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACzE,OAAO,CAAC,IAAI,CAAC;IAoBV,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;CAKxE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG;IACjD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;CACnE,GAAG,IAAI,CAUP;AA6BD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACtG,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,oEAAoE;AACpE,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACtG,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -31,10 +31,14 @@ export class PublicDirectoryStore {
|
|
|
31
31
|
|| !Number.isInteger(entry.port) || entry.port < 1 || entry.port > 65535) {
|
|
32
32
|
throw new Error('NimbusPublicDirectory.bind: entry needs tenantSegment, sid, and a real port');
|
|
33
33
|
}
|
|
34
|
+
if (entry.name !== undefined && !/^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/.test(entry.name)) {
|
|
35
|
+
throw new Error('NimbusPublicDirectory.bind: name must be one DNS label');
|
|
36
|
+
}
|
|
34
37
|
await this.ctx.storage.put(rowKey(capability), {
|
|
35
38
|
tenantSegment: entry.tenantSegment,
|
|
36
39
|
sid: entry.sid,
|
|
37
40
|
port: entry.port,
|
|
41
|
+
...(entry.name !== undefined ? { name: entry.name } : {}),
|
|
38
42
|
});
|
|
39
43
|
}
|
|
40
44
|
async unbind(capability) {
|
|
@@ -87,7 +91,7 @@ function sessionIdentity(host) {
|
|
|
87
91
|
* on a non-legacy deployment is a loud error: the exposure would be half-
|
|
88
92
|
* public — stored as public, unroutable in practice.
|
|
89
93
|
*/
|
|
90
|
-
export async function bindPublicPortCapability(host, capability, port) {
|
|
94
|
+
export async function bindPublicPortCapability(host, capability, port, name) {
|
|
91
95
|
const identity = sessionIdentity(host);
|
|
92
96
|
if (identity === null)
|
|
93
97
|
return;
|
|
@@ -99,7 +103,10 @@ export async function bindPublicPortCapability(host, capability, port) {
|
|
|
99
103
|
+ '— without it the capability URL cannot resolve to this session. '
|
|
100
104
|
+ 'Add the binding and the NimbusPublicDirectory migration to wrangler.jsonc.');
|
|
101
105
|
}
|
|
102
|
-
await stub.bind(capability, {
|
|
106
|
+
await stub.bind(capability, {
|
|
107
|
+
tenantSegment: identity.tenantSegment, sid: identity.sid, port,
|
|
108
|
+
...(name !== undefined ? { name } : {}),
|
|
109
|
+
});
|
|
103
110
|
}
|
|
104
111
|
/** Retire a public port's capability from the routing directory. */
|
|
105
112
|
export async function unbindPublicPortCapability(host, capability) {
|
|
@@ -83,6 +83,7 @@ interface NimbusSessionRpcStub {
|
|
|
83
83
|
_rpcListPorts(): Promise<unknown>;
|
|
84
84
|
_rpcExposePort(port: number, options?: {
|
|
85
85
|
visibility?: 'scoped' | 'public';
|
|
86
|
+
name?: string;
|
|
86
87
|
}): Promise<unknown>;
|
|
87
88
|
_rpcEnsureDurableApp(input: {
|
|
88
89
|
owner?: string;
|
|
@@ -90,9 +91,26 @@ interface NimbusSessionRpcStub {
|
|
|
90
91
|
visibility?: 'scoped' | 'public';
|
|
91
92
|
}): Promise<unknown>;
|
|
92
93
|
_rpcRemoveDurableApp(owner: string): Promise<unknown>;
|
|
94
|
+
_rpcExposeApp(target: RemoteAppTarget, options?: {
|
|
95
|
+
visibility?: 'scoped' | 'public';
|
|
96
|
+
name?: string;
|
|
97
|
+
}): Promise<unknown>;
|
|
98
|
+
_rpcListApps(): Promise<unknown>;
|
|
99
|
+
_rpcRotateLink(target: RemoteAppTarget): Promise<unknown>;
|
|
100
|
+
_rpcRemoveApp(target: RemoteAppTarget): Promise<unknown>;
|
|
93
101
|
_rpcUnexposePort(port: number): Promise<unknown>;
|
|
94
102
|
_rpcDestroy(options?: Record<string, unknown>): Promise<unknown>;
|
|
95
103
|
}
|
|
104
|
+
/** An app target on the wire: a port, a pid, a name/owner, or the explicit object forms. */
|
|
105
|
+
type RemoteAppTarget = number | string | {
|
|
106
|
+
port: number;
|
|
107
|
+
} | {
|
|
108
|
+
pid: number;
|
|
109
|
+
} | {
|
|
110
|
+
name: string;
|
|
111
|
+
} | {
|
|
112
|
+
owner: string;
|
|
113
|
+
};
|
|
96
114
|
interface NimbusSessionNamespace {
|
|
97
115
|
idFromName(name: string): DurableObjectId;
|
|
98
116
|
get(id: DurableObjectId): NimbusSessionRpcStub;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-api.d.ts","sourceRoot":"","sources":["../../src/router/remote-api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"remote-api.d.ts","sourceRoot":"","sources":["../../src/router/remote-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -223,11 +223,18 @@ async function dispatchRemoteRpc(ctx) {
|
|
|
223
223
|
return ctx.stub._rpcListPorts();
|
|
224
224
|
case 'exposePort': {
|
|
225
225
|
const options = args[1] === undefined ? undefined : objectArg(args[1]);
|
|
226
|
-
return ctx.stub._rpcExposePort(numberArg(args[0], 'port'), options === undefined ? undefined :
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
226
|
+
return ctx.stub._rpcExposePort(numberArg(args[0], 'port'), options === undefined ? undefined : exposeOptions(options));
|
|
227
|
+
}
|
|
228
|
+
case 'exposeApp': {
|
|
229
|
+
const options = args[1] === undefined ? undefined : objectArg(args[1]);
|
|
230
|
+
return ctx.stub._rpcExposeApp(appTargetArg(args[0]), options === undefined ? undefined : exposeOptions(options));
|
|
230
231
|
}
|
|
232
|
+
case 'listApps':
|
|
233
|
+
return ctx.stub._rpcListApps();
|
|
234
|
+
case 'rotateLink':
|
|
235
|
+
return ctx.stub._rpcRotateLink(appTargetArg(args[0]));
|
|
236
|
+
case 'removeApp':
|
|
237
|
+
return ctx.stub._rpcRemoveApp(appTargetArg(args[0]));
|
|
231
238
|
case 'ensureDurableApp': {
|
|
232
239
|
const input = objectArg(args[0]);
|
|
233
240
|
return ctx.stub._rpcEnsureDurableApp({
|
|
@@ -249,6 +256,28 @@ async function dispatchRemoteRpc(ctx) {
|
|
|
249
256
|
throw apiError(`Unknown Nimbus sandbox operation: ${String(op)}`, 'E_REMOTE_OP', 400);
|
|
250
257
|
}
|
|
251
258
|
}
|
|
259
|
+
function exposeOptions(options) {
|
|
260
|
+
return {
|
|
261
|
+
...(options.visibility === undefined ? {} : { visibility: options.visibility === 'public' ? 'public' : 'scoped' }),
|
|
262
|
+
...(options.name === undefined ? {} : { name: stringArg(options.name, 'name') }),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function appTargetArg(value) {
|
|
266
|
+
if (typeof value === 'number')
|
|
267
|
+
return numberArg(value, 'target');
|
|
268
|
+
if (typeof value === 'string')
|
|
269
|
+
return stringArg(value, 'target');
|
|
270
|
+
const target = objectArg(value);
|
|
271
|
+
if (target.port !== undefined)
|
|
272
|
+
return { port: numberArg(target.port, 'port') };
|
|
273
|
+
if (target.pid !== undefined)
|
|
274
|
+
return { pid: numberArg(target.pid, 'pid') };
|
|
275
|
+
if (target.name !== undefined)
|
|
276
|
+
return { name: stringArg(target.name, 'name') };
|
|
277
|
+
if (target.owner !== undefined)
|
|
278
|
+
return { owner: stringArg(target.owner, 'owner') };
|
|
279
|
+
throw apiError('Nimbus app target must be a port, a pid, a name, or { port | pid | name | owner }', 'E_ARG_SHAPE', 400);
|
|
280
|
+
}
|
|
252
281
|
function requireAnyScope(ctx, scopes) {
|
|
253
282
|
const explicit = ctx.verified?.claims.scopes;
|
|
254
283
|
if (explicit === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cpython-resident.d.ts","sourceRoot":"","sources":["../../src/runtime/cpython-resident.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwDxE;AAeD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,oBAAoB,
|
|
1
|
+
{"version":3,"file":"cpython-resident.d.ts","sourceRoot":"","sources":["../../src/runtime/cpython-resident.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwDxE;AAeD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,oBAAoB,CAgDjF"}
|
|
@@ -91,6 +91,8 @@ export function cpythonResidentStart(facetMgr) {
|
|
|
91
91
|
const command = args.command;
|
|
92
92
|
const workerCode = buildCPythonSocketProcessWorker(buildCPythonPreamble());
|
|
93
93
|
const spawned = await facetMgr.spawnWorker(workerCode, command, args.cwd, {
|
|
94
|
+
resident: { argv: args.argv, runtime: 'python' },
|
|
95
|
+
restart: z.object({ NIMBUS_RESTART: z.literal('on-failure') }).safeParse(args.startArgs.userEnv).success ? 'on-failure' : 'never',
|
|
94
96
|
compatibilityFlags: ['nodejs_compat'],
|
|
95
97
|
// By path, not by value: the interpreter is 10.6 MiB, more than a single
|
|
96
98
|
// RPC value may carry, so whichever host runs this process reads it itself.
|
|
@@ -106,7 +108,7 @@ export function cpythonResidentStart(facetMgr) {
|
|
|
106
108
|
}
|
|
107
109
|
const data = boot.data;
|
|
108
110
|
if (data.state === 'listening' && typeof data.port === 'number' && data.port > 0) {
|
|
109
|
-
facetMgr.registerPort(spawned.pid, data.port);
|
|
111
|
+
await facetMgr.registerPort(spawned.pid, data.port);
|
|
110
112
|
const routeable = await facetMgr.waitForRouteablePorts(spawned.pid);
|
|
111
113
|
const port = routeable.includes(data.port) ? data.port : routeable[0];
|
|
112
114
|
if (!port) {
|
|
@@ -93,9 +93,50 @@ export declare function ensureRuntimesProgrammatic(deps: {
|
|
|
93
93
|
}, specs: string[], opts?: {
|
|
94
94
|
force?: boolean;
|
|
95
95
|
}): Promise<RuntimeInstallSummary[]>;
|
|
96
|
+
/**
|
|
97
|
+
* The session's application verbs, as the shell reaches them — the SAME
|
|
98
|
+
* session methods the SDK and the Agent call (session/programmatic.ts), so
|
|
99
|
+
* there is one policy for what an exposure, a rotation or a removal is.
|
|
100
|
+
*/
|
|
101
|
+
export interface NimbusAppVerbs {
|
|
102
|
+
expose(target: number | string, options: {
|
|
103
|
+
visibility?: 'scoped' | 'public';
|
|
104
|
+
name?: string;
|
|
105
|
+
}): Promise<{
|
|
106
|
+
owner: string;
|
|
107
|
+
name: string | null;
|
|
108
|
+
port: number;
|
|
109
|
+
capability: string | null;
|
|
110
|
+
visibility: 'scoped' | 'public';
|
|
111
|
+
url: string | null;
|
|
112
|
+
}>;
|
|
113
|
+
list(): Promise<Array<{
|
|
114
|
+
owner: string;
|
|
115
|
+
name: string | null;
|
|
116
|
+
port: number | null;
|
|
117
|
+
pid: number | null;
|
|
118
|
+
status: string;
|
|
119
|
+
visibility: string;
|
|
120
|
+
restart: string;
|
|
121
|
+
diagnostic: string | null;
|
|
122
|
+
url: string | null;
|
|
123
|
+
}>>;
|
|
124
|
+
rotateLink(target: number | string): Promise<{
|
|
125
|
+
name: string | null;
|
|
126
|
+
port: number;
|
|
127
|
+
url: string | null;
|
|
128
|
+
capability: string | null;
|
|
129
|
+
}>;
|
|
130
|
+
remove(target: number | string): Promise<{
|
|
131
|
+
owner: string;
|
|
132
|
+
removed: boolean;
|
|
133
|
+
port: number | null;
|
|
134
|
+
}>;
|
|
135
|
+
}
|
|
96
136
|
/**
|
|
97
137
|
* Build the shell-command handler that implements `nimbus install …`,
|
|
98
|
-
* `nimbus uninstall
|
|
138
|
+
* `nimbus uninstall …`, `nimbus expose …`, `nimbus app …` and
|
|
139
|
+
* `nimbus start …`. Registered under the name `nimbus`.
|
|
99
140
|
*/
|
|
100
141
|
export declare function makeNimbusVerbHandler(deps: {
|
|
101
142
|
env: RuntimeCatalogEnv;
|
|
@@ -105,5 +146,7 @@ export declare function makeNimbusVerbHandler(deps: {
|
|
|
105
146
|
* caller (init.ts) from the shell env. */
|
|
106
147
|
getHome(): string;
|
|
107
148
|
warmRuntime?: RuntimeWarmHook;
|
|
149
|
+
/** The application verbs; absent on a host with no session (tests). */
|
|
150
|
+
apps?: NimbusAppVerbs;
|
|
108
151
|
}): (ctx: any) => Promise<number>;
|
|
109
152
|
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/package-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/package-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAA0C,KAAK,iBAAiB,EAAuB,MAAM,sBAAsB,CAAC;AAC3H,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,6CAA6C,CAAC;AACzG,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAA4D,KAAK,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC3I,OAAO,EAOL,KAAK,gBAAgB,EACtB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAEvF,wEAAwE;AACxE,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;IAC3F,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnC,MAAM,EAAE;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAU1F,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAmFD,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,iBAAiB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAyChI;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,iBAAiB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E,CAAC,CAAC,CAgBF;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,IAAI,MAAM,CAAC;CACnB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAuB/E;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,IAAI,MAAM,CAAC;CACnB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAMpF;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE;QAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QACrG,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5E,UAAU,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KACrD,CAAC,CAAC;IACH,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5E,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KACpG,CAAC,CAAC,CAAC;IACJ,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACnI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CACpG;AASD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B;+CAC2C;IAC3C,OAAO,IAAI,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,uEAAuE;IACvE,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAkChC"}
|