@treeseed/sdk 0.4.8 → 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 (73) hide show
  1. package/README.md +1 -1
  2. package/dist/control-plane-client.d.ts +45 -0
  3. package/dist/control-plane-client.js +229 -0
  4. package/dist/control-plane.d.ts +94 -0
  5. package/dist/control-plane.js +125 -0
  6. package/dist/d1-store.d.ts +56 -1
  7. package/dist/d1-store.js +132 -0
  8. package/dist/dispatch.d.ts +4 -0
  9. package/dist/dispatch.js +180 -0
  10. package/dist/index.d.ts +14 -2
  11. package/dist/index.js +94 -4
  12. package/dist/operations/services/config-runtime.d.ts +10 -0
  13. package/dist/operations/services/config-runtime.js +62 -4
  14. package/dist/operations/services/deploy.d.ts +95 -3
  15. package/dist/operations/services/deploy.js +351 -10
  16. package/dist/operations/services/github-automation.d.ts +37 -1
  17. package/dist/operations/services/github-automation.js +71 -14
  18. package/dist/operations/services/project-platform.d.ts +835 -0
  19. package/dist/operations/services/project-platform.js +782 -0
  20. package/dist/operations/services/railway-deploy.d.ts +113 -18
  21. package/dist/operations/services/railway-deploy.js +357 -8
  22. package/dist/operations/services/runtime-tools.d.ts +25 -1
  23. package/dist/operations/services/runtime-tools.js +66 -5
  24. package/dist/operations/services/template-registry.d.ts +1 -1
  25. package/dist/operations/services/template-registry.js +17 -3
  26. package/dist/platform/books-data.d.ts +3 -4
  27. package/dist/platform/books-data.js +30 -4
  28. package/dist/platform/contracts.d.ts +56 -4
  29. package/dist/platform/deploy-config.js +109 -4
  30. package/dist/platform/deploy-runtime.d.ts +2 -0
  31. package/dist/platform/deploy-runtime.js +9 -1
  32. package/dist/platform/env.yaml +677 -0
  33. package/dist/platform/environment.js +57 -2
  34. package/dist/platform/plugin.d.ts +8 -0
  35. package/dist/platform/plugins/constants.d.ts +2 -0
  36. package/dist/platform/plugins/constants.js +2 -0
  37. package/dist/platform/plugins/runtime.d.ts +2 -0
  38. package/dist/platform/plugins/runtime.js +9 -1
  39. package/dist/platform/plugins.d.ts +1 -1
  40. package/dist/platform/plugins.js +4 -0
  41. package/dist/platform/published-content-pipeline.d.ts +84 -0
  42. package/dist/platform/published-content-pipeline.js +543 -0
  43. package/dist/platform/published-content.d.ts +223 -0
  44. package/dist/platform/published-content.js +588 -0
  45. package/dist/platform/tenant/runtime-config.d.ts +1 -1
  46. package/dist/platform/tenant/runtime-config.js +34 -1
  47. package/dist/platform/tenant-config.d.ts +2 -1
  48. package/dist/platform/tenant-config.js +17 -1
  49. package/dist/platform/utils/site-config-schema.js +104 -0
  50. package/dist/plugin-default.d.ts +2 -0
  51. package/dist/plugin-default.js +2 -0
  52. package/dist/remote.d.ts +65 -9
  53. package/dist/remote.js +104 -28
  54. package/dist/scripts/check-build-warnings.js +50 -0
  55. package/dist/scripts/config-treeseed.js +7 -0
  56. package/dist/scripts/tenant-workflow-action.js +71 -0
  57. package/dist/sdk-dispatch.d.ts +12 -0
  58. package/dist/sdk-dispatch.js +142 -0
  59. package/dist/sdk-types.d.ts +579 -7
  60. package/dist/sdk-types.js +53 -1
  61. package/dist/sdk.d.ts +17 -1
  62. package/dist/sdk.js +109 -0
  63. package/dist/stores/operational-store.d.ts +22 -2
  64. package/dist/stores/operational-store.js +235 -0
  65. package/dist/template-catalog.js +8 -1
  66. package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +20 -0
  67. package/dist/types/cloudflare.d.ts +23 -0
  68. package/dist/workflow/operations.d.ts +12 -3
  69. package/dist/workflow/policy.d.ts +1 -1
  70. package/dist/workflow-state.js +2 -1
  71. package/package.json +7 -2
  72. package/templates/github/deploy.workflow.yml +442 -0
  73. package/templates/github/hosted-project.workflow.yml +77 -0
