@treeseed/sdk 0.4.9 → 0.4.10

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 (65) hide show
  1. package/dist/control-plane-client.d.ts +45 -0
  2. package/dist/control-plane-client.js +229 -0
  3. package/dist/control-plane.d.ts +94 -0
  4. package/dist/control-plane.js +125 -0
  5. package/dist/d1-store.d.ts +56 -1
  6. package/dist/d1-store.js +132 -0
  7. package/dist/index.d.ts +11 -1
  8. package/dist/index.js +69 -1
  9. package/dist/operations/services/config-runtime.d.ts +10 -0
  10. package/dist/operations/services/config-runtime.js +60 -2
  11. package/dist/operations/services/deploy.d.ts +95 -0
  12. package/dist/operations/services/deploy.js +350 -9
  13. package/dist/operations/services/github-automation.d.ts +37 -1
  14. package/dist/operations/services/github-automation.js +71 -14
  15. package/dist/operations/services/project-platform.d.ts +835 -0
  16. package/dist/operations/services/project-platform.js +782 -0
  17. package/dist/operations/services/railway-deploy.d.ts +113 -18
  18. package/dist/operations/services/railway-deploy.js +355 -6
  19. package/dist/operations/services/runtime-tools.d.ts +25 -0
  20. package/dist/operations/services/runtime-tools.js +65 -3
  21. package/dist/operations/services/template-registry.d.ts +1 -1
  22. package/dist/operations/services/template-registry.js +17 -3
  23. package/dist/platform/books-data.d.ts +3 -4
  24. package/dist/platform/books-data.js +30 -4
  25. package/dist/platform/contracts.d.ts +55 -2
  26. package/dist/platform/deploy-config.js +109 -4
  27. package/dist/platform/deploy-runtime.d.ts +2 -0
  28. package/dist/platform/deploy-runtime.js +9 -1
  29. package/dist/platform/env.yaml +677 -0
  30. package/dist/platform/environment.js +57 -2
  31. package/dist/platform/plugin.d.ts +8 -0
  32. package/dist/platform/plugins/constants.d.ts +2 -0
  33. package/dist/platform/plugins/constants.js +2 -0
  34. package/dist/platform/plugins/runtime.d.ts +2 -0
  35. package/dist/platform/plugins/runtime.js +9 -1
  36. package/dist/platform/plugins.d.ts +1 -1
  37. package/dist/platform/plugins.js +4 -0
  38. package/dist/platform/published-content-pipeline.d.ts +84 -0
  39. package/dist/platform/published-content-pipeline.js +543 -0
  40. package/dist/platform/published-content.d.ts +223 -0
  41. package/dist/platform/published-content.js +588 -0
  42. package/dist/platform/tenant/runtime-config.d.ts +1 -1
  43. package/dist/platform/tenant/runtime-config.js +34 -1
  44. package/dist/platform/tenant-config.d.ts +2 -1
  45. package/dist/platform/tenant-config.js +17 -1
  46. package/dist/platform/utils/site-config-schema.js +104 -0
  47. package/dist/plugin-default.d.ts +2 -0
  48. package/dist/plugin-default.js +2 -0
  49. package/dist/scripts/check-build-warnings.js +50 -0
  50. package/dist/scripts/config-treeseed.js +7 -0
  51. package/dist/scripts/tenant-workflow-action.js +71 -0
  52. package/dist/sdk-types.d.ts +442 -3
  53. package/dist/sdk-types.js +37 -1
  54. package/dist/sdk.d.ts +11 -1
  55. package/dist/sdk.js +40 -0
  56. package/dist/stores/operational-store.d.ts +22 -2
  57. package/dist/stores/operational-store.js +235 -0
  58. package/dist/template-catalog.js +8 -1
  59. package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +20 -0
  60. package/dist/types/cloudflare.d.ts +23 -0
  61. package/dist/workflow/operations.d.ts +12 -3
  62. package/dist/workflow/policy.d.ts +1 -1
  63. package/package.json +7 -2
  64. package/templates/github/deploy.workflow.yml +442 -0
  65. package/templates/github/hosted-project.workflow.yml +77 -0
