@treeseed/sdk 0.13.0-rc.60 → 0.13.0-rc.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/.treeseed-build-complete.json +1 -1
  2. package/dist/agent-capacity/validation/agent-definition-schema.d.ts +120 -120
  3. package/dist/capacity-provider/capability-ontology.d.ts +190 -190
  4. package/dist/capacity-provider/client.d.ts +3 -3
  5. package/dist/capacity-provider/core-capability-catalog.d.ts +13 -13
  6. package/dist/capacity-provider/environment-catalog.d.ts +62 -62
  7. package/dist/capacity-provider/sandbox-contracts.d.ts +66 -66
  8. package/dist/content/validation/agent-operational-content-schemas.d.ts +72 -72
  9. package/dist/content/validation/auxiliary-content-schemas.d.ts +74 -74
  10. package/dist/content/validation/content-model-schemas.d.ts +435 -435
  11. package/dist/content/validation/portable-content-data.d.ts +53 -53
  12. package/dist/deployment/ai-mode.d.ts +46 -46
  13. package/dist/deployment/schemas.d.ts +648 -648
  14. package/dist/development/schemas.d.ts +290 -290
  15. package/dist/operator-contracts/canonical-command-tree.js +10 -0
  16. package/dist/operator-contracts/catalog/capability-ontology-operations.d.ts +41 -41
  17. package/dist/operator-contracts/catalog/communication-operations.d.ts +62 -62
  18. package/dist/operator-contracts/catalog/inbox-operations.d.ts +34 -34
  19. package/dist/operator-contracts/communication/contracts.d.ts +228 -228
  20. package/dist/operator-contracts/control-plane-operations.d.ts +145 -145
  21. package/dist/operator-contracts/inbox/contracts.d.ts +108 -108
  22. package/dist/platform/contracts.d.ts +383 -0
  23. package/dist/platform/contracts.js +79 -0
  24. package/dist/platform/index.d.ts +5 -0
  25. package/dist/platform/index.js +5 -0
  26. package/dist/platform/inventory.d.ts +11 -0
  27. package/dist/platform/inventory.js +53 -0
  28. package/dist/platform/schemas.d.ts +806 -0
  29. package/dist/platform/schemas.js +68 -0
  30. package/dist/platform/verification.d.ts +9 -0
  31. package/dist/platform/verification.js +104 -0
  32. package/dist/platform/workset.d.ts +21 -0
  33. package/dist/platform/workset.js +102 -0
  34. package/dist/security/encrypted-envelope.d.ts +14 -14
  35. package/package.json +5 -1