package/README.md CHANGED
@@ -168,7 +168,7 @@ const scoped = sdk.scopeForAgent({
168
168
  The package also exports:
169
169
 
170
170
  - workflow helpers such as `TreeseedWorkflowSdk`
171
- - gateway and queue clients such as `TreeseedGatewayClient` and `CloudflareQueuePullClient`
171
+ - remote and queue clients such as `RemoteTreeseedClient`, `CloudflareQueuePullClient`, and `CloudflareQueuePushClient`
172
172
  - model registry, field, and filter utilities
173
173
  - plugin/runtime types and helpers
174
174
 
@@ -0,0 +1,45 @@
1
+ import type { AgentPool, AgentPoolRegistration, AgentPoolScaleDecision, CatalogArtifactVersion, CatalogItem, CatalogItemFilters, CreateProjectDeploymentRequest, PriorityOverride, PrioritySnapshot, ProjectDeployment, ProjectEnvironment, ProjectEnvironmentName, ProjectHosting, ProjectInfrastructureResource, ProjectWorkdaySummary, RecordAgentPoolRegistrationRequest, ScaleDecision, TeamStorageLocator, UpsertAgentPoolRequest, UpsertCatalogArtifactVersionRequest, UpsertCatalogItemRequest, UpsertProjectEnvironmentRequest, UpsertProjectHostingRequest, UpsertProjectInfrastructureResourceRequest, UpsertTeamStorageLocatorRequest, WorkdayPolicy, SdkPriorityOverrideRequest, SdkUpsertWorkPolicyRequest } from './sdk-types.ts';
2
+ export interface ControlPlaneClientOptions {
3
+ baseUrl: string;
4
+ accessToken?: string | null;
5
+ fetchImpl?: typeof fetch;
6
+ }
7
+ export declare class ControlPlaneClient {
8
+ private readonly baseUrl;
9
+ private readonly accessToken;
10
+ private readonly fetchImpl;
11
+ constructor(options: ControlPlaneClientOptions);
12
+ private requestUrl;
13
+ private requestJson;
14
+ listCatalogItems(filters?: CatalogItemFilters): Promise<CatalogItem[]>;
15
+ getCatalogItem(itemId: string): Promise<CatalogItem>;
16
+ listCatalogArtifactVersions(itemId: string): Promise<CatalogArtifactVersion[]>;
17
+ upsertCatalogItem(teamId: string, input: UpsertCatalogItemRequest): Promise<CatalogItem>;
18
+ upsertCatalogArtifactVersion(itemId: string, input: UpsertCatalogArtifactVersionRequest): Promise<CatalogArtifactVersion>;
19
+ getTeamStorageLocator(teamId: string): Promise<TeamStorageLocator | null>;
20
+ upsertTeamStorageLocator(teamId: string, input: UpsertTeamStorageLocatorRequest): Promise<TeamStorageLocator>;
21
+ getProjectHosting(projectId: string): Promise<ProjectHosting | null>;
22
+ upsertProjectHosting(projectId: string, input: UpsertProjectHostingRequest): Promise<ProjectHosting>;
23
+ listProjectEnvironments(projectId: string): Promise<ProjectEnvironment[]>;
24
+ upsertProjectEnvironment(projectId: string, environment: ProjectEnvironmentName, input: UpsertProjectEnvironmentRequest): Promise<ProjectEnvironment>;
25
+ listProjectInfrastructureResources(projectId: string, environment?: ProjectEnvironmentName | null): Promise<ProjectInfrastructureResource[]>;
26
+ upsertProjectInfrastructureResource(projectId: string, input: UpsertProjectInfrastructureResourceRequest): Promise<ProjectInfrastructureResource>;
27
+ listProjectDeployments(projectId: string, environment?: ProjectEnvironmentName | null): Promise<ProjectDeployment[]>;
28
+ createProjectDeployment(projectId: string, input: CreateProjectDeploymentRequest): Promise<ProjectDeployment>;
29
+ listAgentPools(projectId: string, environment?: ProjectEnvironmentName | null): Promise<AgentPool[]>;
30
+ upsertAgentPool(projectId: string, input: UpsertAgentPoolRequest): Promise<AgentPool>;
31
+ listAgentPoolRegistrations(projectId: string, poolId: string): Promise<AgentPoolRegistration[]>;
32
+ listAgentPoolScaleDecisions(projectId: string, poolId: string): Promise<AgentPoolScaleDecision[]>;
33
+ getProjectWorkPolicy(projectId: string, environment?: ProjectEnvironmentName): Promise<WorkdayPolicy | null>;
34
+ upsertProjectWorkPolicy(projectId: string, input: SdkUpsertWorkPolicyRequest): Promise<WorkdayPolicy>;
35
+ listProjectPriorityOverrides(projectId: string): Promise<PriorityOverride[]>;
36
+ upsertProjectPriorityOverride(projectId: string, input: SdkPriorityOverrideRequest): Promise<PriorityOverride>;
37
+ listProjectPrioritySnapshots(projectId: string, workDayId?: string | null): Promise<PrioritySnapshot[]>;
38
+ recordRunnerEnvironment(projectId: string, environment: ProjectEnvironmentName, input: UpsertProjectEnvironmentRequest): Promise<ProjectEnvironment>;
39
+ recordRunnerInfrastructureResource(projectId: string, input: UpsertProjectInfrastructureResourceRequest): Promise<ProjectInfrastructureResource>;
40
+ recordRunnerDeployment(projectId: string, input: CreateProjectDeploymentRequest): Promise<ProjectDeployment>;
41
+ listRunnerDeployments(projectId: string, environment?: ProjectEnvironmentName | null): Promise<ProjectDeployment[]>;
42
+ recordRunnerAgentPoolRegistration(projectId: string, poolId: string, input: RecordAgentPoolRegistrationRequest): Promise<AgentPoolRegistration>;
43
+ recordRunnerScaleDecision(projectId: string, poolName: string, input: Pick<ScaleDecision, 'environment' | 'workDayId' | 'desiredWorkers' | 'observedQueueDepth' | 'observedActiveLeases' | 'reason' | 'metadata'>): Promise<AgentPoolScaleDecision>;
44
+ recordRunnerWorkdaySummary(projectId: string, input: ProjectWorkdaySummary): Promise<ProjectWorkdaySummary>;
45
+ }
@@ -0,0 +1,229 @@
1
+ function normalizeBaseUrl(value) {
2
+ return value.trim().replace(/\/+$/u, "");
3
+ }
4
+ class ControlPlaneClient {
5
+ baseUrl;
6
+ accessToken;
7
+ fetchImpl;
8
+ constructor(options) {
9
+ this.baseUrl = normalizeBaseUrl(options.baseUrl);
10
+ this.accessToken = typeof options.accessToken === "string" && options.accessToken.trim() ? options.accessToken.trim() : null;
11
+ this.fetchImpl = options.fetchImpl ?? fetch;
12
+ }
13
+ requestUrl(pathname, query) {
14
+ const url = new URL(pathname, `${this.baseUrl}/`);
15
+ for (const [key, value] of Object.entries(query ?? {})) {
16
+ if (typeof value === "string" && value.trim()) {
17
+ url.searchParams.set(key, value);
18
+ }
19
+ }
20
+ return url;
21
+ }
22
+ async requestJson(method, pathname, options = {}) {
23
+ const headers = new Headers({
24
+ accept: "application/json"
25
+ });
26
+ if (this.accessToken) {
27
+ headers.set("authorization", `Bearer ${this.accessToken}`);
28
+ }
29
+ if (options.body) {
30
+ headers.set("content-type", "application/json");
31
+ }
32
+ const response = await this.fetchImpl(this.requestUrl(pathname, options.query), {
33
+ method,
34
+ headers,
35
+ body: options.body ? JSON.stringify(options.body) : void 0
36
+ });
37
+ if (!response.ok) {
38
+ throw new Error(`Control-plane request failed for ${pathname}: ${response.status} ${response.statusText}`);
39
+ }
40
+ const payload = await response.json();
41
+ if (!payload.ok) {
42
+ throw new Error(`Control-plane request returned a non-ok envelope for ${pathname}.`);
43
+ }
44
+ return payload.payload;
45
+ }
46
+ listCatalogItems(filters = {}) {
47
+ return this.requestJson("GET", "/v1/catalog", {
48
+ query: {
49
+ kind: filters.kind ?? null,
50
+ teamId: filters.teamId ?? null,
51
+ slug: filters.slug ?? null
52
+ }
53
+ });
54
+ }
55
+ getCatalogItem(itemId) {
56
+ return this.requestJson("GET", `/v1/catalog/${encodeURIComponent(itemId)}`);
57
+ }
58
+ listCatalogArtifactVersions(itemId) {
59
+ return this.requestJson("GET", `/v1/catalog/${encodeURIComponent(itemId)}/artifacts`);
60
+ }
61
+ upsertCatalogItem(teamId, input) {
62
+ return this.requestJson("POST", `/v1/teams/${encodeURIComponent(teamId)}/catalog-items`, { body: input });
63
+ }
64
+ upsertCatalogArtifactVersion(itemId, input) {
65
+ return this.requestJson("POST", `/v1/catalog/${encodeURIComponent(itemId)}/artifacts`, { body: input });
66
+ }
67
+ getTeamStorageLocator(teamId) {
68
+ return this.requestJson("GET", `/v1/teams/${encodeURIComponent(teamId)}/storage`);
69
+ }
70
+ upsertTeamStorageLocator(teamId, input) {
71
+ return this.requestJson("PUT", `/v1/teams/${encodeURIComponent(teamId)}/storage`, { body: input });
72
+ }
73
+ getProjectHosting(projectId) {
74
+ return this.requestJson("GET", `/v1/projects/${encodeURIComponent(projectId)}/hosting`);
75
+ }
76
+ upsertProjectHosting(projectId, input) {
77
+ return this.requestJson("PUT", `/v1/projects/${encodeURIComponent(projectId)}/hosting`, { body: input });
78
+ }
79
+ listProjectEnvironments(projectId) {
80
+ return this.requestJson("GET", `/v1/projects/${encodeURIComponent(projectId)}/environments`);
81
+ }
82
+ upsertProjectEnvironment(projectId, environment, input) {
83
+ return this.requestJson(
84
+ "PUT",
85
+ `/v1/projects/${encodeURIComponent(projectId)}/environments/${encodeURIComponent(environment)}`,
86
+ { body: input }
87
+ );
88
+ }
89
+ listProjectInfrastructureResources(projectId, environment) {
90
+ return this.requestJson(
91
+ "GET",
92
+ `/v1/projects/${encodeURIComponent(projectId)}/resources`,
93
+ { query: { environment: environment ?? null } }
94
+ );
95
+ }
96
+ upsertProjectInfrastructureResource(projectId, input) {
97
+ return this.requestJson(
98
+ "POST",
99
+ `/v1/projects/${encodeURIComponent(projectId)}/resources`,
100
+ { body: input }
101
+ );
102
+ }
103
+ listProjectDeployments(projectId, environment) {
104
+ return this.requestJson(
105
+ "GET",
106
+ `/v1/projects/${encodeURIComponent(projectId)}/deployments`,
107
+ { query: { environment: environment ?? null } }
108
+ );
109
+ }
110
+ createProjectDeployment(projectId, input) {
111
+ return this.requestJson(
112
+ "POST",
113
+ `/v1/projects/${encodeURIComponent(projectId)}/deployments`,
114
+ { body: input }
115
+ );
116
+ }
117
+ listAgentPools(projectId, environment) {
118
+ return this.requestJson(
119
+ "GET",
120
+ `/v1/projects/${encodeURIComponent(projectId)}/agent-pools`,
121
+ { query: { environment: environment ?? null } }
122
+ );
123
+ }
124
+ upsertAgentPool(projectId, input) {
125
+ return this.requestJson(
126
+ "POST",
127
+ `/v1/projects/${encodeURIComponent(projectId)}/agent-pools`,
128
+ { body: input }
129
+ );
130
+ }
131
+ listAgentPoolRegistrations(projectId, poolId) {
132
+ return this.requestJson(
133
+ "GET",
134
+ `/v1/projects/${encodeURIComponent(projectId)}/agent-pools/${encodeURIComponent(poolId)}/registrations`
135
+ );
136
+ }
137
+ listAgentPoolScaleDecisions(projectId, poolId) {
138
+ return this.requestJson(
139
+ "GET",
140
+ `/v1/projects/${encodeURIComponent(projectId)}/agent-pools/${encodeURIComponent(poolId)}/scale-decisions`
141
+ );
142
+ }
143
+ getProjectWorkPolicy(projectId, environment = "staging") {
144
+ return this.requestJson(
145
+ "GET",
146
+ `/v1/projects/${encodeURIComponent(projectId)}/work-policy`,
147
+ { query: { environment } }
148
+ );
149
+ }
150
+ upsertProjectWorkPolicy(projectId, input) {
151
+ return this.requestJson(
152
+ "PUT",
153
+ `/v1/projects/${encodeURIComponent(projectId)}/work-policy`,
154
+ { body: input }
155
+ );
156
+ }
157
+ listProjectPriorityOverrides(projectId) {
158
+ return this.requestJson(
159
+ "GET",
160
+ `/v1/projects/${encodeURIComponent(projectId)}/priority-overrides`
161
+ );
162
+ }
163
+ upsertProjectPriorityOverride(projectId, input) {
164
+ return this.requestJson(
165
+ "POST",
166
+ `/v1/projects/${encodeURIComponent(projectId)}/priority-overrides`,
167
+ { body: input }
168
+ );
169
+ }
170
+ listProjectPrioritySnapshots(projectId, workDayId) {
171
+ return this.requestJson(
172
+ "GET",
173
+ `/v1/projects/${encodeURIComponent(projectId)}/priority-snapshots`,
174
+ { query: { workDayId: workDayId ?? null } }
175
+ );
176
+ }
177
+ recordRunnerEnvironment(projectId, environment, input) {
178
+ return this.requestJson(
179
+ "PUT",
180
+ `/v1/projects/${encodeURIComponent(projectId)}/runner/environments/${encodeURIComponent(environment)}`,
181
+ { body: input }
182
+ );
183
+ }
184
+ recordRunnerInfrastructureResource(projectId, input) {
185
+ return this.requestJson(
186
+ "POST",
187
+ `/v1/projects/${encodeURIComponent(projectId)}/runner/resources`,
188
+ { body: input }
189
+ );
190
+ }
191
+ recordRunnerDeployment(projectId, input) {
192
+ return this.requestJson(
193
+ "POST",
194
+ `/v1/projects/${encodeURIComponent(projectId)}/runner/deployments`,
195
+ { body: input }
196
+ );
197
+ }
198
+ listRunnerDeployments(projectId, environment) {
199
+ return this.requestJson(
200
+ "GET",
201
+ `/v1/projects/${encodeURIComponent(projectId)}/runner/deployments`,
202
+ { query: { environment: environment ?? null } }
203
+ );
204
+ }
205
+ recordRunnerAgentPoolRegistration(projectId, poolId, input) {
206
+ return this.requestJson(
207
+ "POST",
208
+ `/v1/projects/${encodeURIComponent(projectId)}/runner/agent-pools/${encodeURIComponent(poolId)}/register`,
209
+ { body: input }
210
+ );
211
+ }
212
+ recordRunnerScaleDecision(projectId, poolName, input) {
213
+ return this.requestJson(
214
+ "POST",
215
+ `/v1/projects/${encodeURIComponent(projectId)}/runner/agent-pools/${encodeURIComponent(poolName)}/scale-decisions`,
216
+ { body: input }
217
+ );
218
+ }
219
+ recordRunnerWorkdaySummary(projectId, input) {
220
+ return this.requestJson(
221
+ "POST",
222
+ `/v1/projects/${encodeURIComponent(projectId)}/runner/workdays`,
223
+ { body: input }
224
+ );
225
+ }
226
+ }
227
+ export {
228
+ ControlPlaneClient
229
+ };
@@ -0,0 +1,94 @@
1
+ import type { AgentPoolAutoscalePolicy, ProjectDeploymentKind, ProjectDeploymentStatus, ProjectEnvironmentName, ProjectInfrastructureResourceKind, ProjectInfrastructureResourceProvider, TreeseedHostingKind, TreeseedHostingRegistration } from './sdk-types.ts';
2
+ import type { TreeseedDeployConfig } from './platform/contracts.ts';
3
+ export type ControlPlaneReporterKind = 'noop' | 'market_http' | 'self_http';
4
+ export interface ControlPlaneEnvironmentReport {
5
+ environment: ProjectEnvironmentName;
6
+ deploymentProfile: TreeseedHostingKind;
7
+ baseUrl?: string | null;
8
+ cloudflareAccountId?: string | null;
9
+ pagesProjectName?: string | null;
10
+ workerName?: string | null;
11
+ r2BucketName?: string | null;
12
+ d1DatabaseName?: string | null;
13
+ queueName?: string | null;
14
+ railwayProjectName?: string | null;
15
+ metadata?: Record<string, unknown>;
16
+ }
17
+ export interface ControlPlaneResourceReport {
18
+ environment: ProjectEnvironmentName;
19
+ provider: ProjectInfrastructureResourceProvider;
20
+ resourceKind: ProjectInfrastructureResourceKind;
21
+ logicalName: string;
22
+ locator?: string | null;
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ export interface ControlPlaneDeploymentReport {
26
+ environment: ProjectEnvironmentName;
27
+ deploymentKind: ProjectDeploymentKind;
28
+ status: ProjectDeploymentStatus | 'success';
29
+ sourceRef?: string | null;
30
+ releaseTag?: string | null;
31
+ commitSha?: string | null;
32
+ triggeredByType?: string | null;
33
+ triggeredById?: string | null;
34
+ metadata?: Record<string, unknown>;
35
+ startedAt?: string | null;
36
+ finishedAt?: string | null;
37
+ }
38
+ export interface ControlPlaneAgentPoolHeartbeat {
39
+ teamId: string;
40
+ environment: ProjectEnvironmentName;
41
+ poolName: string;
42
+ managerId?: string | null;
43
+ serviceName?: string | null;
44
+ registrationIdentity?: string | null;
45
+ serviceBaseUrl?: string | null;
46
+ autoscale?: AgentPoolAutoscalePolicy;
47
+ desiredWorkers?: number | null;
48
+ observedQueueDepth?: number | null;
49
+ observedActiveLeases?: number | null;
50
+ metadata?: Record<string, unknown>;
51
+ }
52
+ export interface ControlPlaneScaleDecisionReport {
53
+ environment: ProjectEnvironmentName;
54
+ poolName: string;
55
+ workDayId?: string | null;
56
+ desiredWorkers: number;
57
+ observedQueueDepth: number;
58
+ observedActiveLeases: number;
59
+ reason: string;
60
+ metadata?: Record<string, unknown>;
61
+ }
62
+ export interface ControlPlaneWorkdaySummaryReport {
63
+ environment: ProjectEnvironmentName;
64
+ workDayId: string;
65
+ kind?: string;
66
+ state?: string | null;
67
+ startedAt?: string | null;
68
+ endedAt?: string | null;
69
+ summary: Record<string, unknown>;
70
+ metadata?: Record<string, unknown>;
71
+ }
72
+ export interface ControlPlaneReporter {
73
+ readonly kind: ControlPlaneReporterKind;
74
+ readonly enabled: boolean;
75
+ reportEnvironment(input: ControlPlaneEnvironmentReport): Promise<void>;
76
+ reportResource(input: ControlPlaneResourceReport): Promise<void>;
77
+ reportDeployment(input: ControlPlaneDeploymentReport): Promise<void>;
78
+ registerAgentPoolHeartbeat(input: ControlPlaneAgentPoolHeartbeat): Promise<void>;
79
+ reportScaleDecision(input: ControlPlaneScaleDecisionReport): Promise<void>;
80
+ reportWorkdaySummary(input: ControlPlaneWorkdaySummaryReport): Promise<void>;
81
+ }
82
+ export interface ControlPlaneReporterOptions {
83
+ kind?: ControlPlaneReporterKind | null;
84
+ projectId?: string | null;
85
+ baseUrl?: string | null;
86
+ runnerToken?: string | null;
87
+ fetchImpl?: typeof fetch;
88
+ }
89
+ export interface ResolveControlPlaneReporterOptions extends ControlPlaneReporterOptions {
90
+ hostingKind?: TreeseedHostingKind | null;
91
+ registration?: TreeseedHostingRegistration | null;
92
+ deployConfig?: Pick<TreeseedDeployConfig, 'hosting'> | null;
93
+ }
94
+ export declare function createControlPlaneReporter(options?: ResolveControlPlaneReporterOptions): ControlPlaneReporter;
@@ -0,0 +1,125 @@
1
+ function normalizeUrl(value) {
2
+ const normalized = String(value ?? "").trim().replace(/\/+$/u, "");
3
+ return normalized || null;
4
+ }
5
+ function resolveReporterKind(options) {
6
+ if (options.kind) {
7
+ return options.kind;
8
+ }
9
+ const hostingKind = options.hostingKind ?? options.deployConfig?.hosting?.kind ?? (process.env.TREESEED_HOSTING_KIND?.trim() || null) ?? "self_hosted_project";
10
+ const registration = options.registration ?? options.deployConfig?.hosting?.registration ?? (process.env.TREESEED_HOSTING_REGISTRATION?.trim() || null) ?? "none";
11
+ if (hostingKind === "hosted_project") {
12
+ return "market_http";
13
+ }
14
+ if (hostingKind === "self_hosted_project" && registration === "optional") {
15
+ return "market_http";
16
+ }
17
+ if (hostingKind === "market_control_plane") {
18
+ return normalizeUrl(options.baseUrl ?? options.deployConfig?.hosting?.marketBaseUrl) ? "self_http" : "noop";
19
+ }
20
+ return "noop";
21
+ }
22
+ class NoopControlPlaneReporter {
23
+ kind = "noop";
24
+ enabled = false;
25
+ async reportEnvironment() {
26
+ }
27
+ async reportResource() {
28
+ }
29
+ async reportDeployment() {
30
+ }
31
+ async registerAgentPoolHeartbeat() {
32
+ }
33
+ async reportScaleDecision() {
34
+ }
35
+ async reportWorkdaySummary() {
36
+ }
37
+ }
38
+ class HttpControlPlaneReporter {
39
+ constructor(kind, projectId, baseUrl, runnerToken, fetchImpl = fetch) {
40
+ this.kind = kind;
41
+ this.projectId = projectId;
42
+ this.baseUrl = baseUrl;
43
+ this.runnerToken = runnerToken;
44
+ this.fetchImpl = fetchImpl;
45
+ this.enabled = Boolean(this.projectId && this.baseUrl && this.runnerToken);
46
+ }
47
+ kind;
48
+ projectId;
49
+ baseUrl;
50
+ runnerToken;
51
+ fetchImpl;
52
+ enabled;
53
+ async request(method, pathname, body) {
54
+ if (!this.enabled || !this.baseUrl || !this.runnerToken) {
55
+ return;
56
+ }
57
+ const response = await this.fetchImpl(new URL(pathname, this.baseUrl), {
58
+ method,
59
+ headers: {
60
+ authorization: `Bearer ${this.runnerToken}`,
61
+ "content-type": "application/json"
62
+ },
63
+ body: JSON.stringify(body)
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(`Control-plane request failed for ${pathname}: ${response.status} ${response.statusText}`);
67
+ }
68
+ }
69
+ async reportEnvironment(input) {
70
+ if (!this.projectId) return;
71
+ await this.request("PUT", `/v1/projects/${this.projectId}/runner/environments/${input.environment}`, input);
72
+ }
73
+ async reportResource(input) {
74
+ if (!this.projectId) return;
75
+ await this.request("POST", `/v1/projects/${this.projectId}/runner/resources`, input);
76
+ }
77
+ async reportDeployment(input) {
78
+ if (!this.projectId) return;
79
+ const normalizedStatus = input.status === "success" ? "succeeded" : input.status;
80
+ await this.request("POST", `/v1/projects/${this.projectId}/runner/deployments`, {
81
+ ...input,
82
+ status: normalizedStatus
83
+ });
84
+ }
85
+ async registerAgentPoolHeartbeat(input) {
86
+ if (!this.projectId) return;
87
+ await this.request(
88
+ "POST",
89
+ `/v1/projects/${this.projectId}/runner/agent-pools/${encodeURIComponent(input.poolName)}/register`,
90
+ input
91
+ );
92
+ }
93
+ async reportScaleDecision(input) {
94
+ if (!this.projectId) return;
95
+ await this.request(
96
+ "POST",
97
+ `/v1/projects/${this.projectId}/runner/agent-pools/${encodeURIComponent(input.poolName)}/scale-decisions`,
98
+ input
99
+ );
100
+ }
101
+ async reportWorkdaySummary(input) {
102
+ if (!this.projectId) return;
103
+ await this.request("POST", `/v1/projects/${this.projectId}/runner/workdays`, input);
104
+ }
105
+ }
106
+ function createControlPlaneReporter(options = {}) {
107
+ const kind = resolveReporterKind(options);
108
+ if (kind === "noop") {
109
+ return new NoopControlPlaneReporter();
110
+ }
111
+ const projectId = String(
112
+ options.projectId ?? options.deployConfig?.hosting?.projectId ?? process.env.TREESEED_PROJECT_ID ?? ""
113
+ ).trim() || null;
114
+ const baseUrl = normalizeUrl(
115
+ options.baseUrl ?? options.deployConfig?.hosting?.marketBaseUrl ?? process.env.TREESEED_MARKET_API_BASE_URL ?? null
116
+ );
117
+ const runnerToken = String(options.runnerToken ?? process.env.TREESEED_PROJECT_RUNNER_TOKEN ?? "").trim() || null;
118
+ if (!projectId || !baseUrl || !runnerToken) {
119
+ return new NoopControlPlaneReporter();
120
+ }
121
+ return new HttpControlPlaneReporter(kind, projectId, baseUrl, runnerToken, options.fetchImpl);
122
+ }
123
+ export {
124
+ createControlPlaneReporter
125
+ };
@@ -1,6 +1,6 @@
1
1
  import type { ContentLeaseRecord } from './types/agents.ts';
2
2
  import type { D1DatabaseLike } from './types/cloudflare.ts';
3
- import type { SdkAppendTaskEventRequest, SdkAckMessageRequest, SdkClaimMessageRequest, SdkClaimTaskRequest, SdkCloseWorkDayRequest, SdkCompleteTaskRequest, SdkCreateReportRequest, SdkCreateMessageRequest, SdkCreateTaskRequest, SdkCursorEntity, SdkCursorRequest, SdkFailTaskRequest, SdkFollowRequest, SdkGetRequest, SdkGetCursorRequest, SdkLeaseEntity, SdkLeaseReleaseRequest, SdkManagerContextPayload, SdkMessageEntity, SdkMutationRequest, SdkPickRequest, SdkPickResult, SdkRecordRunRequest, SdkReportEntity, SdkRunEntity, SdkSearchRequest, SdkStartWorkDayRequest, SdkSubscriptionEntity, SdkTaskEntity, SdkTaskSearchRequest, SdkTaskProgressRequest, SdkUpdateRequest, SdkWorkDayEntity } from './sdk-types.ts';
3
+ import type { SdkAppendTaskEventRequest, SdkAckMessageRequest, SdkClaimMessageRequest, SdkClaimTaskRequest, SdkCloseWorkDayRequest, SdkCompleteTaskRequest, SdkCreateReportRequest, SdkCreateMessageRequest, SdkCreatePrioritySnapshotRequest, SdkCreateTaskRequest, SdkCursorEntity, SdkCursorRequest, SdkFailTaskRequest, SdkFollowRequest, SdkGetRequest, SdkGetCursorRequest, SdkLeaseEntity, SdkLeaseReleaseRequest, SdkManagerContextPayload, SdkMessageEntity, SdkMutationRequest, SdkPickRequest, SdkPickResult, SdkPriorityOverrideRequest, SdkRecordRunRequest, SdkRecordScaleDecisionRequest, SdkRecordTaskCreditsRequest, SdkReportEntity, SdkRunEntity, SdkSearchRequest, SdkStartWorkDayRequest, SdkSubscriptionEntity, SdkTaskEntity, SdkTaskSearchRequest, SdkUpsertWorkPolicyRequest, SdkTaskProgressRequest, SdkUpdateRequest, SdkWorkDayEntity, ScaleDecision, TaskCreditLedgerEntry, WorkdayPolicy, PrioritySnapshot } from './sdk-types.ts';
4
4
  import { type LeaseClaimInput } from './stores/lease-store.ts';
5
5
  export interface TryClaimContentLeaseInput extends LeaseClaimInput {
6
6
  }
@@ -34,6 +34,16 @@ export interface AgentDatabase {
34
34
  searchTasks(request: SdkTaskSearchRequest): Promise<SdkTaskEntity[]>;
35
35
  createReport(request: SdkCreateReportRequest): Promise<SdkReportEntity | null>;
36
36
  getManagerContext(taskId: string): Promise<SdkManagerContextPayload>;
37
+ getWorkPolicy(projectId: string, environment?: string): Promise<WorkdayPolicy | null>;
38
+ upsertWorkPolicy(request: SdkUpsertWorkPolicyRequest): Promise<WorkdayPolicy | null>;
39
+ listPriorityOverrides(projectId: string): Promise<Record<string, unknown>[]>;
40
+ upsertPriorityOverride(request: SdkPriorityOverrideRequest): Promise<Record<string, unknown> | null>;
41
+ createPrioritySnapshot(request: SdkCreatePrioritySnapshotRequest): Promise<PrioritySnapshot | null>;
42
+ getLatestPrioritySnapshot(projectId: string, workDayId?: string | null): Promise<PrioritySnapshot | null>;
43
+ recordTaskCredits(request: SdkRecordTaskCreditsRequest): Promise<TaskCreditLedgerEntry | null>;
44
+ listTaskCredits(workDayId: string): Promise<TaskCreditLedgerEntry[]>;
45
+ recordScaleDecision(request: SdkRecordScaleDecisionRequest): Promise<ScaleDecision | null>;
46
+ getLatestScaleDecision(projectId: string, environment: string, poolName: string): Promise<ScaleDecision | null>;
37
47
  }
38
48
  export declare class MemoryAgentDatabase implements AgentDatabase {
39
49
  private readonly subscriptions;
@@ -47,6 +57,11 @@ export declare class MemoryAgentDatabase implements AgentDatabase {
47
57
  private readonly taskOutputs;
48
58
  private readonly graphRuns;
49
59
  private readonly reports;
60
+ private readonly workPolicies;
61
+ private readonly priorityOverrides;
62
+ private readonly prioritySnapshots;
63
+ private readonly taskCreditLedger;
64
+ private readonly scaleDecisions;
50
65
  private messageId;
51
66
  constructor(seed?: {
52
67
  subscriptions?: SdkSubscriptionEntity[];
@@ -114,6 +129,26 @@ export declare class MemoryAgentDatabase implements AgentDatabase {
114
129
  graphVersion: string;
115
130
  } | null;
116
131
  }>;
132
+ getWorkPolicy(projectId: string, environment?: string): Promise<WorkdayPolicy | null>;
133
+ upsertWorkPolicy(request: SdkUpsertWorkPolicyRequest): Promise<WorkdayPolicy>;
134
+ listPriorityOverrides(projectId: string): Promise<Record<string, unknown>[]>;
135
+ upsertPriorityOverride(request: SdkPriorityOverrideRequest): Promise<{
136
+ id: string;
137
+ projectId: string;
138
+ model: string;
139
+ subjectId: string;
140
+ priority: number;
141
+ estimatedCredits: number | null;
142
+ metadata: Record<string, unknown>;
143
+ createdAt: string;
144
+ updatedAt: string;
145
+ }>;
146
+ createPrioritySnapshot(request: SdkCreatePrioritySnapshotRequest): Promise<PrioritySnapshot>;
147
+ getLatestPrioritySnapshot(projectId: string, workDayId?: string | null): Promise<PrioritySnapshot>;
148
+ recordTaskCredits(request: SdkRecordTaskCreditsRequest): Promise<TaskCreditLedgerEntry>;
149
+ listTaskCredits(workDayId: string): Promise<TaskCreditLedgerEntry[]>;
150
+ recordScaleDecision(request: SdkRecordScaleDecisionRequest): Promise<ScaleDecision>;
151
+ getLatestScaleDecision(projectId: string, environment: string, poolName: string): Promise<ScaleDecision>;
117
152
  }
118
153
  export declare class CloudflareD1AgentDatabase implements AgentDatabase {
119
154
  readonly db: D1DatabaseLike;
@@ -166,4 +201,24 @@ export declare class CloudflareD1AgentDatabase implements AgentDatabase {
166
201
  graphVersion: string;
167
202
  } | null;
168
203
  }>;
204
+ getWorkPolicy(projectId: string, environment?: string): Promise<WorkdayPolicy | null>;
205
+ upsertWorkPolicy(request: SdkUpsertWorkPolicyRequest): Promise<WorkdayPolicy | null>;
206
+ listPriorityOverrides(projectId: string): Promise<import("./stores/helpers.ts").DatabaseRow[]>;
207
+ upsertPriorityOverride(request: SdkPriorityOverrideRequest): Promise<{
208
+ id: string;
209
+ projectId: string;
210
+ model: string;
211
+ subjectId: string;
212
+ priority: number;
213
+ estimatedCredits: number | null;
214
+ metadata: Record<string, unknown>;
215
+ createdAt: string;
216
+ updatedAt: string;
217
+ } | null>;
218
+ createPrioritySnapshot(request: SdkCreatePrioritySnapshotRequest): Promise<PrioritySnapshot | null>;
219
+ getLatestPrioritySnapshot(projectId: string, workDayId?: string | null): Promise<PrioritySnapshot | null>;
220
+ recordTaskCredits(request: SdkRecordTaskCreditsRequest): Promise<TaskCreditLedgerEntry | null>;
221
+ listTaskCredits(workDayId: string): Promise<TaskCreditLedgerEntry[]>;
222
+ recordScaleDecision(request: SdkRecordScaleDecisionRequest): Promise<ScaleDecision | null>;
223
+ getLatestScaleDecision(projectId: string, environment: string, poolName: string): Promise<ScaleDecision | null>;
169
224
  }