@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.
Files changed (83) hide show
  1. package/dist/control-plane-client.d.ts +60 -1
  2. package/dist/control-plane-client.js +59 -0
  3. package/dist/control-plane.d.ts +1 -1
  4. package/dist/control-plane.js +11 -4
  5. package/dist/d1-store.d.ts +58 -0
  6. package/dist/d1-store.js +64 -0
  7. package/dist/dispatch.js +6 -0
  8. package/dist/graph/schema.js +4 -0
  9. package/dist/index.d.ts +5 -1
  10. package/dist/index.js +32 -0
  11. package/dist/knowledge-coop.d.ts +223 -0
  12. package/dist/knowledge-coop.js +82 -0
  13. package/dist/model-registry.js +79 -0
  14. package/dist/operations/providers/default.js +126 -7
  15. package/dist/operations/services/config-runtime.d.ts +102 -24
  16. package/dist/operations/services/config-runtime.js +896 -160
  17. package/dist/operations/services/deploy.d.ts +223 -15
  18. package/dist/operations/services/deploy.js +626 -55
  19. package/dist/operations/services/github-automation.d.ts +60 -0
  20. package/dist/operations/services/github-automation.js +138 -0
  21. package/dist/operations/services/key-agent.d.ts +118 -0
  22. package/dist/operations/services/key-agent.js +476 -0
  23. package/dist/operations/services/knowledge-coop-launch.d.ts +90 -0
  24. package/dist/operations/services/knowledge-coop-launch.js +753 -0
  25. package/dist/operations/services/knowledge-coop-packaging.d.ts +59 -0
  26. package/dist/operations/services/knowledge-coop-packaging.js +234 -0
  27. package/dist/operations/services/local-dev.d.ts +0 -1
  28. package/dist/operations/services/local-dev.js +1 -14
  29. package/dist/operations/services/project-platform.d.ts +42 -182
  30. package/dist/operations/services/project-platform.js +162 -59
  31. package/dist/operations/services/railway-deploy.d.ts +1 -0
  32. package/dist/operations/services/railway-deploy.js +31 -13
  33. package/dist/operations/services/runtime-tools.d.ts +52 -5
  34. package/dist/operations/services/runtime-tools.js +186 -26
  35. package/dist/operations/services/watch-dev.js +2 -4
  36. package/dist/operations/services/workspace-preflight.d.ts +4 -4
  37. package/dist/operations/services/workspace-preflight.js +22 -20
  38. package/dist/operations-registry.js +7 -2
  39. package/dist/platform/contracts.d.ts +39 -3
  40. package/dist/platform/deploy-config.d.ts +12 -1
  41. package/dist/platform/deploy-config.js +214 -15
  42. package/dist/platform/deploy-runtime.d.ts +1 -0
  43. package/dist/platform/deploy-runtime.js +10 -2
  44. package/dist/platform/env.yaml +93 -61
  45. package/dist/platform/environment.d.ts +13 -2
  46. package/dist/platform/environment.js +90 -20
  47. package/dist/platform/plugins/constants.d.ts +1 -0
  48. package/dist/platform/plugins/constants.js +7 -6
  49. package/dist/platform/tenant/runtime-config.js +8 -1
  50. package/dist/platform/tenant-config.js +4 -0
  51. package/dist/platform/utils/site-config-schema.js +18 -0
  52. package/dist/plugin-default.js +2 -2
  53. package/dist/scripts/key-agent.js +165 -0
  54. package/dist/scripts/tenant-build.js +4 -1
  55. package/dist/scripts/tenant-check.js +4 -1
  56. package/dist/scripts/tenant-deploy.js +43 -4
  57. package/dist/scripts/tenant-dev.js +0 -1
  58. package/dist/sdk-types.d.ts +2 -2
  59. package/dist/sdk-types.js +2 -0
  60. package/dist/sdk.d.ts +13 -0
  61. package/dist/sdk.js +40 -0
  62. package/dist/stores/knowledge-coop-store.d.ts +56 -0
  63. package/dist/stores/knowledge-coop-store.js +482 -0
  64. package/dist/treeseed/template-catalog/templates/starter-basic/template/package.json +6 -2
  65. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/api/server.js +4 -0
  66. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/config.yaml +25 -0
  67. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/decisions/adopt-initial-proposal-loop.mdx +22 -0
  68. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/people/starter-steward.mdx +11 -0
  69. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/proposals/establish-initial-proposal-loop.mdx +17 -0
  70. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/manifest.yaml +17 -10
  71. package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +69 -7
  72. package/dist/treeseed/template-catalog/templates/starter-basic/template.config.json +1 -0
  73. package/dist/verification.js +90 -2
  74. package/dist/workflow/operations.d.ts +98 -0
  75. package/dist/workflow/operations.js +229 -7
  76. package/dist/workflow-state.d.ts +54 -2
  77. package/dist/workflow-state.js +170 -24
  78. package/dist/workflow-support.d.ts +1 -1
  79. package/dist/workflow-support.js +32 -2
  80. package/dist/workflow.d.ts +29 -0
  81. package/package.json +1 -1
  82. package/templates/github/deploy.workflow.yml +11 -1
  83. 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: parseHostingConfig(parsed.hosting),
484
+ hosting: compatibilityHosting,
485
+ hub,
486
+ runtime,
310
487
  cloudflare: {
311
- accountId: optionalCloudflareAccountId(cloudflare.accountId) ?? optionalCloudflareAccountId(process.env.CLOUDFLARE_ACCOUNT_ID) ?? CLOUDFLARE_ACCOUNT_ID_PLACEHOLDER,
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(cloudflarePages.projectName) ?? optionalString(process.env.TREESEED_CLOUDFLARE_PAGES_PROJECT_NAME),
319
- previewProjectName: optionalString(cloudflarePages.previewProjectName) ?? optionalString(process.env.TREESEED_CLOUDFLARE_PAGES_PREVIEW_PROJECT_NAME),
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(cloudflareR2.binding) ?? optionalString(process.env.TREESEED_CONTENT_BUCKET_BINDING),
326
- bucketName: optionalString(cloudflareR2.bucketName) ?? optionalString(process.env.TREESEED_CONTENT_BUCKET_NAME),
327
- publicBaseUrl: optionalString(cloudflareR2.publicBaseUrl) ?? optionalString(process.env.TREESEED_CONTENT_PUBLIC_BASE_URL),
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: parseManagedServicesConfig(parsed.services),
514
+ services,
337
515
  smtp: {
338
516
  enabled: optionalBoolean(smtp.enabled, "smtp.enabled")
339
517
  },
340
518
  turnstile: {
341
- enabled: true
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: true
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 ?? true;
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,