@@ -0,0 +1,383 @@
1
+ import { z } from 'zod';
2
+ export declare const integrationComponentSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ version: z.ZodString;
5
+ commit: z.ZodString;
6
+ digest: z.ZodString;
7
+ artifact: z.ZodString;
8
+ }, "strict", z.ZodTypeAny, {
9
+ id: string;
10
+ commit: string;
11
+ version: string;
12
+ digest: string;
13
+ artifact: string;
14
+ }, {
15
+ id: string;
16
+ commit: string;
17
+ version: string;
18
+ digest: string;
19
+ artifact: string;
20
+ }>;
21
+ export declare const integrationLockSchema: z.ZodObject<{
22
+ schemaVersion: z.ZodLiteral<"treeseed.platform-integration-lock/v1">;
23
+ release: z.ZodString;
24
+ components: z.ZodArray<z.ZodObject<{
25
+ id: z.ZodString;
26
+ version: z.ZodString;
27
+ commit: z.ZodString;
28
+ digest: z.ZodString;
29
+ artifact: z.ZodString;
30
+ }, "strict", z.ZodTypeAny, {
31
+ id: string;
32
+ commit: string;
33
+ version: string;
34
+ digest: string;
35
+ artifact: string;
36
+ }, {
37
+ id: string;
38
+ commit: string;
39
+ version: string;
40
+ digest: string;
41
+ artifact: string;
42
+ }>, "many">;
43
+ digest: z.ZodString;
44
+ }, "strict", z.ZodTypeAny, {
45
+ schemaVersion: "treeseed.platform-integration-lock/v1";
46
+ digest: string;
47
+ release: string;
48
+ components: {
49
+ id: string;
50
+ commit: string;
51
+ version: string;
52
+ digest: string;
53
+ artifact: string;
54
+ }[];
55
+ }, {
56
+ schemaVersion: "treeseed.platform-integration-lock/v1";
57
+ digest: string;
58
+ release: string;
59
+ components: {
60
+ id: string;
61
+ commit: string;
62
+ version: string;
63
+ digest: string;
64
+ artifact: string;
65
+ }[];
66
+ }>;
67
+ export declare const hostTemplateSchema: z.ZodObject<{
68
+ schemaVersion: z.ZodLiteral<"treeseed.platform-host-template/v1">;
69
+ id: z.ZodString;
70
+ profiles: z.ZodArray<z.ZodString, "many">;
71
+ integration: z.ZodObject<{
72
+ id: z.ZodString;
73
+ digest: z.ZodString;
74
+ }, "strip", z.ZodTypeAny, {
75
+ id: string;
76
+ digest: string;
77
+ }, {
78
+ id: string;
79
+ digest: string;
80
+ }>;
81
+ inputs: z.ZodArray<z.ZodObject<{
82
+ name: z.ZodString;
83
+ required: z.ZodBoolean;
84
+ sensitive: z.ZodDefault<z.ZodBoolean>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ name: string;
87
+ required: boolean;
88
+ sensitive: boolean;
89
+ }, {
90
+ name: string;
91
+ required: boolean;
92
+ sensitive?: boolean | undefined;
93
+ }>, "many">;
94
+ }, "strict", z.ZodTypeAny, {
95
+ schemaVersion: "treeseed.platform-host-template/v1";
96
+ id: string;
97
+ profiles: string[];
98
+ integration: {
99
+ id: string;
100
+ digest: string;
101
+ };
102
+ inputs: {
103
+ name: string;
104
+ required: boolean;
105
+ sensitive: boolean;
106
+ }[];
107
+ }, {
108
+ schemaVersion: "treeseed.platform-host-template/v1";
109
+ id: string;
110
+ profiles: string[];
111
+ integration: {
112
+ id: string;
113
+ digest: string;
114
+ };
115
+ inputs: {
116
+ name: string;
117
+ required: boolean;
118
+ sensitive?: boolean | undefined;
119
+ }[];
120
+ }>;
121
+ export declare const projectCreatePlanSchema: z.ZodObject<{
122
+ schemaVersion: z.ZodLiteral<"treeseed.platform-project-create-plan/v1">;
123
+ slug: z.ZodString;
124
+ template: z.ZodObject<{
125
+ id: z.ZodString;
126
+ version: z.ZodString;
127
+ digest: z.ZodString;
128
+ }, "strip", z.ZodTypeAny, {
129
+ id: string;
130
+ version: string;
131
+ digest: string;
132
+ }, {
133
+ id: string;
134
+ version: string;
135
+ digest: string;
136
+ }>;
137
+ team: z.ZodString;
138
+ repository: z.ZodObject<{
139
+ owner: z.ZodString;
140
+ name: z.ZodString;
141
+ visibility: z.ZodEnum<["public", "private"]>;
142
+ }, "strip", z.ZodTypeAny, {
143
+ name: string;
144
+ owner: string;
145
+ visibility: "public" | "private";
146
+ }, {
147
+ name: string;
148
+ owner: string;
149
+ visibility: "public" | "private";
150
+ }>;
151
+ steps: z.ZodArray<z.ZodEnum<["project", "repository", "template", "library", "inventory"]>, "many">;
152
+ }, "strict", z.ZodTypeAny, {
153
+ slug: string;
154
+ schemaVersion: "treeseed.platform-project-create-plan/v1";
155
+ repository: {
156
+ name: string;
157
+ owner: string;
158
+ visibility: "public" | "private";
159
+ };
160
+ template: {
161
+ id: string;
162
+ version: string;
163
+ digest: string;
164
+ };
165
+ team: string;
166
+ steps: ("project" | "library" | "repository" | "template" | "inventory")[];
167
+ }, {
168
+ slug: string;
169
+ schemaVersion: "treeseed.platform-project-create-plan/v1";
170
+ repository: {
171
+ name: string;
172
+ owner: string;
173
+ visibility: "public" | "private";
174
+ };
175
+ template: {
176
+ id: string;
177
+ version: string;
178
+ digest: string;
179
+ };
180
+ team: string;
181
+ steps: ("project" | "library" | "repository" | "template" | "inventory")[];
182
+ }>;
183
+ export declare const projectCreateReceiptSchema: z.ZodObject<Omit<{
184
+ schemaVersion: z.ZodLiteral<"treeseed.platform-project-create-plan/v1">;
185
+ slug: z.ZodString;
186
+ template: z.ZodObject<{
187
+ id: z.ZodString;
188
+ version: z.ZodString;
189
+ digest: z.ZodString;
190
+ }, "strip", z.ZodTypeAny, {
191
+ id: string;
192
+ version: string;
193
+ digest: string;
194
+ }, {
195
+ id: string;
196
+ version: string;
197
+ digest: string;
198
+ }>;
199
+ team: z.ZodString;
200
+ repository: z.ZodObject<{
201
+ owner: z.ZodString;
202
+ name: z.ZodString;
203
+ visibility: z.ZodEnum<["public", "private"]>;
204
+ }, "strip", z.ZodTypeAny, {
205
+ name: string;
206
+ owner: string;
207
+ visibility: "public" | "private";
208
+ }, {
209
+ name: string;
210
+ owner: string;
211
+ visibility: "public" | "private";
212
+ }>;
213
+ steps: z.ZodArray<z.ZodEnum<["project", "repository", "template", "library", "inventory"]>, "many">;
214
+ }, "schemaVersion"> & {
215
+ schemaVersion: z.ZodLiteral<"treeseed.platform-project-create-receipt/v1">;
216
+ projectId: z.ZodString;
217
+ repositoryUrl: z.ZodString;
218
+ libraryBindingId: z.ZodString;
219
+ inventoryVersion: z.ZodNumber;
220
+ }, "strict", z.ZodTypeAny, {
221
+ slug: string;
222
+ schemaVersion: "treeseed.platform-project-create-receipt/v1";
223
+ repository: {
224
+ name: string;
225
+ owner: string;
226
+ visibility: "public" | "private";
227
+ };
228
+ template: {
229
+ id: string;
230
+ version: string;
231
+ digest: string;
232
+ };
233
+ team: string;
234
+ steps: ("project" | "library" | "repository" | "template" | "inventory")[];
235
+ projectId: string;
236
+ repositoryUrl: string;
237
+ libraryBindingId: string;
238
+ inventoryVersion: number;
239
+ }, {
240
+ slug: string;
241
+ schemaVersion: "treeseed.platform-project-create-receipt/v1";
242
+ repository: {
243
+ name: string;
244
+ owner: string;
245
+ visibility: "public" | "private";
246
+ };
247
+ template: {
248
+ id: string;
249
+ version: string;
250
+ digest: string;
251
+ };
252
+ team: string;
253
+ steps: ("project" | "library" | "repository" | "template" | "inventory")[];
254
+ projectId: string;
255
+ repositoryUrl: string;
256
+ libraryBindingId: string;
257
+ inventoryVersion: number;
258
+ }>;
259
+ export declare const providerRegistrationRequestSchema: z.ZodObject<{
260
+ schemaVersion: z.ZodLiteral<"treeseed.provider-registration-request/v1">;
261
+ requestId: z.ZodString;
262
+ teamId: z.ZodString;
263
+ publicKey: z.ZodString;
264
+ capabilities: z.ZodArray<z.ZodString, "many">;
265
+ state: z.ZodEnum<["pending-approval", "approved", "rejected", "revoked"]>;
266
+ createdAt: z.ZodString;
267
+ }, "strict", z.ZodTypeAny, {
268
+ schemaVersion: "treeseed.provider-registration-request/v1";
269
+ requestId: string;
270
+ teamId: string;
271
+ publicKey: string;
272
+ capabilities: string[];
273
+ state: "pending-approval" | "approved" | "rejected" | "revoked";
274
+ createdAt: string;
275
+ }, {
276
+ schemaVersion: "treeseed.provider-registration-request/v1";
277
+ requestId: string;
278
+ teamId: string;
279
+ publicKey: string;
280
+ capabilities: string[];
281
+ state: "pending-approval" | "approved" | "rejected" | "revoked";
282
+ createdAt: string;
283
+ }>;
284
+ export declare const providerSessionSchema: z.ZodObject<{
285
+ schemaVersion: z.ZodLiteral<"treeseed.provider-session/v1">;
286
+ providerId: z.ZodString;
287
+ scope: z.ZodArray<z.ZodString, "many">;
288
+ issuedAt: z.ZodString;
289
+ expiresAt: z.ZodString;
290
+ token: z.ZodString;
291
+ }, "strict", z.ZodTypeAny, {
292
+ schemaVersion: "treeseed.provider-session/v1";
293
+ providerId: string;
294
+ scope: string[];
295
+ issuedAt: string;
296
+ expiresAt: string;
297
+ token: string;
298
+ }, {
299
+ schemaVersion: "treeseed.provider-session/v1";
300
+ providerId: string;
301
+ scope: string[];
302
+ issuedAt: string;
303
+ expiresAt: string;
304
+ token: string;
305
+ }>;
306
+ export declare const environmentProfileDescriptorSchema: z.ZodObject<{
307
+ schemaVersion: z.ZodLiteral<"treeseed.provider-environment-profile/v1">;
308
+ id: z.ZodString;
309
+ variables: z.ZodArray<z.ZodObject<{
310
+ name: z.ZodString;
311
+ available: z.ZodBoolean;
312
+ rotatedAt: z.ZodOptional<z.ZodString>;
313
+ }, "strip", z.ZodTypeAny, {
314
+ name: string;
315
+ available: boolean;
316
+ rotatedAt?: string | undefined;
317
+ }, {
318
+ name: string;
319
+ available: boolean;
320
+ rotatedAt?: string | undefined;
321
+ }>, "many">;
322
+ }, "strict", z.ZodTypeAny, {
323
+ schemaVersion: "treeseed.provider-environment-profile/v1";
324
+ id: string;
325
+ variables: {
326
+ name: string;
327
+ available: boolean;
328
+ rotatedAt?: string | undefined;
329
+ }[];
330
+ }, {
331
+ schemaVersion: "treeseed.provider-environment-profile/v1";
332
+ id: string;
333
+ variables: {
334
+ name: string;
335
+ available: boolean;
336
+ rotatedAt?: string | undefined;
337
+ }[];
338
+ }>;
339
+ export declare const assignmentEnvironmentGrantSchema: z.ZodObject<{
340
+ schemaVersion: z.ZodLiteral<"treeseed.assignment-environment-grant/v1">;
341
+ assignmentId: z.ZodString;
342
+ profileId: z.ZodString;
343
+ variables: z.ZodArray<z.ZodString, "many">;
344
+ network: z.ZodObject<{
345
+ allowed: z.ZodBoolean;
346
+ destinations: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
347
+ }, "strip", z.ZodTypeAny, {
348
+ allowed: boolean;
349
+ destinations: string[];
350
+ }, {
351
+ allowed: boolean;
352
+ destinations?: string[] | undefined;
353
+ }>;
354
+ expiresAt: z.ZodString;
355
+ }, "strict", z.ZodTypeAny, {
356
+ schemaVersion: "treeseed.assignment-environment-grant/v1";
357
+ expiresAt: string;
358
+ variables: string[];
359
+ assignmentId: string;
360
+ profileId: string;
361
+ network: {
362
+ allowed: boolean;
363
+ destinations: string[];
364
+ };
365
+ }, {
366
+ schemaVersion: "treeseed.assignment-environment-grant/v1";
367
+ expiresAt: string;
368
+ variables: string[];
369
+ assignmentId: string;
370
+ profileId: string;
371
+ network: {
372
+ allowed: boolean;
373
+ destinations?: string[] | undefined;
374
+ };
375
+ }>;
376
+ export type IntegrationLock = z.infer<typeof integrationLockSchema>;
377
+ export type HostTemplate = z.infer<typeof hostTemplateSchema>;
378
+ export type ProjectCreatePlan = z.infer<typeof projectCreatePlanSchema>;
379
+ export type ProjectCreateReceipt = z.infer<typeof projectCreateReceiptSchema>;
380
+ export type ProviderRegistrationRequest = z.infer<typeof providerRegistrationRequestSchema>;
381
+ export type ProviderSession = z.infer<typeof providerSessionSchema>;
382
+ export type EnvironmentProfileDescriptor = z.infer<typeof environmentProfileDescriptorSchema>;
383
+ export type AssignmentEnvironmentGrant = z.infer<typeof assignmentEnvironmentGrantSchema>;
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+ const digest = z.string().regex(/^sha256:[0-9a-f]{64}$/u);
3
+ const commit = z.string().regex(/^[0-9a-f]{40}$/u);
4
+ const integrationComponentSchema = z.object({
5
+ id: z.string().min(1),
6
+ version: z.string().min(1),
7
+ commit,
8
+ digest,
9
+ artifact: z.string().min(1)
10
+ }).strict();
11
+ const integrationLockSchema = z.object({
12
+ schemaVersion: z.literal("treeseed.platform-integration-lock/v1"),
13
+ release: z.string().min(1),
14
+ components: z.array(integrationComponentSchema).min(1),
15
+ digest
16
+ }).strict();
17
+ const hostTemplateSchema = z.object({
18
+ schemaVersion: z.literal("treeseed.platform-host-template/v1"),
19
+ id: z.string().min(1),
20
+ profiles: z.array(z.string().min(1)).min(1),
21
+ integration: z.object({ id: z.string().min(1), digest }),
22
+ inputs: z.array(z.object({ name: z.string().min(1), required: z.boolean(), sensitive: z.boolean().default(false) }))
23
+ }).strict();
24
+ const projectCreatePlanSchema = z.object({
25
+ schemaVersion: z.literal("treeseed.platform-project-create-plan/v1"),
26
+ slug: z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/u),
27
+ template: z.object({ id: z.string().min(1), version: z.string().min(1), digest }),
28
+ team: z.string().min(1),
29
+ repository: z.object({ owner: z.string().min(1), name: z.string().min(1), visibility: z.enum(["public", "private"]) }),
30
+ steps: z.array(z.enum(["project", "repository", "template", "library", "inventory"]))
31
+ }).strict();
32
+ const projectCreateReceiptSchema = projectCreatePlanSchema.omit({ schemaVersion: true }).extend({
33
+ schemaVersion: z.literal("treeseed.platform-project-create-receipt/v1"),
34
+ projectId: z.string().min(1),
35
+ repositoryUrl: z.string().url(),
36
+ libraryBindingId: z.string().min(1),
37
+ inventoryVersion: z.number().int().positive()
38
+ }).strict();
39
+ const providerRegistrationRequestSchema = z.object({
40
+ schemaVersion: z.literal("treeseed.provider-registration-request/v1"),
41
+ requestId: z.string().uuid(),
42
+ teamId: z.string().min(1),
43
+ publicKey: z.string().min(32),
44
+ capabilities: z.array(z.string().min(1)),
45
+ state: z.enum(["pending-approval", "approved", "rejected", "revoked"]),
46
+ createdAt: z.string().datetime()
47
+ }).strict();
48
+ const providerSessionSchema = z.object({
49
+ schemaVersion: z.literal("treeseed.provider-session/v1"),
50
+ providerId: z.string().min(1),
51
+ scope: z.array(z.string().min(1)).min(1),
52
+ issuedAt: z.string().datetime(),
53
+ expiresAt: z.string().datetime(),
54
+ token: z.string().min(1)
55
+ }).strict();
56
+ const environmentProfileDescriptorSchema = z.object({
57
+ schemaVersion: z.literal("treeseed.provider-environment-profile/v1"),
58
+ id: z.string().min(1),
59
+ variables: z.array(z.object({ name: z.string().regex(/^[A-Z_][A-Z0-9_]*$/u), available: z.boolean(), rotatedAt: z.string().datetime().optional() }))
60
+ }).strict();
61
+ const assignmentEnvironmentGrantSchema = z.object({
62
+ schemaVersion: z.literal("treeseed.assignment-environment-grant/v1"),
63
+ assignmentId: z.string().min(1),
64
+ profileId: z.string().min(1),
65
+ variables: z.array(z.string().regex(/^[A-Z_][A-Z0-9_]*$/u)),
66
+ network: z.object({ allowed: z.boolean(), destinations: z.array(z.string()).default([]) }),
67
+ expiresAt: z.string().datetime()
68
+ }).strict();
69
+ export {
70
+ assignmentEnvironmentGrantSchema,
71
+ environmentProfileDescriptorSchema,
72
+ hostTemplateSchema,
73
+ integrationComponentSchema,
74
+ integrationLockSchema,
75
+ projectCreatePlanSchema,
76
+ projectCreateReceiptSchema,
77
+ providerRegistrationRequestSchema,
78
+ providerSessionSchema
79
+ };
@@ -0,0 +1,5 @@
1
+ export * from './schemas.js';
2
+ export * from './contracts.js';
3
+ export * from './inventory.js';
4
+ export * from './workset.js';
5
+ export * from './verification.js';
@@ -0,0 +1,5 @@
1
+ export * from "./schemas.js";
2
+ export * from "./contracts.js";
3
+ export * from "./inventory.js";
4
+ export * from "./workset.js";
5
+ export * from "./verification.js";
@@ -0,0 +1,11 @@
1
+ import { type Inventory, type PlatformProfile } from './schemas.js';
2
+ export interface LoadedInventory {
3
+ root: string;
4
+ path: string;
5
+ digest: string;
6
+ inventory: Inventory;
7
+ }
8
+ export declare function loadPlatformInventory(root?: string): LoadedInventory;
9
+ export declare function loadPlatformProfile(path: string): PlatformProfile;
10
+ export declare function loadPlatformProfiles(root?: string): PlatformProfile[];
11
+ export declare function resolveProfileProjects(profiles: readonly PlatformProfile[], selected: readonly string[]): string[];
@@ -0,0 +1,53 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
3
+ import { dirname, resolve } from "node:path";
4
+ import { parse } from "yaml";
5
+ import { inventorySchema, profileSchema } from "./schemas.js";
6
+ function yamlFile(path) {
7
+ return parse(readFileSync(path, "utf8"));
8
+ }
9
+ function loadPlatformInventory(root = process.cwd()) {
10
+ const sitePath = resolve(root, "treeseed.site.yaml");
11
+ const site = yamlFile(sitePath);
12
+ const reference = site.development?.local?.inventory;
13
+ if (reference?.source !== "seed" || !reference.path) {
14
+ throw new Error("treeseed.site.yaml must declare development.local.inventory with source seed and a relative path.");
15
+ }
16
+ if (resolve(root, reference.path) !== resolve(dirname(sitePath), reference.path)) {
17
+ throw new Error("Inventory path must resolve beneath the Platform root.");
18
+ }
19
+ const path = resolve(root, reference.path);
20
+ if (!path.startsWith(`${resolve(root)}/`)) throw new Error("Inventory path escapes the Platform root.");
21
+ const source = readFileSync(path, "utf8");
22
+ return { root: resolve(root), path, digest: `sha256:${createHash("sha256").update(source).digest("hex")}`, inventory: inventorySchema.parse(parse(source)) };
23
+ }
24
+ function loadPlatformProfile(path) {
25
+ return profileSchema.parse(yamlFile(path));
26
+ }
27
+ function loadPlatformProfiles(root = process.cwd()) {
28
+ const directory = resolve(root, "profiles");
29
+ if (!existsSync(directory)) return [];
30
+ return readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isFile() && /\.ya?ml$/u.test(entry.name)).map((entry) => loadPlatformProfile(resolve(directory, entry.name))).sort((left, right) => left.id.localeCompare(right.id));
31
+ }
32
+ function resolveProfileProjects(profiles, selected) {
33
+ const catalog = new Map(profiles.map((profile) => [profile.id, profile]));
34
+ const result = /* @__PURE__ */ new Set();
35
+ const active = /* @__PURE__ */ new Set();
36
+ const visit = (id) => {
37
+ if (active.has(id)) throw new Error(`Profile inheritance cycle includes ${id}.`);
38
+ const profile = catalog.get(id);
39
+ if (!profile) throw new Error(`Unknown Platform profile ${id}.`);
40
+ active.add(id);
41
+ profile.extends.forEach(visit);
42
+ profile.sources.projects.forEach((project) => result.add(project));
43
+ active.delete(id);
44
+ };
45
+ selected.forEach(visit);
46
+ return [...result].sort();
47
+ }
48
+ export {
49
+ loadPlatformInventory,
50
+ loadPlatformProfile,
51
+ loadPlatformProfiles,
52
+ resolveProfileProjects
53
+ };