@treeseed/sdk 0.4.13 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/control-plane-client.d.ts +60 -1
- package/dist/control-plane-client.js +59 -0
- package/dist/control-plane.d.ts +1 -1
- package/dist/control-plane.js +11 -4
- package/dist/d1-store.d.ts +58 -0
- package/dist/d1-store.js +64 -0
- package/dist/dispatch.js +6 -0
- package/dist/graph/schema.js +4 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.js +32 -0
- package/dist/knowledge-coop.d.ts +223 -0
- package/dist/knowledge-coop.js +82 -0
- package/dist/model-registry.js +79 -0
- package/dist/operations/providers/default.js +126 -7
- package/dist/operations/services/config-runtime.d.ts +102 -24
- package/dist/operations/services/config-runtime.js +896 -160
- package/dist/operations/services/deploy.d.ts +223 -15
- package/dist/operations/services/deploy.js +626 -55
- package/dist/operations/services/github-automation.d.ts +60 -0
- package/dist/operations/services/github-automation.js +138 -0
- package/dist/operations/services/key-agent.d.ts +118 -0
- package/dist/operations/services/key-agent.js +476 -0
- package/dist/operations/services/knowledge-coop-launch.d.ts +90 -0
- package/dist/operations/services/knowledge-coop-launch.js +753 -0
- package/dist/operations/services/knowledge-coop-packaging.d.ts +59 -0
- package/dist/operations/services/knowledge-coop-packaging.js +234 -0
- package/dist/operations/services/local-dev.d.ts +0 -1
- package/dist/operations/services/local-dev.js +1 -14
- package/dist/operations/services/project-platform.d.ts +42 -182
- package/dist/operations/services/project-platform.js +162 -59
- package/dist/operations/services/railway-deploy.d.ts +1 -0
- package/dist/operations/services/railway-deploy.js +31 -13
- package/dist/operations/services/runtime-tools.d.ts +52 -5
- package/dist/operations/services/runtime-tools.js +186 -26
- package/dist/operations/services/watch-dev.js +2 -4
- package/dist/operations/services/workspace-preflight.d.ts +4 -4
- package/dist/operations/services/workspace-preflight.js +22 -20
- package/dist/operations-registry.js +7 -2
- package/dist/platform/contracts.d.ts +39 -3
- package/dist/platform/deploy-config.d.ts +12 -1
- package/dist/platform/deploy-config.js +214 -15
- package/dist/platform/deploy-runtime.d.ts +1 -0
- package/dist/platform/deploy-runtime.js +10 -2
- package/dist/platform/env.yaml +93 -61
- package/dist/platform/environment.d.ts +13 -2
- package/dist/platform/environment.js +90 -20
- package/dist/platform/plugins/constants.d.ts +1 -0
- package/dist/platform/plugins/constants.js +7 -6
- package/dist/platform/tenant/runtime-config.js +8 -1
- package/dist/platform/tenant-config.js +4 -0
- package/dist/platform/utils/site-config-schema.js +18 -0
- package/dist/plugin-default.js +2 -2
- package/dist/scripts/key-agent.js +165 -0
- package/dist/scripts/tenant-build.js +4 -1
- package/dist/scripts/tenant-check.js +4 -1
- package/dist/scripts/tenant-deploy.js +43 -4
- package/dist/scripts/tenant-dev.js +0 -1
- package/dist/sdk-types.d.ts +2 -2
- package/dist/sdk-types.js +2 -0
- package/dist/sdk.d.ts +13 -0
- package/dist/sdk.js +40 -0
- package/dist/stores/knowledge-coop-store.d.ts +56 -0
- package/dist/stores/knowledge-coop-store.js +482 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/package.json +6 -2
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/api/server.js +4 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/config.yaml +25 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/decisions/adopt-initial-proposal-loop.mdx +22 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/people/starter-steward.mdx +11 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/proposals/establish-initial-proposal-loop.mdx +17 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/manifest.yaml +17 -10
- package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +69 -7
- package/dist/treeseed/template-catalog/templates/starter-basic/template.config.json +1 -0
- package/dist/verification.js +90 -2
- package/dist/workflow/operations.d.ts +98 -0
- package/dist/workflow/operations.js +229 -7
- package/dist/workflow-state.d.ts +54 -2
- package/dist/workflow-state.js +170 -24
- package/dist/workflow-support.d.ts +1 -1
- package/dist/workflow-support.js +32 -2
- package/dist/workflow.d.ts +29 -0
- package/package.json +1 -1
- package/templates/github/deploy.workflow.yml +11 -1
- package/dist/scripts/sync-dev-vars.js +0 -6
|
@@ -18,8 +18,19 @@ const hostingFieldAliases = {
|
|
|
18
18
|
teamId: { key: "teamId", aliases: ["team_id"] },
|
|
19
19
|
projectId: { key: "projectId", aliases: ["project_id"] }
|
|
20
20
|
};
|
|
21
|
+
const hubFieldAliases = {
|
|
22
|
+
mode: { key: "mode", aliases: ["mode"] }
|
|
23
|
+
};
|
|
24
|
+
const runtimeFieldAliases = {
|
|
25
|
+
mode: { key: "mode", aliases: ["mode"] },
|
|
26
|
+
registration: { key: "registration", aliases: ["registration"] },
|
|
27
|
+
marketBaseUrl: { key: "marketBaseUrl", aliases: ["market_base_url"] },
|
|
28
|
+
teamId: { key: "teamId", aliases: ["team_id"] },
|
|
29
|
+
projectId: { key: "projectId", aliases: ["project_id"] }
|
|
30
|
+
};
|
|
21
31
|
const cloudflareFieldAliases = {
|
|
22
32
|
accountId: { key: "accountId", aliases: ["account_id"] },
|
|
33
|
+
zoneId: { key: "zoneId", aliases: ["zone_id"] },
|
|
23
34
|
workerName: { key: "workerName", aliases: ["worker_name"] },
|
|
24
35
|
queueName: { key: "queueName", aliases: ["queue_name"] },
|
|
25
36
|
dlqName: { key: "dlqName", aliases: ["dlq_name"] },
|
|
@@ -41,7 +52,26 @@ const cloudflareR2FieldAliases = {
|
|
|
41
52
|
previewRootTemplate: { key: "previewRootTemplate", aliases: ["preview_root_template", "preview_root"] },
|
|
42
53
|
previewTtlHours: { key: "previewTtlHours", aliases: ["preview_ttl_hours"] }
|
|
43
54
|
};
|
|
55
|
+
const webSurfaceCacheFieldAliases = {
|
|
56
|
+
sourcePages: { key: "sourcePages", aliases: ["source_pages"] },
|
|
57
|
+
contentPages: { key: "contentPages", aliases: ["content_pages"] },
|
|
58
|
+
r2PublishedObjects: { key: "r2PublishedObjects", aliases: ["r2_published_objects"] }
|
|
59
|
+
};
|
|
60
|
+
const webCachePolicyFieldAliases = {
|
|
61
|
+
browserTtlSeconds: { key: "browserTtlSeconds", aliases: ["browser_ttl_seconds"] },
|
|
62
|
+
edgeTtlSeconds: { key: "edgeTtlSeconds", aliases: ["edge_ttl_seconds"] },
|
|
63
|
+
staleWhileRevalidateSeconds: { key: "staleWhileRevalidateSeconds", aliases: ["stale_while_revalidate_seconds"] },
|
|
64
|
+
staleIfErrorSeconds: { key: "staleIfErrorSeconds", aliases: ["stale_if_error_seconds"] },
|
|
65
|
+
paths: { key: "paths", aliases: ["paths"] }
|
|
66
|
+
};
|
|
44
67
|
const CLOUDFLARE_ACCOUNT_ID_PLACEHOLDER = "replace-with-cloudflare-account-id";
|
|
68
|
+
const TREESEED_DEFAULT_SOURCE_PAGE_PURGE_PATHS = ["/", "/contact", "/404"];
|
|
69
|
+
const TREESEED_DEFAULT_LONG_LIVED_CACHE_POLICY = {
|
|
70
|
+
browserTtlSeconds: 0,
|
|
71
|
+
edgeTtlSeconds: 31536e3,
|
|
72
|
+
staleWhileRevalidateSeconds: 86400,
|
|
73
|
+
staleIfErrorSeconds: 86400
|
|
74
|
+
};
|
|
45
75
|
function expectString(value, label) {
|
|
46
76
|
if (typeof value !== "string" || !value.trim()) {
|
|
47
77
|
throw new Error(`Invalid deploy config: expected ${label} to be a non-empty string.`);
|
|
@@ -67,6 +97,15 @@ function optionalPositiveNumber(value, label) {
|
|
|
67
97
|
}
|
|
68
98
|
return value;
|
|
69
99
|
}
|
|
100
|
+
function optionalNonNegativeNumber(value, label) {
|
|
101
|
+
if (value === void 0) {
|
|
102
|
+
return void 0;
|
|
103
|
+
}
|
|
104
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
105
|
+
throw new Error(`Invalid deploy config: expected ${label} to be a non-negative number when provided.`);
|
|
106
|
+
}
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
70
109
|
function optionalEnum(value, label, allowed) {
|
|
71
110
|
if (value === void 0) {
|
|
72
111
|
return void 0;
|
|
@@ -138,9 +177,85 @@ function parseHostingConfig(value) {
|
|
|
138
177
|
"self_hosted_project"
|
|
139
178
|
]) ?? "self_hosted_project",
|
|
140
179
|
registration: optionalEnum(record.registration, "hosting.registration", ["optional", "none"]) ?? "none",
|
|
141
|
-
marketBaseUrl: optionalString(record.marketBaseUrl),
|
|
142
|
-
teamId: optionalString(record.teamId),
|
|
143
|
-
projectId: optionalString(record.projectId)
|
|
180
|
+
marketBaseUrl: optionalString(process.env.TREESEED_MARKET_API_BASE_URL) ?? optionalString(record.marketBaseUrl),
|
|
181
|
+
teamId: optionalString(process.env.TREESEED_HOSTING_TEAM_ID) ?? optionalString(record.teamId),
|
|
182
|
+
projectId: optionalString(process.env.TREESEED_PROJECT_ID) ?? optionalString(record.projectId)
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function normalizePlanesFromLegacyHosting(hosting) {
|
|
186
|
+
if (!hosting) {
|
|
187
|
+
return {
|
|
188
|
+
hub: { mode: "treeseed_hosted" },
|
|
189
|
+
runtime: { mode: "none", registration: "none" }
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (hosting.kind === "market_control_plane" || hosting.kind === "hosted_project") {
|
|
193
|
+
return {
|
|
194
|
+
hub: { mode: "treeseed_hosted" },
|
|
195
|
+
runtime: {
|
|
196
|
+
mode: "treeseed_managed",
|
|
197
|
+
registration: hosting.kind === "market_control_plane" ? "none" : hosting.registration ?? "none",
|
|
198
|
+
marketBaseUrl: hosting.marketBaseUrl,
|
|
199
|
+
teamId: hosting.teamId,
|
|
200
|
+
projectId: hosting.projectId
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
hub: { mode: "customer_hosted" },
|
|
206
|
+
runtime: {
|
|
207
|
+
mode: "byo_attached",
|
|
208
|
+
registration: hosting.registration ?? "none",
|
|
209
|
+
marketBaseUrl: hosting.marketBaseUrl,
|
|
210
|
+
teamId: hosting.teamId,
|
|
211
|
+
projectId: hosting.projectId
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function normalizeLegacyHostingFromPlanes(hub, runtime) {
|
|
216
|
+
if (runtime.mode === "treeseed_managed" && hub.mode === "treeseed_hosted") {
|
|
217
|
+
return {
|
|
218
|
+
kind: "hosted_project",
|
|
219
|
+
registration: runtime.registration === "required" ? "optional" : runtime.registration ?? "none",
|
|
220
|
+
marketBaseUrl: runtime.marketBaseUrl,
|
|
221
|
+
teamId: runtime.teamId,
|
|
222
|
+
projectId: runtime.projectId
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
kind: "self_hosted_project",
|
|
227
|
+
registration: runtime.registration === "required" ? "optional" : runtime.registration ?? "none",
|
|
228
|
+
marketBaseUrl: runtime.marketBaseUrl,
|
|
229
|
+
teamId: runtime.teamId,
|
|
230
|
+
projectId: runtime.projectId
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function parseHubConfig(value, fallback) {
|
|
234
|
+
const record = normalizeAliasedRecord(
|
|
235
|
+
hubFieldAliases,
|
|
236
|
+
optionalRecord(value, "hub") ?? {}
|
|
237
|
+
);
|
|
238
|
+
if (!value || Object.keys(record).length === 0) {
|
|
239
|
+
return fallback;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
mode: optionalEnum(record.mode, "hub.mode", ["treeseed_hosted", "customer_hosted"]) ?? fallback.mode
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function parseRuntimeConfig(value, fallback) {
|
|
246
|
+
const record = normalizeAliasedRecord(
|
|
247
|
+
runtimeFieldAliases,
|
|
248
|
+
optionalRecord(value, "runtime") ?? {}
|
|
249
|
+
);
|
|
250
|
+
if (!value || Object.keys(record).length === 0) {
|
|
251
|
+
return fallback;
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
mode: optionalEnum(record.mode, "runtime.mode", ["none", "byo_attached", "treeseed_managed"]) ?? fallback.mode,
|
|
255
|
+
registration: optionalEnum(record.registration, "runtime.registration", ["optional", "required", "none"]) ?? fallback.registration ?? "none",
|
|
256
|
+
marketBaseUrl: optionalString(process.env.TREESEED_MARKET_API_BASE_URL) ?? fallback.marketBaseUrl,
|
|
257
|
+
teamId: optionalString(process.env.TREESEED_HOSTING_TEAM_ID) ?? fallback.teamId,
|
|
258
|
+
projectId: optionalString(process.env.TREESEED_PROJECT_ID) ?? fallback.projectId
|
|
144
259
|
};
|
|
145
260
|
}
|
|
146
261
|
function parseProviderSelections(value) {
|
|
@@ -192,7 +307,12 @@ function parseProviderSelections(value) {
|
|
|
192
307
|
docs: expectString(
|
|
193
308
|
contentProviders.docs ?? contentProviders.runtime ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.content.docs ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.content.runtime,
|
|
194
309
|
"providers.content.docs"
|
|
195
|
-
)
|
|
310
|
+
),
|
|
311
|
+
serving: optionalEnum(
|
|
312
|
+
contentProviders.serving,
|
|
313
|
+
"providers.content.serving",
|
|
314
|
+
["local_collections", "published_runtime"]
|
|
315
|
+
) ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.content.serving
|
|
196
316
|
},
|
|
197
317
|
site: expectString(record.site ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.site, "providers.site")
|
|
198
318
|
};
|
|
@@ -246,6 +366,11 @@ function parseManagedServicesConfig(value) {
|
|
|
246
366
|
])
|
|
247
367
|
);
|
|
248
368
|
}
|
|
369
|
+
function inferManagedRuntimeFromServices(services) {
|
|
370
|
+
return Object.values(services ?? {}).some(
|
|
371
|
+
(service) => service && service.enabled !== false && (service.provider ?? "railway") === "railway"
|
|
372
|
+
);
|
|
373
|
+
}
|
|
249
374
|
function parsePlatformSurfaceConfig(value, label) {
|
|
250
375
|
const record = optionalRecord(value, label);
|
|
251
376
|
if (!record) {
|
|
@@ -256,8 +381,47 @@ function parsePlatformSurfaceConfig(value, label) {
|
|
|
256
381
|
provider: optionalString(record.provider),
|
|
257
382
|
rootDir: optionalString(record.rootDir),
|
|
258
383
|
publicBaseUrl: optionalString(record.publicBaseUrl),
|
|
259
|
-
localBaseUrl: optionalString(record.localBaseUrl)
|
|
384
|
+
localBaseUrl: optionalString(record.localBaseUrl),
|
|
385
|
+
cache: parseWebSurfaceCacheConfig(record.cache, `${label}.cache`)
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
function parseWebSurfaceCacheConfig(value, label) {
|
|
389
|
+
const record = normalizeAliasedRecord(
|
|
390
|
+
webSurfaceCacheFieldAliases,
|
|
391
|
+
optionalRecord(value, label) ?? {}
|
|
392
|
+
);
|
|
393
|
+
if (!value || Object.keys(record).length === 0) {
|
|
394
|
+
return void 0;
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
sourcePages: parseWebCachePolicyRecord(record.sourcePages, `${label}.sourcePages`, {
|
|
398
|
+
paths: TREESEED_DEFAULT_SOURCE_PAGE_PURGE_PATHS
|
|
399
|
+
}),
|
|
400
|
+
contentPages: parseWebCachePolicyRecord(record.contentPages, `${label}.contentPages`),
|
|
401
|
+
r2PublishedObjects: parseWebCachePolicyRecord(record.r2PublishedObjects, `${label}.r2PublishedObjects`)
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
function parseWebCachePolicyRecord(value, label, options = {}) {
|
|
405
|
+
const record = normalizeAliasedRecord(
|
|
406
|
+
webCachePolicyFieldAliases,
|
|
407
|
+
optionalRecord(value, label) ?? {}
|
|
408
|
+
);
|
|
409
|
+
if (!value || Object.keys(record).length === 0) {
|
|
410
|
+
return options.paths ? { paths: [...options.paths] } : void 0;
|
|
411
|
+
}
|
|
412
|
+
const parsed = {
|
|
413
|
+
browserTtlSeconds: optionalNonNegativeNumber(record.browserTtlSeconds, `${label}.browserTtlSeconds`),
|
|
414
|
+
edgeTtlSeconds: optionalNonNegativeNumber(record.edgeTtlSeconds, `${label}.edgeTtlSeconds`),
|
|
415
|
+
staleWhileRevalidateSeconds: optionalNonNegativeNumber(
|
|
416
|
+
record.staleWhileRevalidateSeconds,
|
|
417
|
+
`${label}.staleWhileRevalidateSeconds`
|
|
418
|
+
),
|
|
419
|
+
staleIfErrorSeconds: optionalNonNegativeNumber(record.staleIfErrorSeconds, `${label}.staleIfErrorSeconds`)
|
|
260
420
|
};
|
|
421
|
+
if (options.paths) {
|
|
422
|
+
parsed.paths = [...new Set(optionalStringArray(record.paths, `${label}.paths`) ?? options.paths)];
|
|
423
|
+
}
|
|
424
|
+
return parsed;
|
|
261
425
|
}
|
|
262
426
|
function parsePlatformSurfacesConfig(value) {
|
|
263
427
|
const record = optionalRecord(value, "surfaces");
|
|
@@ -298,33 +462,47 @@ function parseDeployConfig(raw) {
|
|
|
298
462
|
cloudflareR2FieldAliases,
|
|
299
463
|
optionalRecord(cloudflare.r2, "cloudflare.r2") ?? {}
|
|
300
464
|
);
|
|
465
|
+
const hosting = parseHostingConfig(parsed.hosting);
|
|
466
|
+
const services = parseManagedServicesConfig(parsed.services);
|
|
467
|
+
const normalizedPlanes = normalizePlanesFromLegacyHosting(hosting);
|
|
468
|
+
const inferredPlanes = !hosting && !parsed.hub && !parsed.runtime && inferManagedRuntimeFromServices(services) ? {
|
|
469
|
+
hub: { mode: "customer_hosted" },
|
|
470
|
+
runtime: { mode: "treeseed_managed", registration: "none" }
|
|
471
|
+
} : normalizedPlanes;
|
|
472
|
+
const hub = parseHubConfig(parsed.hub, inferredPlanes.hub);
|
|
473
|
+
const runtime = parseRuntimeConfig(parsed.runtime, inferredPlanes.runtime);
|
|
301
474
|
const smtp = optionalRecord(parsed.smtp, "smtp") ?? {};
|
|
302
475
|
const turnstile = optionalRecord(parsed.turnstile, "turnstile") ?? {};
|
|
303
476
|
optionalBoolean(turnstile.enabled, "turnstile.enabled");
|
|
477
|
+
const normalizedHosting = normalizeLegacyHostingFromPlanes(hub, runtime);
|
|
478
|
+
const compatibilityHosting = hosting && !parsed.hub && !parsed.runtime ? hosting : normalizedHosting;
|
|
304
479
|
return {
|
|
305
480
|
name: expectString(parsed.name, "name"),
|
|
306
481
|
slug: expectString(parsed.slug, "slug"),
|
|
307
482
|
siteUrl: expectString(parsed.siteUrl, "siteUrl"),
|
|
308
483
|
contactEmail: expectString(parsed.contactEmail, "contactEmail"),
|
|
309
|
-
hosting:
|
|
484
|
+
hosting: compatibilityHosting,
|
|
485
|
+
hub,
|
|
486
|
+
runtime,
|
|
310
487
|
cloudflare: {
|
|
311
|
-
accountId: optionalCloudflareAccountId(
|
|
488
|
+
accountId: optionalCloudflareAccountId(process.env.CLOUDFLARE_ACCOUNT_ID) ?? CLOUDFLARE_ACCOUNT_ID_PLACEHOLDER,
|
|
489
|
+
zoneId: optionalString(cloudflare.zoneId),
|
|
312
490
|
workerName: optionalString(cloudflare.workerName),
|
|
313
491
|
queueName: optionalString(cloudflare.queueName),
|
|
314
492
|
dlqName: optionalString(cloudflare.dlqName),
|
|
315
493
|
d1Binding: optionalString(cloudflare.d1Binding),
|
|
316
494
|
queueBinding: optionalString(cloudflare.queueBinding),
|
|
317
495
|
pages: cloudflare.pages === void 0 ? void 0 : {
|
|
318
|
-
projectName: optionalString(
|
|
319
|
-
previewProjectName: optionalString(
|
|
496
|
+
projectName: optionalString(process.env.TREESEED_CLOUDFLARE_PAGES_PROJECT_NAME) ?? optionalString(cloudflarePages.projectName),
|
|
497
|
+
previewProjectName: optionalString(process.env.TREESEED_CLOUDFLARE_PAGES_PREVIEW_PROJECT_NAME) ?? optionalString(cloudflarePages.previewProjectName),
|
|
320
498
|
productionBranch: optionalString(cloudflarePages.productionBranch) ?? "main",
|
|
321
499
|
stagingBranch: optionalString(cloudflarePages.stagingBranch) ?? "staging",
|
|
322
500
|
buildOutputDir: optionalString(cloudflarePages.buildOutputDir)
|
|
323
501
|
},
|
|
324
502
|
r2: cloudflare.r2 === void 0 ? void 0 : {
|
|
325
|
-
binding: optionalString(
|
|
326
|
-
bucketName: optionalString(
|
|
327
|
-
publicBaseUrl: optionalString(
|
|
503
|
+
binding: optionalString(process.env.TREESEED_CONTENT_BUCKET_BINDING) ?? optionalString(cloudflareR2.binding),
|
|
504
|
+
bucketName: optionalString(process.env.TREESEED_CONTENT_BUCKET_NAME) ?? optionalString(cloudflareR2.bucketName),
|
|
505
|
+
publicBaseUrl: optionalString(process.env.TREESEED_CONTENT_PUBLIC_BASE_URL) ?? optionalString(cloudflareR2.publicBaseUrl),
|
|
328
506
|
manifestKeyTemplate: optionalString(cloudflareR2.manifestKeyTemplate) ?? "teams/{teamId}/published/common.json",
|
|
329
507
|
previewRootTemplate: optionalString(cloudflareR2.previewRootTemplate) ?? "teams/{teamId}/previews",
|
|
330
508
|
previewTtlHours: optionalPositiveNumber(cloudflareR2.previewTtlHours, "cloudflare.r2.previewTtlHours") ?? 168
|
|
@@ -333,12 +511,12 @@ function parseDeployConfig(raw) {
|
|
|
333
511
|
plugins: parsePluginReferences(parsed.plugins),
|
|
334
512
|
providers: parseProviderSelections(parsed.providers),
|
|
335
513
|
surfaces: parsePlatformSurfacesConfig(parsed.surfaces),
|
|
336
|
-
services
|
|
514
|
+
services,
|
|
337
515
|
smtp: {
|
|
338
516
|
enabled: optionalBoolean(smtp.enabled, "smtp.enabled")
|
|
339
517
|
},
|
|
340
518
|
turnstile: {
|
|
341
|
-
enabled:
|
|
519
|
+
enabled: optionalBoolean(turnstile.enabled, "turnstile.enabled") ?? false
|
|
342
520
|
},
|
|
343
521
|
export: parseExportConfig(parsed.export)
|
|
344
522
|
};
|
|
@@ -357,6 +535,26 @@ function resolveTreeseedDeployConfigPathFromRoot(tenantRoot, configPath = "trees
|
|
|
357
535
|
function deriveCloudflareWorkerName(config) {
|
|
358
536
|
return config.cloudflare.workerName?.trim() || config.slug;
|
|
359
537
|
}
|
|
538
|
+
function resolveLongLivedCachePolicy(configured) {
|
|
539
|
+
return {
|
|
540
|
+
browserTtlSeconds: configured?.browserTtlSeconds ?? TREESEED_DEFAULT_LONG_LIVED_CACHE_POLICY.browserTtlSeconds,
|
|
541
|
+
edgeTtlSeconds: configured?.edgeTtlSeconds ?? TREESEED_DEFAULT_LONG_LIVED_CACHE_POLICY.edgeTtlSeconds,
|
|
542
|
+
staleWhileRevalidateSeconds: configured?.staleWhileRevalidateSeconds ?? TREESEED_DEFAULT_LONG_LIVED_CACHE_POLICY.staleWhileRevalidateSeconds,
|
|
543
|
+
staleIfErrorSeconds: configured?.staleIfErrorSeconds ?? TREESEED_DEFAULT_LONG_LIVED_CACHE_POLICY.staleIfErrorSeconds
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
function resolveTreeseedWebCachePolicy(config) {
|
|
547
|
+
const cache = config.surfaces?.web?.cache ?? {};
|
|
548
|
+
const sourcePages = cache.sourcePages;
|
|
549
|
+
return {
|
|
550
|
+
sourcePages: {
|
|
551
|
+
...resolveLongLivedCachePolicy(sourcePages),
|
|
552
|
+
paths: [...new Set(sourcePages?.paths ?? TREESEED_DEFAULT_SOURCE_PAGE_PURGE_PATHS)]
|
|
553
|
+
},
|
|
554
|
+
contentPages: resolveLongLivedCachePolicy(cache.contentPages),
|
|
555
|
+
r2PublishedObjects: resolveLongLivedCachePolicy(cache.r2PublishedObjects)
|
|
556
|
+
};
|
|
557
|
+
}
|
|
360
558
|
function loadTreeseedDeployConfig(configPath = "treeseed.site.yaml") {
|
|
361
559
|
const resolvedConfigPath = resolveTreeseedDeployConfigPath(configPath);
|
|
362
560
|
return loadTreeseedDeployConfigFromPath(resolvedConfigPath);
|
|
@@ -379,5 +577,6 @@ export {
|
|
|
379
577
|
loadTreeseedDeployConfig,
|
|
380
578
|
loadTreeseedDeployConfigFromPath,
|
|
381
579
|
resolveTreeseedDeployConfigPath,
|
|
382
|
-
resolveTreeseedDeployConfigPathFromRoot
|
|
580
|
+
resolveTreeseedDeployConfigPathFromRoot,
|
|
581
|
+
resolveTreeseedWebCachePolicy
|
|
383
582
|
};
|
|
@@ -14,6 +14,7 @@ export declare function getTreeseedAgentProviderSelections(): {
|
|
|
14
14
|
export declare function getTreeseedDeployProvider(): string;
|
|
15
15
|
export declare function getTreeseedContentRuntimeProvider(): string;
|
|
16
16
|
export declare function getTreeseedContentPublishProvider(): string;
|
|
17
|
+
export declare function getTreeseedContentServingMode(): string;
|
|
17
18
|
export declare function getTreeseedDocsProvider(): string;
|
|
18
19
|
export declare function getTreeseedSiteProvider(): string;
|
|
19
20
|
export declare function isTreeseedSmtpEnabled(): boolean;
|
|
@@ -17,7 +17,7 @@ function defaultDeployConfig() {
|
|
|
17
17
|
enabled: false
|
|
18
18
|
},
|
|
19
19
|
turnstile: {
|
|
20
|
-
enabled:
|
|
20
|
+
enabled: false
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
}
|
|
@@ -58,6 +58,13 @@ function getTreeseedContentRuntimeProvider() {
|
|
|
58
58
|
function getTreeseedContentPublishProvider() {
|
|
59
59
|
return getTreeseedDeployConfig().providers?.content?.publish ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.content.publish;
|
|
60
60
|
}
|
|
61
|
+
function getTreeseedContentServingMode() {
|
|
62
|
+
const override = process.env.TREESEED_CONTENT_SERVING_MODE?.trim();
|
|
63
|
+
if (override === "local_collections" || override === "published_runtime") {
|
|
64
|
+
return override;
|
|
65
|
+
}
|
|
66
|
+
return getTreeseedDeployConfig().providers?.content?.serving ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.content.serving;
|
|
67
|
+
}
|
|
61
68
|
function getTreeseedDocsProvider() {
|
|
62
69
|
return getTreeseedDeployConfig().providers?.content?.docs ?? getTreeseedDeployConfig().providers?.content?.runtime ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.content.docs ?? TREESEED_DEFAULT_PROVIDER_SELECTIONS.content.runtime;
|
|
63
70
|
}
|
|
@@ -68,12 +75,13 @@ function isTreeseedSmtpEnabled() {
|
|
|
68
75
|
return getTreeseedDeployConfig().smtp?.enabled ?? false;
|
|
69
76
|
}
|
|
70
77
|
function isTreeseedTurnstileEnabled() {
|
|
71
|
-
return getTreeseedDeployConfig().turnstile?.enabled ??
|
|
78
|
+
return getTreeseedDeployConfig().turnstile?.enabled ?? false;
|
|
72
79
|
}
|
|
73
80
|
export {
|
|
74
81
|
getTreeseedAgentProviderSelections,
|
|
75
82
|
getTreeseedContentPublishProvider,
|
|
76
83
|
getTreeseedContentRuntimeProvider,
|
|
84
|
+
getTreeseedContentServingMode,
|
|
77
85
|
getTreeseedDeployConfig,
|
|
78
86
|
getTreeseedDeployProvider,
|
|
79
87
|
getTreeseedDocsProvider,
|