@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.
- package/README.md +1 -1
- package/dist/control-plane-client.d.ts +45 -0
- package/dist/control-plane-client.js +229 -0
- package/dist/control-plane.d.ts +94 -0
- package/dist/control-plane.js +125 -0
- package/dist/d1-store.d.ts +56 -1
- package/dist/d1-store.js +132 -0
- package/dist/dispatch.d.ts +4 -0
- package/dist/dispatch.js +180 -0
- package/dist/index.d.ts +14 -2
- package/dist/index.js +94 -4
- package/dist/operations/services/config-runtime.d.ts +10 -0
- package/dist/operations/services/config-runtime.js +62 -4
- package/dist/operations/services/deploy.d.ts +95 -3
- package/dist/operations/services/deploy.js +351 -10
- package/dist/operations/services/github-automation.d.ts +37 -1
- package/dist/operations/services/github-automation.js +71 -14
- package/dist/operations/services/project-platform.d.ts +835 -0
- package/dist/operations/services/project-platform.js +782 -0
- package/dist/operations/services/railway-deploy.d.ts +113 -18
- package/dist/operations/services/railway-deploy.js +357 -8
- package/dist/operations/services/runtime-tools.d.ts +25 -1
- package/dist/operations/services/runtime-tools.js +66 -5
- package/dist/operations/services/template-registry.d.ts +1 -1
- package/dist/operations/services/template-registry.js +17 -3
- package/dist/platform/books-data.d.ts +3 -4
- package/dist/platform/books-data.js +30 -4
- package/dist/platform/contracts.d.ts +56 -4
- package/dist/platform/deploy-config.js +109 -4
- package/dist/platform/deploy-runtime.d.ts +2 -0
- package/dist/platform/deploy-runtime.js +9 -1
- package/dist/platform/env.yaml +677 -0
- package/dist/platform/environment.js +57 -2
- package/dist/platform/plugin.d.ts +8 -0
- package/dist/platform/plugins/constants.d.ts +2 -0
- package/dist/platform/plugins/constants.js +2 -0
- package/dist/platform/plugins/runtime.d.ts +2 -0
- package/dist/platform/plugins/runtime.js +9 -1
- package/dist/platform/plugins.d.ts +1 -1
- package/dist/platform/plugins.js +4 -0
- package/dist/platform/published-content-pipeline.d.ts +84 -0
- package/dist/platform/published-content-pipeline.js +543 -0
- package/dist/platform/published-content.d.ts +223 -0
- package/dist/platform/published-content.js +588 -0
- package/dist/platform/tenant/runtime-config.d.ts +1 -1
- package/dist/platform/tenant/runtime-config.js +34 -1
- package/dist/platform/tenant-config.d.ts +2 -1
- package/dist/platform/tenant-config.js +17 -1
- package/dist/platform/utils/site-config-schema.js +104 -0
- package/dist/plugin-default.d.ts +2 -0
- package/dist/plugin-default.js +2 -0
- package/dist/remote.d.ts +65 -9
- package/dist/remote.js +104 -28
- package/dist/scripts/check-build-warnings.js +50 -0
- package/dist/scripts/config-treeseed.js +7 -0
- package/dist/scripts/tenant-workflow-action.js +71 -0
- package/dist/sdk-dispatch.d.ts +12 -0
- package/dist/sdk-dispatch.js +142 -0
- package/dist/sdk-types.d.ts +579 -7
- package/dist/sdk-types.js +53 -1
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +109 -0
- package/dist/stores/operational-store.d.ts +22 -2
- package/dist/stores/operational-store.js +235 -0
- package/dist/template-catalog.js +8 -1
- package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +20 -0
- package/dist/types/cloudflare.d.ts +23 -0
- package/dist/workflow/operations.d.ts +12 -3
- package/dist/workflow/policy.d.ts +1 -1
- package/dist/workflow-state.js +2 -1
- package/package.json +7 -2
- package/templates/github/deploy.workflow.yml +442 -0
- 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
|
-
-
|
|
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
|
+
};
|
package/dist/d1-store.d.ts
CHANGED
|
@@ -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
|
}
|