package/dist/d1-store.js CHANGED
@@ -52,6 +52,11 @@ class MemoryAgentDatabase {
52
52
  taskOutputs = /* @__PURE__ */ new Map();
53
53
  graphRuns = /* @__PURE__ */ new Map();
54
54
  reports = /* @__PURE__ */ new Map();
55
+ workPolicies = /* @__PURE__ */ new Map();
56
+ priorityOverrides = /* @__PURE__ */ new Map();
57
+ prioritySnapshots = /* @__PURE__ */ new Map();
58
+ taskCreditLedger = /* @__PURE__ */ new Map();
59
+ scaleDecisions = /* @__PURE__ */ new Map();
55
60
  messageId = 0;
56
61
  constructor(seed) {
57
62
  for (const item of seed?.subscriptions ?? []) {
@@ -750,6 +755,103 @@ class MemoryAgentDatabase {
750
755
  graph: workDay?.graphVersion ? { graphVersion: workDay.graphVersion } : null
751
756
  };
752
757
  }
758
+ async getWorkPolicy(projectId, environment = "local") {
759
+ return this.workPolicies.get(`${projectId}:${environment}`) ?? null;
760
+ }
761
+ async upsertWorkPolicy(request) {
762
+ const policy = {
763
+ projectId: request.projectId,
764
+ environment: request.environment,
765
+ schedule: request.schedule,
766
+ dailyTaskCreditBudget: request.dailyTaskCreditBudget,
767
+ maxQueuedTasks: request.maxQueuedTasks,
768
+ maxQueuedCredits: request.maxQueuedCredits,
769
+ autoscale: request.autoscale,
770
+ creditWeights: request.creditWeights ?? [],
771
+ metadata: request.metadata ?? {}
772
+ };
773
+ this.workPolicies.set(`${request.projectId}:${request.environment}`, policy);
774
+ return policy;
775
+ }
776
+ async listPriorityOverrides(projectId) {
777
+ return [...this.priorityOverrides.values()].filter((entry) => entry.projectId === projectId);
778
+ }
779
+ async upsertPriorityOverride(request) {
780
+ const record = {
781
+ id: request.id ?? crypto.randomUUID(),
782
+ projectId: request.projectId,
783
+ model: request.model,
784
+ subjectId: request.subjectId,
785
+ priority: request.priority,
786
+ estimatedCredits: request.estimatedCredits ?? null,
787
+ metadata: request.metadata ?? {},
788
+ createdAt: nowIso(),
789
+ updatedAt: nowIso()
790
+ };
791
+ this.priorityOverrides.set(record.id, record);
792
+ return record;
793
+ }
794
+ async createPrioritySnapshot(request) {
795
+ const snapshot = {
796
+ id: request.id ?? crypto.randomUUID(),
797
+ projectId: request.projectId,
798
+ workDayId: request.workDayId ?? null,
799
+ generatedAt: nowIso(),
800
+ items: request.items,
801
+ metadata: request.metadata ?? {}
802
+ };
803
+ this.prioritySnapshots.set(snapshot.id, snapshot);
804
+ return snapshot;
805
+ }
806
+ async getLatestPrioritySnapshot(projectId, workDayId) {
807
+ return [...this.prioritySnapshots.values()].filter((entry) => entry.projectId === projectId).filter((entry) => !workDayId || entry.workDayId === workDayId).sort((left, right) => right.generatedAt.localeCompare(left.generatedAt))[0] ?? null;
808
+ }
809
+ async recordTaskCredits(request) {
810
+ const entry = {
811
+ id: request.id ?? crypto.randomUUID(),
812
+ projectId: request.projectId,
813
+ workDayId: request.workDayId,
814
+ taskId: request.taskId ?? null,
815
+ phase: request.phase,
816
+ credits: request.credits,
817
+ metadata: request.metadata ?? {},
818
+ createdAt: nowIso()
819
+ };
820
+ this.taskCreditLedger.set(entry.id, entry);
821
+ const workDay = this.workDays.get(request.workDayId);
822
+ if (workDay) {
823
+ const delta = request.phase === "refund" ? -Math.abs(request.credits) : Math.abs(request.credits);
824
+ this.workDays.set(workDay.id, {
825
+ ...workDay,
826
+ capacityUsed: Math.max(0, workDay.capacityUsed + delta),
827
+ updatedAt: nowIso()
828
+ });
829
+ }
830
+ return entry;
831
+ }
832
+ async listTaskCredits(workDayId) {
833
+ return [...this.taskCreditLedger.values()].filter((entry) => entry.workDayId === workDayId).sort((left, right) => left.createdAt.localeCompare(right.createdAt));
834
+ }
835
+ async recordScaleDecision(request) {
836
+ const decision = {
837
+ id: request.id ?? crypto.randomUUID(),
838
+ projectId: request.projectId,
839
+ environment: request.environment,
840
+ poolName: request.poolName,
841
+ workDayId: request.workDayId ?? null,
842
+ desiredWorkers: request.desiredWorkers,
843
+ observedQueueDepth: request.observedQueueDepth,
844
+ observedActiveLeases: request.observedActiveLeases,
845
+ reason: request.reason,
846
+ metadata: request.metadata ?? {},
847
+ createdAt: nowIso()
848
+ };
849
+ this.scaleDecisions.set(decision.id, decision);
850
+ return decision;
851
+ }
852
+ async getLatestScaleDecision(projectId, environment, poolName) {
853
+ return [...this.scaleDecisions.values()].filter((entry) => entry.projectId === projectId && entry.environment === environment && entry.poolName === poolName).sort((left, right) => right.createdAt.localeCompare(left.createdAt))[0] ?? null;
854
+ }
753
855
  }
754
856
  class CloudflareD1AgentDatabase {
755
857
  constructor(db) {
@@ -1102,6 +1204,36 @@ class CloudflareD1AgentDatabase {
1102
1204
  graph: workDay?.graphVersion ? { graphVersion: workDay.graphVersion } : null
1103
1205
  };
1104
1206
  }
1207
+ getWorkPolicy(projectId, environment = "local") {
1208
+ return this.operational.getWorkPolicy(projectId, environment);
1209
+ }
1210
+ upsertWorkPolicy(request) {
1211
+ return this.operational.upsertWorkPolicy(request);
1212
+ }
1213
+ listPriorityOverrides(projectId) {
1214
+ return this.operational.listPriorityOverrides(projectId);
1215
+ }
1216
+ upsertPriorityOverride(request) {
1217
+ return this.operational.upsertPriorityOverride(request);
1218
+ }
1219
+ createPrioritySnapshot(request) {
1220
+ return this.operational.createPrioritySnapshot(request);
1221
+ }
1222
+ getLatestPrioritySnapshot(projectId, workDayId) {
1223
+ return this.operational.getLatestPrioritySnapshot(projectId, workDayId);
1224
+ }
1225
+ recordTaskCredits(request) {
1226
+ return this.operational.recordTaskCredits(request);
1227
+ }
1228
+ listTaskCredits(workDayId) {
1229
+ return this.operational.listTaskCredits(workDayId);
1230
+ }
1231
+ recordScaleDecision(request) {
1232
+ return this.operational.recordScaleDecision(request);
1233
+ }
1234
+ getLatestScaleDecision(projectId, environment, poolName) {
1235
+ return this.operational.getLatestScaleDecision(projectId, environment, poolName);
1236
+ }
1105
1237
  }
1106
1238
  export {
1107
1239
  CloudflareD1AgentDatabase,
package/dist/index.d.ts CHANGED
@@ -1,5 +1,11 @@
1
1
  export { AgentSdk, ScopedAgentSdk } from './sdk.ts';
2
2
  export { ContentGraphRuntime } from './graph.ts';
3
+ export { projectConnectionModeFromHosting } from './sdk-types.ts';
4
+ export { createControlPlaneReporter } from './control-plane.ts';
5
+ export { ControlPlaneClient } from './control-plane-client.ts';
6
+ export { PUBLISHED_CONTENT_MANIFEST_SCHEMA_VERSION, EDITORIAL_PREVIEW_COOKIE, TeamScopedR2OverlayContentRuntimeProvider, TeamScopedR2OverlayContentPublishProvider, createTeamScopedR2OverlayContentRuntimeProvider, createTeamScopedR2OverlayContentPublishProvider, isTeamScopedR2ContentEnabled, parsePublishedCollectionIndex, parsePublishedContentManifest, parsePublishedOverlayManifest, readPublishedContentManifest, readPublishedOverlayManifest, resolveCloudflareR2Bucket, resolvePublishedContentBucketBinding, resolvePublishedContentManifestKey, resolvePublishedContentPreviewRoot, resolvePublishedContentPreviewTtlHours, resolveTeamScopedContentLocator, signEditorialPreviewToken, verifyEditorialPreviewToken, } from './platform/published-content.ts';
7
+ export { createFilesystemContentSource, createPublishedContentPipeline, } from './platform/published-content-pipeline.ts';
8
+ export { loadTreeseedManifest, loadTreeseedTenantManifest, resolveTreeseedTenantRoot, getTenantContentRoot, tenantFeatureEnabled, tenantModelRendered, } from './platform/tenant-config.ts';
3
9
  export { parseGraphDsl } from './graph/dsl.ts';
4
10
  export { createDefaultGraphRankingProvider, DEFAULT_GRAPH_RANKING_PROVIDER } from './graph/ranking.ts';
5
11
  export { BUILTIN_MODEL_REGISTRY, MODEL_REGISTRY, buildBuiltinModelRegistry, buildModelRegistry, buildScopedModelRegistry, mergeModelRegistries, resolveModelDefinition, } from './model-registry.ts';
@@ -15,11 +21,15 @@ export { TRESEED_OPERATION_SPECS, findTreeseedOperation, listTreeseedOperationNa
15
21
  export { TreeseedOperationsSdk } from './operations/runtime.ts';
16
22
  export { TreeseedWorkflowSdk } from './workflow.ts';
17
23
  export { getTreeseedVerifyDriverStatus, runTreeseedVerifyDriver } from './verification.ts';
18
- export type { SdkContentEntry, SdkDispatchCapability, SdkDispatchConfig, SdkDispatchCredentialSource, SdkDispatchExecutionClass, SdkDispatchNamespace, SdkDispatchPolicy, SdkDispatchRequest, SdkDispatchResult, SdkDispatchTarget, SdkCursorEntity, SdkFilterCondition, SdkFollowRequest, SdkGraphEdge, SdkGraphEdgeType, SdkGraphDslRelation, SdkGraphDslParseResult, SdkGraphModelConfig, SdkGraphNode, SdkGraphNodeType, SdkGraphPathExplanation, SdkGraphQueryStage, SdkGraphQueryView, SdkGraphQueryOptions, SdkGraphQueryRequest, SdkGraphQueryResult, SdkGraphRankingBuildInput, SdkGraphRankingDiagnostics, SdkGraphRankingIndex, SdkGraphRankingNodeResult, SdkGraphRankingProvider, SdkGraphRankingQueryRequest, SdkGraphRankingQueryResult, SdkGraphRankingSearchRequest, SdkGraphRefreshPayload, SdkGraphRefreshRequest, SdkGraphSearchOptions, SdkGraphSearchResult, SdkGraphSeed, SdkGraphSeedResolution, SdkGraphTraversalResult, SdkGraphWhereFilter, SdkContextPack, SdkContextPackRequest, SdkGetRequest, SdkJsonEnvelope, SdkLeaseEntity, SdkManagerContextPayload, SdkMessageEntity, SdkModelFieldBinding, SdkModelDefinition, SdkModelRegistry, SdkModelName, SdkMutationRequest, SdkOperation, SdkPickRequest, SdkPickResult, SdkQueueMessageEnvelope, SdkRunEntity, SdkSearchRequest, SdkTaskEntity, SdkTaskEventEntity, SdkTaskOutputEntity, SdkWorkDayEntity, SdkGraphRunEntity, SdkReportEntity, SdkSubscriptionEntity, SdkTemplateCatalogEntry, SdkTemplateCatalogPublisher, SdkTemplateCatalogResponse, SdkTemplateCatalogSource, SdkUpdateRequest, ProjectCapabilityGrant, ProjectConnection, ProjectConnectionMode, ProjectExecutionOwner, ProjectRunnerRegistrationState, RemoteJob, RemoteJobEvent, RemoteJobStatus, } from './sdk-types.ts';
24
+ export type { SdkContentEntry, SdkDispatchCapability, SdkDispatchConfig, SdkDispatchCredentialSource, SdkDispatchExecutionClass, SdkDispatchNamespace, SdkDispatchPolicy, SdkDispatchRequest, SdkDispatchResult, SdkDispatchTarget, SdkCursorEntity, SdkFilterCondition, SdkFollowRequest, SdkGraphEdge, SdkGraphEdgeType, SdkGraphDslRelation, SdkGraphDslParseResult, SdkGraphModelConfig, SdkGraphNode, SdkGraphNodeType, SdkGraphPathExplanation, SdkGraphQueryStage, SdkGraphQueryView, SdkGraphQueryOptions, SdkGraphQueryRequest, SdkGraphQueryResult, SdkGraphRankingBuildInput, SdkGraphRankingDiagnostics, SdkGraphRankingIndex, SdkGraphRankingNodeResult, SdkGraphRankingProvider, SdkGraphRankingQueryRequest, SdkGraphRankingQueryResult, SdkGraphRankingSearchRequest, SdkGraphRefreshPayload, SdkGraphRefreshRequest, SdkGraphSearchOptions, SdkGraphSearchResult, SdkGraphSeed, SdkGraphSeedResolution, SdkGraphTraversalResult, SdkGraphWhereFilter, SdkContextPack, SdkContextPackRequest, SdkGetRequest, SdkJsonEnvelope, SdkLeaseEntity, SdkManagerContextPayload, SdkMessageEntity, SdkModelFieldBinding, SdkModelDefinition, SdkModelRegistry, SdkModelName, SdkMutationRequest, SdkOperation, SdkPickRequest, SdkPickResult, SdkQueueMessageEnvelope, SdkRunEntity, SdkSearchRequest, SdkTaskEntity, SdkTaskEventEntity, SdkTaskOutputEntity, SdkWorkDayEntity, SdkGraphRunEntity, SdkReportEntity, SdkSubscriptionEntity, SdkTemplateCatalogEntry, SdkTemplateCatalogPublisher, SdkTemplateCatalogResponse, SdkTemplateCatalogSource, SdkUpdateRequest, ProjectCapabilityGrant, ProjectConnection, ProjectConnectionMode, ProjectDeployment, ProjectDeploymentKind, ProjectDeploymentStatus, ProjectEnvironment, ProjectExecutionOwner, ProjectHosting, ProjectInfrastructureResource, ProjectInfrastructureResourceKind, ProjectInfrastructureResourceProvider, ProjectRunnerRegistrationState, RemoteJob, RemoteJobEvent, RemoteJobStatus, AgentPool, AgentPoolAutoscalePolicy, AgentPoolRegistration, AgentPoolScaleDecision, AgentPoolStatus, CatalogArtifactVersion, CatalogItem, CatalogItemFilters, CatalogItemOfferMode, ProjectEnvironmentName, ProjectWorkdaySummary, TreeseedHostingKind, TreeseedHostingRegistration, PriorityOverride, WorkdayWindow, WorkdaySchedule, TaskCreditWeight, TaskCreditBudget, WorkdayPolicy, PrioritySnapshotItem, PrioritySnapshot, TaskCreditLedgerEntry, ScaleDecision, TeamStorageLocator, UpsertAgentPoolRequest, UpsertCatalogArtifactVersionRequest, UpsertCatalogItemRequest, UpsertProjectEnvironmentRequest, UpsertProjectHostingRequest, UpsertProjectInfrastructureResourceRequest, UpsertTeamStorageLocatorRequest, CreateProjectDeploymentRequest, RecordAgentPoolRegistrationRequest, WorkerPoolScaleResult, WorkerPoolScaler, } from './sdk-types.ts';
25
+ export type { ControlPlaneAgentPoolHeartbeat, ControlPlaneDeploymentReport, ControlPlaneEnvironmentReport, ControlPlaneReporter, ControlPlaneReporterKind, ControlPlaneResourceReport, ControlPlaneScaleDecisionReport, ControlPlaneWorkdaySummaryReport, } from './control-plane.ts';
26
+ export type { ControlPlaneClientOptions } from './control-plane-client.ts';
19
27
  export type { TreeseedFieldAliasBinding, TreeseedFieldAliasRegistry, } from './field-aliases.ts';
20
28
  export type * from './operations-types.ts';
21
29
  export type * from './workflow.ts';
22
30
  export type { AgentDatabase } from './d1-store.ts';
23
31
  export type { D1DatabaseLike, D1PreparedStatementLike } from './types/cloudflare.ts';
32
+ export type { ContentPublishProvider, ContentRuntimeProvider, CatalogIndexEntry, EditorialPreviewTokenPayload, HostedContentMode, PublishContentObjectInput, PublishOverlayInput, PublishContentRevisionInput, PublishContentRevisionResult, PublishOverlayResult, PromoteOverlayInput, PublishedArtifactVersion, PublishedCollectionIndex, PublishedContentEntry, PublishedContentManifest, PublishedContentObjectPointer, PublishedRuntimePointers, PublishedOverlayManifest, PublishedContentVisibility, TeamScopedContentLocator, } from './platform/published-content.ts';
33
+ export type { ArtifactBuilder, ArtifactBuilderResult, CollectionIndexBuilder, ContentSource, ContentSourceEntry, EntryRenderer, PublishedContentPipeline, PublishedContentPipelineContext, RuntimeBundleBuilder, RuntimeBundleBuilderResult, RenderedContentEntry, } from './platform/published-content-pipeline.ts';
24
34
  export { CloudflareHttpD1Database } from './d1-http.ts';
25
35
  export type * from './remote.ts';
package/dist/index.js CHANGED
@@ -1,5 +1,42 @@
1
1
  import { AgentSdk, ScopedAgentSdk } from "./sdk.js";
2
2
  import { ContentGraphRuntime } from "./graph.js";
3
+ import { projectConnectionModeFromHosting } from "./sdk-types.js";
4
+ import { createControlPlaneReporter } from "./control-plane.js";
5
+ import { ControlPlaneClient } from "./control-plane-client.js";
6
+ import {
7
+ PUBLISHED_CONTENT_MANIFEST_SCHEMA_VERSION,
8
+ EDITORIAL_PREVIEW_COOKIE,
9
+ TeamScopedR2OverlayContentRuntimeProvider,
10
+ TeamScopedR2OverlayContentPublishProvider,
11
+ createTeamScopedR2OverlayContentRuntimeProvider,
12
+ createTeamScopedR2OverlayContentPublishProvider,
13
+ isTeamScopedR2ContentEnabled,
14
+ parsePublishedCollectionIndex,
15
+ parsePublishedContentManifest,
16
+ parsePublishedOverlayManifest,
17
+ readPublishedContentManifest,
18
+ readPublishedOverlayManifest,
19
+ resolveCloudflareR2Bucket,
20
+ resolvePublishedContentBucketBinding,
21
+ resolvePublishedContentManifestKey,
22
+ resolvePublishedContentPreviewRoot,
23
+ resolvePublishedContentPreviewTtlHours,
24
+ resolveTeamScopedContentLocator,
25
+ signEditorialPreviewToken,
26
+ verifyEditorialPreviewToken
27
+ } from "./platform/published-content.js";
28
+ import {
29
+ createFilesystemContentSource,
30
+ createPublishedContentPipeline
31
+ } from "./platform/published-content-pipeline.js";
32
+ import {
33
+ loadTreeseedManifest,
34
+ loadTreeseedTenantManifest,
35
+ resolveTreeseedTenantRoot,
36
+ getTenantContentRoot,
37
+ tenantFeatureEnabled,
38
+ tenantModelRendered
39
+ } from "./platform/tenant-config.js";
3
40
  import { parseGraphDsl } from "./graph/dsl.js";
4
41
  import { createDefaultGraphRankingProvider, DEFAULT_GRAPH_RANKING_PROVIDER } from "./graph/ranking.js";
5
42
  import {
@@ -68,8 +105,11 @@ export {
68
105
  CloudflareQueuePullClient,
69
106
  CloudflareQueuePushClient,
70
107
  ContentGraphRuntime,
108
+ ControlPlaneClient,
71
109
  DEFAULT_GRAPH_RANKING_PROVIDER,
110
+ EDITORIAL_PREVIEW_COOKIE,
72
111
  MODEL_REGISTRY,
112
+ PUBLISHED_CONTENT_MANIFEST_SCHEMA_VERSION,
73
113
  RemoteTemplateCatalogClient,
74
114
  RemoteTreeseedAuthClient,
75
115
  RemoteTreeseedClient,
@@ -82,6 +122,8 @@ export {
82
122
  TREESEED_REMOTE_CONTRACT_HEADER,
83
123
  TREESEED_REMOTE_CONTRACT_VERSION,
84
124
  TRESEED_OPERATION_SPECS,
125
+ TeamScopedR2OverlayContentPublishProvider,
126
+ TeamScopedR2OverlayContentRuntimeProvider,
85
127
  TreeseedOperationsSdk,
86
128
  TreeseedWorkflowSdk,
87
129
  buildBuiltinModelRegistry,
@@ -89,16 +131,25 @@ export {
89
131
  buildModelRegistry,
90
132
  buildScopedModelRegistry,
91
133
  canonicalizeFrontmatter,
134
+ createControlPlaneReporter,
92
135
  createDefaultGraphRankingProvider,
136
+ createFilesystemContentSource,
137
+ createPublishedContentPipeline,
138
+ createTeamScopedR2OverlayContentPublishProvider,
139
+ createTeamScopedR2OverlayContentRuntimeProvider,
93
140
  executeSdkOperation,
94
141
  findDispatchCapability,
95
142
  findSdkOperation,
96
143
  findTreeseedOperation,
144
+ getTenantContentRoot,
97
145
  getTreeseedVerifyDriverStatus,
146
+ isTeamScopedR2ContentEnabled,
98
147
  listSdkDispatchCapabilities,
99
148
  listSdkOperationNames,
100
149
  listTreeseedOperationNames,
101
150
  listWorkflowDispatchCapabilities,
151
+ loadTreeseedManifest,
152
+ loadTreeseedTenantManifest,
102
153
  mergeModelRegistries,
103
154
  normalizeAgentCliOptions,
104
155
  normalizeAliasedRecord,
@@ -107,13 +158,30 @@ export {
107
158
  normalizeRecordToCanonicalShape,
108
159
  normalizeSortFields,
109
160
  parseGraphDsl,
161
+ parsePublishedCollectionIndex,
162
+ parsePublishedContentManifest,
163
+ parsePublishedOverlayManifest,
110
164
  parseTemplateCatalogResponse,
111
165
  preprocessAliasedRecord,
166
+ projectConnectionModeFromHosting,
112
167
  readCanonicalFieldValue,
168
+ readPublishedContentManifest,
169
+ readPublishedOverlayManifest,
113
170
  resolveAliasedField,
171
+ resolveCloudflareR2Bucket,
114
172
  resolveModelDefinition,
115
173
  resolveModelField,
174
+ resolvePublishedContentBucketBinding,
175
+ resolvePublishedContentManifestKey,
176
+ resolvePublishedContentPreviewRoot,
177
+ resolvePublishedContentPreviewTtlHours,
116
178
  resolveSdkRecordVersion,
179
+ resolveTeamScopedContentLocator,
180
+ resolveTreeseedTenantRoot,
117
181
  runTreeseedVerifyDriver,
118
- validateModelFieldAliases
182
+ signEditorialPreviewToken,
183
+ tenantFeatureEnabled,
184
+ tenantModelRendered,
185
+ validateModelFieldAliases,
186
+ verifyEditorialPreviewToken
119
187
  };
@@ -273,6 +273,7 @@ export declare function syncTreeseedRailwayEnvironment({ tenantRoot, scope, dryR
273
273
  baseUrl: any;
274
274
  environmentName: any;
275
275
  secrets: string[];
276
+ variables: string[];
276
277
  dryRun: boolean;
277
278
  } | null)[];
278
279
  };
@@ -290,9 +291,12 @@ export declare function initializeTreeseedPersistentEnvironment({ tenantRoot, sc
290
291
  workerName: any;
291
292
  siteUrl: any;
292
293
  accountId: any;
294
+ pages: any;
293
295
  formGuardKv: any;
294
296
  sessionKv: any;
295
297
  siteDataDb: any;
298
+ queue: any;
299
+ content: any;
296
300
  };
297
301
  secrets: string[];
298
302
  };
@@ -350,6 +354,12 @@ export declare function finalizeTreeseedConfig({ tenantRoot, scopes, sync, env,
350
354
  }>;
351
355
  connectionChecks: ReturnType<typeof checkTreeseedProviderConnections>[];
352
356
  validationByScope: Record<TreeseedConfigScope, ReturnType<typeof validateTreeseedEnvironmentValues>>;
357
+ readinessByScope: Record<TreeseedConfigScope, {
358
+ configured: boolean;
359
+ provisioned: boolean;
360
+ deployable: boolean;
361
+ checks: Record<string, unknown>;
362
+ }>;
353
363
  };
354
364
  export declare function collectTreeseedPrintEnvReport({ tenantRoot, scope, env, revealSecrets, }: {
355
365
  tenantRoot: string;
@@ -19,9 +19,11 @@ import {
19
19
  markManagedServicesInitialized,
20
20
  markDeploymentInitialized,
21
21
  provisionCloudflareResources,
22
- syncCloudflareSecrets
22
+ syncCloudflareSecrets,
23
+ verifyProvisionedCloudflareResources
23
24
  } from "./deploy.js";
24
25
  import { maybeResolveGitHubRepositorySlug } from "./github-automation.js";
26
+ import { validateRailwayDeployPrerequisites } from "./railway-deploy.js";
25
27
  import { loadCliDeployConfig, resolveWranglerBin, withProcessCwd } from "./runtime-tools.js";
26
28
  const MACHINE_CONFIG_RELATIVE_PATH = ".treeseed/config/machine.yaml";
27
29
  const MACHINE_KEY_HOME_RELATIVE_PATH = ".treeseed/config/machine.key";
@@ -1181,6 +1183,7 @@ function syncTreeseedRailwayEnvironment({ tenantRoot, scope = "prod", dryRun = f
1181
1183
  const values = resolveTreeseedMachineEnvironmentValues(tenantRoot, scope);
1182
1184
  const registry = collectTreeseedEnvironmentContext(tenantRoot);
1183
1185
  const railwaySecretNames = registry.entries.filter((entry) => entry.scopes.includes(scope) && entry.targets.includes("railway-secret")).map((entry) => entry.id).filter((key) => typeof values[key] === "string" && values[key].length > 0);
1186
+ const railwayVariableNames = registry.entries.filter((entry) => entry.scopes.includes(scope) && entry.targets.includes("railway-var")).map((entry) => entry.id).filter((key) => typeof values[key] === "string" && values[key].length > 0);
1184
1187
  const services = ["api", "agents", "manager", "worker", "runner", "workdayStart", "workdayReport"].map((serviceKey) => {
1185
1188
  const service = deployConfig.services?.[serviceKey];
1186
1189
  if (!service || service.enabled === false || (service.provider ?? "railway") !== "railway") {
@@ -1198,6 +1201,7 @@ function syncTreeseedRailwayEnvironment({ tenantRoot, scope = "prod", dryRun = f
1198
1201
  baseUrl: environment?.baseUrl ?? service.publicBaseUrl ?? "(unset)",
1199
1202
  environmentName: environment?.railwayEnvironment ?? scope,
1200
1203
  secrets: railwaySecretNames,
1204
+ variables: railwayVariableNames,
1201
1205
  dryRun
1202
1206
  };
1203
1207
  }).filter(Boolean);
@@ -1208,6 +1212,12 @@ function syncTreeseedRailwayEnvironment({ tenantRoot, scope = "prod", dryRun = f
1208
1212
  { cwd: service.rootDir, dryRun, input: values[key] }
1209
1213
  );
1210
1214
  }
1215
+ for (const key of service.variables) {
1216
+ runRailway(
1217
+ ["variable", "set", "--service", service.serviceName || service.serviceId, "--environment", service.environmentName, "--stdin", "--skip-deploys", key],
1218
+ { cwd: service.rootDir, dryRun, input: values[key] }
1219
+ );
1220
+ }
1211
1221
  }
1212
1222
  return {
1213
1223
  scope,
@@ -1230,6 +1240,40 @@ function initializeTreeseedPersistentEnvironment({ tenantRoot, scope = "prod", d
1230
1240
  secrets: syncedSecrets
1231
1241
  };
1232
1242
  }
1243
+ function summarizePersistentReadiness(tenantRoot, scope, validation, connectionChecks) {
1244
+ if (scope === "local") {
1245
+ return {
1246
+ configured: validation.ok,
1247
+ provisioned: true,
1248
+ deployable: validation.ok,
1249
+ checks: {
1250
+ validation: validation.ok,
1251
+ connections: connectionChecks.every((check) => check.ready || check.skipped)
1252
+ }
1253
+ };
1254
+ }
1255
+ const cloudflare = verifyProvisionedCloudflareResources(tenantRoot, { scope });
1256
+ let railwayReady = true;
1257
+ try {
1258
+ validateRailwayDeployPrerequisites(tenantRoot, scope);
1259
+ } catch {
1260
+ railwayReady = false;
1261
+ }
1262
+ const configured = validation.ok;
1263
+ const provisioned = cloudflare.ok && railwayReady;
1264
+ const deployable = configured && provisioned && connectionChecks.every((check) => check.ready || check.skipped);
1265
+ return {
1266
+ configured,
1267
+ provisioned,
1268
+ deployable,
1269
+ checks: {
1270
+ validation: validation.ok,
1271
+ connections: connectionChecks.every((check) => check.ready || check.skipped),
1272
+ cloudflare: cloudflare.checks,
1273
+ railway: railwayReady
1274
+ }
1275
+ };
1276
+ }
1233
1277
  function colorize(value, code) {
1234
1278
  return `\x1B[${code}m${value}\x1B[0m`;
1235
1279
  }
@@ -1413,7 +1457,8 @@ function finalizeTreeseedConfig({
1413
1457
  synced: {},
1414
1458
  initialized: [],
1415
1459
  connectionChecks: [],
1416
- validationByScope: {}
1460
+ validationByScope: {},
1461
+ readinessByScope: {}
1417
1462
  };
1418
1463
  for (const scope of scopes) {
1419
1464
  const validation = validateTreeseedEnvironmentValues({
@@ -1460,6 +1505,19 @@ ${details}`);
1460
1505
  if (sync === "railway" || sync === "all") {
1461
1506
  summary.synced.railway = syncTreeseedRailwayEnvironment({ tenantRoot, scope: scopes.at(-1) ?? "prod" });
1462
1507
  }
1508
+ for (const scope of scopes) {
1509
+ summary.readinessByScope[scope] = summarizePersistentReadiness(
1510
+ tenantRoot,
1511
+ scope,
1512
+ summary.validationByScope[scope],
1513
+ summary.connectionChecks.find((report) => report.scope === scope)?.checks ?? []
1514
+ );
1515
+ if (scope !== "local" && summary.readinessByScope[scope].deployable !== true) {
1516
+ throw new Error(
1517
+ `Treeseed config readiness failed for ${scope}: configuration is not deployable.`
1518
+ );
1519
+ }
1520
+ }
1463
1521
  return summary;
1464
1522
  }
1465
1523
  function collectTreeseedPrintEnvReport({
@@ -20,6 +20,13 @@ export declare function ensureGeneratedWranglerConfig(tenantRoot: any, options?:
20
20
  slug: string;
21
21
  siteUrl: string;
22
22
  contactEmail: string;
23
+ hosting: {
24
+ kind: string;
25
+ registration: string;
26
+ marketBaseUrl: string | undefined;
27
+ teamId: string | undefined;
28
+ projectId: string | undefined;
29
+ } | undefined;
23
30
  cloudflare: {
24
31
  accountId: string;
25
32
  workerName: string | undefined;
@@ -27,6 +34,21 @@ export declare function ensureGeneratedWranglerConfig(tenantRoot: any, options?:
27
34
  dlqName: string | undefined;
28
35
  d1Binding: string | undefined;
29
36
  queueBinding: string | undefined;
37
+ pages: {
38
+ projectName: string | undefined;
39
+ previewProjectName: string | undefined;
40
+ productionBranch: string;
41
+ stagingBranch: string;
42
+ buildOutputDir: string | undefined;
43
+ } | undefined;
44
+ r2: {
45
+ binding: string | undefined;
46
+ bucketName: string | undefined;
47
+ publicBaseUrl: string | undefined;
48
+ manifestKeyTemplate: string;
49
+ previewRootTemplate: string;
50
+ previewTtlHours: number;
51
+ } | undefined;
30
52
  };
31
53
  plugins: {
32
54
  package: string;
@@ -48,6 +70,8 @@ export declare function ensureGeneratedWranglerConfig(tenantRoot: any, options?:
48
70
  };
49
71
  deploy: string;
50
72
  content: {
73
+ runtime: string;
74
+ publish: string;
51
75
  docs: string;
52
76
  };
53
77
  site: string;
@@ -69,6 +93,7 @@ export declare function ensureGeneratedWranglerConfig(tenantRoot: any, options?:
69
93
  rootDir: string | undefined;
70
94
  buildCommand: string | undefined;
71
95
  startCommand: string | undefined;
96
+ schedule: any;
72
97
  };
73
98
  environments: {
74
99
  local: {
@@ -122,6 +147,13 @@ export declare function validateDeployPrerequisites(tenantRoot: any, { requireRe
122
147
  slug: string;
123
148
  siteUrl: string;
124
149
  contactEmail: string;
150
+ hosting: {
151
+ kind: string;
152
+ registration: string;
153
+ marketBaseUrl: string | undefined;
154
+ teamId: string | undefined;
155
+ projectId: string | undefined;
156
+ } | undefined;
125
157
  cloudflare: {
126
158
  accountId: string;
127
159
  workerName: string | undefined;
@@ -129,6 +161,21 @@ export declare function validateDeployPrerequisites(tenantRoot: any, { requireRe
129
161
  dlqName: string | undefined;
130
162
  d1Binding: string | undefined;
131
163
  queueBinding: string | undefined;
164
+ pages: {
165
+ projectName: string | undefined;
166
+ previewProjectName: string | undefined;
167
+ productionBranch: string;
168
+ stagingBranch: string;
169
+ buildOutputDir: string | undefined;
170
+ } | undefined;
171
+ r2: {
172
+ binding: string | undefined;
173
+ bucketName: string | undefined;
174
+ publicBaseUrl: string | undefined;
175
+ manifestKeyTemplate: string;
176
+ previewRootTemplate: string;
177
+ previewTtlHours: number;
178
+ } | undefined;
132
179
  };
133
180
  plugins: {
134
181
  package: string;
@@ -150,6 +197,8 @@ export declare function validateDeployPrerequisites(tenantRoot: any, { requireRe
150
197
  };
151
198
  deploy: string;
152
199
  content: {
200
+ runtime: string;
201
+ publish: string;
153
202
  docs: string;
154
203
  };
155
204
  site: string;
@@ -171,6 +220,7 @@ export declare function validateDeployPrerequisites(tenantRoot: any, { requireRe
171
220
  rootDir: string | undefined;
172
221
  buildCommand: string | undefined;
173
222
  startCommand: string | undefined;
223
+ schedule: any;
174
224
  };
175
225
  environments: {
176
226
  local: {
@@ -205,6 +255,13 @@ export declare function validateDestroyPrerequisites(tenantRoot: any, { requireR
205
255
  slug: string;
206
256
  siteUrl: string;
207
257
  contactEmail: string;
258
+ hosting: {
259
+ kind: string;
260
+ registration: string;
261
+ marketBaseUrl: string | undefined;
262
+ teamId: string | undefined;
263
+ projectId: string | undefined;
264
+ } | undefined;
208
265
  cloudflare: {
209
266
  accountId: string;
210
267
  workerName: string | undefined;
@@ -212,6 +269,21 @@ export declare function validateDestroyPrerequisites(tenantRoot: any, { requireR
212
269
  dlqName: string | undefined;
213
270
  d1Binding: string | undefined;
214
271
  queueBinding: string | undefined;
272
+ pages: {
273
+ projectName: string | undefined;
274
+ previewProjectName: string | undefined;
275
+ productionBranch: string;
276
+ stagingBranch: string;
277
+ buildOutputDir: string | undefined;
278
+ } | undefined;
279
+ r2: {
280
+ binding: string | undefined;
281
+ bucketName: string | undefined;
282
+ publicBaseUrl: string | undefined;
283
+ manifestKeyTemplate: string;
284
+ previewRootTemplate: string;
285
+ previewTtlHours: number;
286
+ } | undefined;
215
287
  };
216
288
  plugins: {
217
289
  package: string;
@@ -233,6 +305,8 @@ export declare function validateDestroyPrerequisites(tenantRoot: any, { requireR
233
305
  };
234
306
  deploy: string;
235
307
  content: {
308
+ runtime: string;
309
+ publish: string;
236
310
  docs: string;
237
311
  };
238
312
  site: string;
@@ -254,6 +328,7 @@ export declare function validateDestroyPrerequisites(tenantRoot: any, { requireR
254
328
  rootDir: string | undefined;
255
329
  buildCommand: string | undefined;
256
330
  startCommand: string | undefined;
331
+ schedule: any;
257
332
  };
258
333
  environments: {
259
334
  local: {
@@ -294,9 +369,12 @@ export declare function destroyCloudflareResources(tenantRoot: any, options?: {}
294
369
  workerName: any;
295
370
  siteUrl: any;
296
371
  accountId: any;
372
+ pages: any;
297
373
  formGuardKv: any;
298
374
  sessionKv: any;
299
375
  siteDataDb: any;
376
+ queue: any;
377
+ content: any;
300
378
  };
301
379
  operations: {
302
380
  worker: {
@@ -351,11 +429,28 @@ export declare function provisionCloudflareResources(tenantRoot: any, options?:
351
429
  workerName: any;
352
430
  siteUrl: any;
353
431
  accountId: any;
432
+ pages: any;
354
433
  formGuardKv: any;
355
434
  sessionKv: any;
356
435
  siteDataDb: any;
436
+ queue: any;
437
+ content: any;
357
438
  };
358
439
  export declare function syncCloudflareSecrets(tenantRoot: any, options?: {}): string[];
440
+ export declare function verifyProvisionedCloudflareResources(tenantRoot: any, options?: {}): {
441
+ ok: boolean;
442
+ target: any;
443
+ checks: {
444
+ pages: boolean;
445
+ formGuardKv: boolean;
446
+ sessionKv: boolean;
447
+ d1: boolean;
448
+ queue: boolean;
449
+ dlq: boolean;
450
+ r2: boolean;
451
+ };
452
+ state: any;
453
+ };
359
454
  export declare function runRemoteD1Migrations(tenantRoot: any, options?: {}): {
360
455
  databaseName: any;
361
456
  dryRun: boolean;