@treeseed/sdk 0.9.0 → 0.10.6

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 (76) hide show
  1. package/dist/api/app.d.ts +8 -0
  2. package/dist/api/app.js +404 -0
  3. package/dist/api/auth/d1-database.d.ts +3 -0
  4. package/dist/api/auth/d1-database.js +20 -0
  5. package/dist/api/auth/d1-provider.d.ts +79 -0
  6. package/dist/api/auth/d1-provider.js +92 -0
  7. package/dist/api/auth/d1-store.d.ts +114 -0
  8. package/dist/api/auth/d1-store.js +902 -0
  9. package/dist/api/auth/memory-provider.d.ts +77 -0
  10. package/dist/api/auth/memory-provider.js +256 -0
  11. package/dist/api/auth/rbac.d.ts +22 -0
  12. package/dist/api/auth/rbac.js +162 -0
  13. package/dist/api/auth/tokens.d.ts +18 -0
  14. package/dist/api/auth/tokens.js +56 -0
  15. package/dist/api/config.d.ts +2 -0
  16. package/dist/api/config.js +118 -0
  17. package/dist/api/http.d.ts +28 -0
  18. package/dist/api/http.js +51 -0
  19. package/dist/api/index.d.ts +10 -0
  20. package/dist/api/index.js +27 -0
  21. package/dist/api/operations-routes.d.ts +11 -0
  22. package/dist/api/operations-routes.js +39 -0
  23. package/dist/api/operations.d.ts +3 -0
  24. package/dist/api/operations.js +26 -0
  25. package/dist/api/providers.d.ts +2 -0
  26. package/dist/api/providers.js +68 -0
  27. package/dist/api/railway.d.ts +52 -0
  28. package/dist/api/railway.js +71 -0
  29. package/dist/api/sdk-dispatch.d.ts +6 -0
  30. package/dist/api/sdk-dispatch.js +14 -0
  31. package/dist/api/sdk-routes.d.ts +11 -0
  32. package/dist/api/sdk-routes.js +29 -0
  33. package/dist/api/templates.d.ts +3 -0
  34. package/dist/api/templates.js +31 -0
  35. package/dist/api/types.d.ts +232 -0
  36. package/dist/api/types.js +0 -0
  37. package/dist/capacity-provider.d.ts +383 -0
  38. package/dist/capacity-provider.js +535 -0
  39. package/dist/capacity.d.ts +2 -35
  40. package/dist/control-plane-client.d.ts +8 -3
  41. package/dist/control-plane-client.js +12 -1
  42. package/dist/dispatch.js +0 -1
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.js +40 -0
  45. package/dist/market-client.d.ts +1 -5
  46. package/dist/market-client.js +2 -8
  47. package/dist/operations/providers/default.js +0 -9
  48. package/dist/operations/services/config-runtime.d.ts +2 -2
  49. package/dist/operations/services/config-runtime.js +55 -3
  50. package/dist/operations/services/github-automation.d.ts +10 -15
  51. package/dist/operations/services/github-automation.js +3 -35
  52. package/dist/operations/services/hosting-audit.d.ts +1 -1
  53. package/dist/operations/services/hosting-audit.js +3 -27
  54. package/dist/operations/services/hub-launch.d.ts +0 -1
  55. package/dist/operations/services/hub-launch.js +1 -2
  56. package/dist/operations/services/hub-provider-launch.d.ts +0 -15
  57. package/dist/operations/services/hub-provider-launch.js +5 -41
  58. package/dist/operations/services/package-reference-policy.d.ts +1 -0
  59. package/dist/operations/services/package-reference-policy.js +10 -2
  60. package/dist/operations/services/project-platform.d.ts +9 -9
  61. package/dist/operations/services/project-platform.js +6 -17
  62. package/dist/operations/services/release-candidate.js +19 -3
  63. package/dist/operations-registry.js +1 -3
  64. package/dist/platform/contracts.d.ts +2 -2
  65. package/dist/project-workflow.d.ts +0 -3
  66. package/dist/scripts/publish-package.js +5 -1
  67. package/dist/scripts/tenant-workflow-action.js +3 -3
  68. package/dist/scripts/workflow-commands.test.js +3 -6
  69. package/dist/sdk-types.d.ts +33 -1
  70. package/dist/treeseed/template-catalog/templates/starter-basic/template/package.json +1 -4
  71. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/api/server.js +1 -1
  72. package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +1 -17
  73. package/dist/workflow/operations.js +26 -8
  74. package/package.json +14 -1
  75. package/templates/github/hosted-project.workflow.yml +0 -1
  76. package/templates/github/deploy-processing.workflow.yml +0 -123
@@ -0,0 +1,535 @@
1
+ import {
2
+ TREESEED_REMOTE_CONTRACT_HEADER,
3
+ TREESEED_REMOTE_CONTRACT_VERSION
4
+ } from "./remote.js";
5
+ import {
6
+ collectTreeseedConfigSeedValues,
7
+ collectTreeseedEnvironmentContext,
8
+ resolveTreeseedMachineEnvironmentValues,
9
+ setTreeseedMachineEnvironmentValue
10
+ } from "./operations/services/config-runtime.js";
11
+ const CAPACITY_PROVIDER_ENDPOINTS = {
12
+ register: "/v1/provider/register",
13
+ heartbeat: "/v1/provider/heartbeat",
14
+ portfolio: "/v1/provider/portfolio",
15
+ workdays: "/v1/provider/workdays",
16
+ claimTask: "/v1/provider/tasks/claim",
17
+ taskEvents: (taskId) => `/v1/provider/tasks/${encodeURIComponent(taskId)}/events`,
18
+ completeTask: (taskId) => `/v1/provider/tasks/${encodeURIComponent(taskId)}/complete`,
19
+ failTask: (taskId) => `/v1/provider/tasks/${encodeURIComponent(taskId)}/fail`,
20
+ usage: "/v1/provider/usage",
21
+ reports: "/v1/provider/reports"
22
+ };
23
+ const CAPACITY_PROVIDER_SCOPES = [
24
+ "provider:register",
25
+ "provider:heartbeat",
26
+ "provider:portfolio:read",
27
+ "provider:tasks:claim",
28
+ "provider:tasks:update",
29
+ "provider:usage:report",
30
+ "provider:reports:write",
31
+ "provider:capabilities:write"
32
+ ];
33
+ const CAPACITY_PROVIDER_ENV_KEYS = [
34
+ "TREESEED_MARKET_URL",
35
+ "TREESEED_MARKET_ID",
36
+ "TREESEED_CAPACITY_PROVIDER_API_KEY",
37
+ "TREESEED_PROVIDER_HOST_DATA_DIR",
38
+ "TREESEED_PROVIDER_DATA_DIR",
39
+ "TREESEED_PROVIDER_API_PORT",
40
+ "TREESEED_PROVIDER_HOST_API_PORT",
41
+ "TREESEED_PROVIDER_ENVIRONMENT",
42
+ "TREESEED_PROVIDER_CAPABILITIES_FILE",
43
+ "TREESEED_PROVIDER_BUDGET_FILE",
44
+ "TREESEED_PROVIDER_MAX_CONCURRENT_WORKDAYS",
45
+ "TREESEED_PROVIDER_MAX_CONCURRENT_RUNNERS",
46
+ "TREESEED_PROVIDER_DAILY_CREDIT_BUDGET",
47
+ "TREESEED_PROVIDER_MONTHLY_CREDIT_BUDGET",
48
+ "TREESEED_PROVIDER_STARTUP_MODE",
49
+ "TREESEED_CODEX_AUTH_FILE",
50
+ "TREESEED_CODEX_AUTH_JSON_B64",
51
+ "TREESEED_CODEX_AUTH_OVERWRITE"
52
+ ];
53
+ const CAPACITY_PROVIDER_DEPLOYMENT_SERVICE_ROLES = ["api", "manager", "runner"];
54
+ class CapacityProviderApiError extends Error {
55
+ constructor(message, status, payload) {
56
+ super(message);
57
+ this.status = status;
58
+ this.payload = payload;
59
+ this.name = "CapacityProviderApiError";
60
+ }
61
+ status;
62
+ payload;
63
+ }
64
+ function normalizeBaseUrl(value) {
65
+ const trimmed = value.trim().replace(/\/+$/u, "");
66
+ if (!trimmed) throw new Error("Capacity provider Market URL is required.");
67
+ return trimmed;
68
+ }
69
+ function stringValue(value, fallback) {
70
+ if (typeof value === "string" && value.length > 0) return value;
71
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
72
+ return fallback ?? "";
73
+ }
74
+ function objectStringValues(value = {}) {
75
+ return Object.fromEntries(
76
+ Object.entries(value).filter(([, entryValue]) => entryValue !== void 0 && entryValue !== null && String(entryValue).length > 0).map(([key, entryValue]) => [key, String(entryValue)])
77
+ );
78
+ }
79
+ function filterCapacityProviderEnv(value) {
80
+ const allowed = new Set(CAPACITY_PROVIDER_ENV_KEYS);
81
+ return Object.fromEntries(
82
+ Object.entries(value).filter(([key, entryValue]) => allowed.has(key) && typeof entryValue === "string" && entryValue.length > 0)
83
+ );
84
+ }
85
+ function capacityProviderConfigEntry(id) {
86
+ return {
87
+ id,
88
+ label: id,
89
+ group: "capacity-provider",
90
+ description: "Capacity provider launch value.",
91
+ howToGet: "Created by local seed or stored through trsd config.",
92
+ sensitivity: id === "TREESEED_CAPACITY_PROVIDER_API_KEY" ? "secret" : "plain",
93
+ targets: ["local-runtime"],
94
+ scopes: ["local", "staging", "prod"],
95
+ storage: "scoped",
96
+ requirement: "optional",
97
+ purposes: ["dev", "deploy", "config"]
98
+ };
99
+ }
100
+ function isRecord(value) {
101
+ return typeof value === "object" && value !== null && !Array.isArray(value);
102
+ }
103
+ function requireString(record, key, label) {
104
+ const value = record[key];
105
+ if (typeof value !== "string" || value.length === 0) {
106
+ throw new Error(`${label} is missing required string field "${key}".`);
107
+ }
108
+ return value;
109
+ }
110
+ function requireNumber(record, key, label) {
111
+ const value = record[key];
112
+ if (typeof value !== "number" || !Number.isFinite(value)) {
113
+ throw new Error(`${label} is missing required numeric field "${key}".`);
114
+ }
115
+ return value;
116
+ }
117
+ function buildCapacityProviderAuthHeaders(apiKey) {
118
+ const trimmed = apiKey.trim();
119
+ if (!trimmed) throw new Error("Capacity provider API key is required.");
120
+ return {
121
+ authorization: `Bearer ${trimmed}`
122
+ };
123
+ }
124
+ function assertCapacityProviderOkEnvelope(value, label = "Capacity provider response") {
125
+ if (!isRecord(value) || value.ok !== true) {
126
+ throw new Error(`${label} must be an ok response envelope.`);
127
+ }
128
+ }
129
+ function assertCapacityProviderRegistrationResponse(value) {
130
+ assertCapacityProviderOkEnvelope(value, "Capacity provider registration response");
131
+ const record = value;
132
+ if (!isRecord(record.provider)) {
133
+ throw new Error("Capacity provider registration response is missing provider.");
134
+ }
135
+ requireString(record.provider, "id", "Capacity provider registration provider");
136
+ requireString(record.provider, "teamId", "Capacity provider registration provider");
137
+ requireString(record.provider, "name", "Capacity provider registration provider");
138
+ requireString(record.provider, "status", "Capacity provider registration provider");
139
+ requireString(record, "portfolioManifestUrl", "Capacity provider registration response");
140
+ requireNumber(record, "heartbeatIntervalSeconds", "Capacity provider registration response");
141
+ }
142
+ function assertCapacityProviderPortfolioManifest(value) {
143
+ if (!isRecord(value)) {
144
+ throw new Error("Capacity provider portfolio manifest must be an object.");
145
+ }
146
+ if (!isRecord(value.team)) {
147
+ throw new Error("Capacity provider portfolio manifest is missing team.");
148
+ }
149
+ requireString(value.team, "id", "Capacity provider portfolio team");
150
+ requireString(value.team, "slug", "Capacity provider portfolio team");
151
+ requireString(value.team, "name", "Capacity provider portfolio team");
152
+ if (!Array.isArray(value.projects)) {
153
+ throw new Error("Capacity provider portfolio manifest is missing projects.");
154
+ }
155
+ for (const [index, project] of value.projects.entries()) {
156
+ if (!isRecord(project)) throw new Error(`Capacity provider portfolio project ${index} must be an object.`);
157
+ requireString(project, "id", `Capacity provider portfolio project ${index}`);
158
+ requireString(project, "slug", `Capacity provider portfolio project ${index}`);
159
+ requireString(project, "name", `Capacity provider portfolio project ${index}`);
160
+ if (!isRecord(project.repository)) throw new Error(`Capacity provider portfolio project ${index} is missing repository.`);
161
+ if (!isRecord(project.agentSpecs)) throw new Error(`Capacity provider portfolio project ${index} is missing agentSpecs.`);
162
+ if (!isRecord(project.workPolicy)) throw new Error(`Capacity provider portfolio project ${index} is missing workPolicy.`);
163
+ }
164
+ }
165
+ function resolveCapacityProviderEnvironment(input) {
166
+ const env = {
167
+ TREESEED_MARKET_URL: normalizeBaseUrl(input.marketUrl),
168
+ TREESEED_MARKET_ID: input.marketId.trim(),
169
+ TREESEED_CAPACITY_PROVIDER_API_KEY: input.apiKey.trim(),
170
+ TREESEED_PROVIDER_DATA_DIR: input.providerDataDir ?? "/data",
171
+ TREESEED_PROVIDER_API_PORT: stringValue(input.providerApiPort, "3100"),
172
+ TREESEED_PROVIDER_ENVIRONMENT: input.providerEnvironment ?? "local"
173
+ };
174
+ if (!env.TREESEED_MARKET_ID) throw new Error("Capacity provider Market ID is required.");
175
+ if (!env.TREESEED_CAPACITY_PROVIDER_API_KEY) throw new Error("Capacity provider API key is required.");
176
+ if (input.providerHostDataDir) env.TREESEED_PROVIDER_HOST_DATA_DIR = input.providerHostDataDir;
177
+ if (input.capabilitiesFile) env.TREESEED_PROVIDER_CAPABILITIES_FILE = input.capabilitiesFile;
178
+ if (input.budgetFile) env.TREESEED_PROVIDER_BUDGET_FILE = input.budgetFile;
179
+ if (input.maxConcurrentWorkdays !== void 0) env.TREESEED_PROVIDER_MAX_CONCURRENT_WORKDAYS = stringValue(input.maxConcurrentWorkdays);
180
+ if (input.maxConcurrentRunners !== void 0) env.TREESEED_PROVIDER_MAX_CONCURRENT_RUNNERS = stringValue(input.maxConcurrentRunners);
181
+ if (input.dailyCreditBudget !== void 0) env.TREESEED_PROVIDER_DAILY_CREDIT_BUDGET = stringValue(input.dailyCreditBudget);
182
+ if (input.monthlyCreditBudget !== void 0) env.TREESEED_PROVIDER_MONTHLY_CREDIT_BUDGET = stringValue(input.monthlyCreditBudget);
183
+ if (input.codexAuthFile) env.TREESEED_CODEX_AUTH_FILE = input.codexAuthFile;
184
+ if (input.codexAuthJsonB64) env.TREESEED_CODEX_AUTH_JSON_B64 = input.codexAuthJsonB64;
185
+ if (input.codexAuthOverwrite !== void 0) env.TREESEED_CODEX_AUTH_OVERWRITE = stringValue(input.codexAuthOverwrite);
186
+ return env;
187
+ }
188
+ function resolveCapacityProviderLaunchEnvironment(input = {}) {
189
+ const scope = input.scope === "staging" || input.scope === "prod" ? input.scope : "local";
190
+ const env = input.env ?? process.env;
191
+ const overrides = objectStringValues(input.overrides);
192
+ let configValues = {};
193
+ let machineValues = {};
194
+ let source = "process-env";
195
+ if (input.tenantRoot) {
196
+ try {
197
+ configValues = collectTreeseedConfigSeedValues(input.tenantRoot, scope, env);
198
+ source = "treeseed-config";
199
+ } catch {
200
+ configValues = {};
201
+ }
202
+ try {
203
+ machineValues = resolveTreeseedMachineEnvironmentValues(input.tenantRoot, scope, CAPACITY_PROVIDER_ENV_KEYS);
204
+ source = "treeseed-config";
205
+ } catch {
206
+ machineValues = {};
207
+ }
208
+ }
209
+ const values = {
210
+ ...filterCapacityProviderEnv(configValues),
211
+ ...filterCapacityProviderEnv(machineValues),
212
+ ...filterCapacityProviderEnv(env),
213
+ ...filterCapacityProviderEnv(overrides)
214
+ };
215
+ const diagnostic = input.diagnostic === true || values.TREESEED_PROVIDER_STARTUP_MODE === "diagnostic";
216
+ const resolved = {
217
+ TREESEED_PROVIDER_DATA_DIR: "/data",
218
+ TREESEED_PROVIDER_API_PORT: "3100",
219
+ TREESEED_PROVIDER_ENVIRONMENT: scope,
220
+ ...values
221
+ };
222
+ if (!resolved.TREESEED_PROVIDER_HOST_API_PORT) {
223
+ resolved.TREESEED_PROVIDER_HOST_API_PORT = resolved.TREESEED_PROVIDER_API_PORT;
224
+ }
225
+ if (!resolved.TREESEED_PROVIDER_HOST_DATA_DIR) {
226
+ resolved.TREESEED_PROVIDER_HOST_DATA_DIR = ".treeseed/local-capacity-provider/data";
227
+ }
228
+ if (diagnostic) {
229
+ resolved.TREESEED_PROVIDER_STARTUP_MODE = "diagnostic";
230
+ }
231
+ const required = [
232
+ "TREESEED_MARKET_URL",
233
+ "TREESEED_MARKET_ID",
234
+ ...diagnostic ? [] : ["TREESEED_CAPACITY_PROVIDER_API_KEY"],
235
+ "TREESEED_PROVIDER_HOST_DATA_DIR"
236
+ ];
237
+ const missing = required.filter((key) => !resolved[key]);
238
+ if (input.requireConnection !== false && missing.length > 0) {
239
+ throw new Error(`Capacity provider launch environment is missing: ${missing.join(", ")}.`);
240
+ }
241
+ return {
242
+ env: resolved,
243
+ redactedEnv: redactCapacityProviderEnv(resolved),
244
+ missing,
245
+ diagnostic,
246
+ source
247
+ };
248
+ }
249
+ function persistCapacityProviderConnectionToTreeseedConfig(input) {
250
+ const scope = input.scope === "staging" || input.scope === "prod" ? input.scope : "local";
251
+ const env = resolveCapacityProviderEnvironment({
252
+ ...input,
253
+ providerEnvironment: input.providerEnvironment ?? "local",
254
+ providerHostDataDir: input.providerHostDataDir ?? ".treeseed/local-capacity-provider/data"
255
+ });
256
+ let registryEntries = [];
257
+ try {
258
+ registryEntries = collectTreeseedEnvironmentContext(input.tenantRoot).entries;
259
+ } catch {
260
+ registryEntries = [];
261
+ }
262
+ const entryById = new Map(registryEntries.map((entry) => [entry.id, entry]));
263
+ const keys = [
264
+ "TREESEED_MARKET_URL",
265
+ "TREESEED_MARKET_ID",
266
+ "TREESEED_CAPACITY_PROVIDER_API_KEY",
267
+ "TREESEED_PROVIDER_HOST_DATA_DIR",
268
+ "TREESEED_PROVIDER_ENVIRONMENT"
269
+ ];
270
+ for (const key of keys) {
271
+ const entry = entryById.get(key) ?? capacityProviderConfigEntry(key);
272
+ setTreeseedMachineEnvironmentValue(input.tenantRoot, scope, entry, env[key] ?? "");
273
+ }
274
+ return {
275
+ env,
276
+ redactedEnv: redactCapacityProviderEnv(env),
277
+ scope,
278
+ writtenKeys: keys
279
+ };
280
+ }
281
+ function redactCapacityProviderSecret(value) {
282
+ if (value.length <= 8) return "<redacted>";
283
+ return `${value.slice(0, 4)}...<redacted>`;
284
+ }
285
+ function isCapacityProviderSecretEnvKey(key) {
286
+ return /(?:API_KEY|AUTH|TOKEN|SECRET|PASSWORD|CREDENTIAL)/u.test(key);
287
+ }
288
+ function redactCapacityProviderEnv(env) {
289
+ const redacted = {};
290
+ for (const [key, value] of Object.entries(env)) {
291
+ redacted[key] = isCapacityProviderSecretEnvKey(key) ? redactCapacityProviderSecret(value) : value;
292
+ }
293
+ return redacted;
294
+ }
295
+ function renderCapacityProviderSelfHostInstructions(input) {
296
+ const env = resolveCapacityProviderEnvironment(input);
297
+ return {
298
+ composeFile: "packages/agent/compose.capacity-provider.yml",
299
+ commands: [
300
+ "npm -w packages/agent run capacity-provider:build",
301
+ "docker compose -f packages/agent/compose.capacity-provider.yml up"
302
+ ],
303
+ env,
304
+ redactedEnv: redactCapacityProviderEnv(env),
305
+ summary: "Unlock TreeSeed sensitive config, inject these values into the docker compose process environment, and start the package-owned capacity provider runtime."
306
+ };
307
+ }
308
+ function providerDeploymentServiceName(prefix, role) {
309
+ return `${prefix}-${role}`.replace(/[^a-zA-Z0-9_.-]+/gu, "-").replace(/^-+|-+$/gu, "").toLowerCase();
310
+ }
311
+ function providerDeploymentStartCommand(role) {
312
+ return `node ./dist/provider/entrypoint.js ${role}`;
313
+ }
314
+ function defaultProviderDeploymentAdapter(hostKind) {
315
+ return {
316
+ async provisionService(spec) {
317
+ return {
318
+ role: spec.role,
319
+ serviceName: spec.serviceName,
320
+ serviceId: `${hostKind}:${spec.serviceName}`,
321
+ url: spec.role === "api" ? `https://${spec.serviceName}.example.invalid` : null,
322
+ status: "deployed",
323
+ envRefs: Object.fromEntries(
324
+ Object.keys(spec.env).map((key) => [key, isCapacityProviderSecretEnvKey(key) ? `${spec.serviceName}:${key}` : spec.redactedEnv[key] ?? spec.env[key]])
325
+ )
326
+ };
327
+ }
328
+ };
329
+ }
330
+ async function deployCapacityProviderWithAdapter(input, launchMode, hostKind) {
331
+ const imageRef = input.imageRef ?? input.intent.imageRef ?? "ghcr.io/treeseed-ai/agent:capacity-provider";
332
+ const serviceNamePrefix = input.serviceNamePrefix ?? `${input.intent.capacityProviderId || "capacity-provider"}`.replace(/^cp[_-]?/u, "capacity-provider-").replace(/[^a-zA-Z0-9_.-]+/gu, "-");
333
+ const env = { ...input.env };
334
+ const redactedEnv = input.redactedEnv ?? redactCapacityProviderEnv(env);
335
+ const adapter = input.adapter ?? defaultProviderDeploymentAdapter(hostKind);
336
+ const services = {};
337
+ const diagnostics = [];
338
+ try {
339
+ for (const role of CAPACITY_PROVIDER_DEPLOYMENT_SERVICE_ROLES) {
340
+ const result = await adapter.provisionService({
341
+ role,
342
+ serviceName: providerDeploymentServiceName(serviceNamePrefix, role),
343
+ imageRef,
344
+ startCommand: providerDeploymentStartCommand(role),
345
+ env,
346
+ redactedEnv
347
+ });
348
+ services[role] = {
349
+ role,
350
+ serviceName: result.serviceName,
351
+ serviceId: result.serviceId ?? null,
352
+ url: result.url ?? null,
353
+ status: result.status ?? "deployed",
354
+ envRefs: result.envRefs ?? {},
355
+ metadata: result.metadata ?? {}
356
+ };
357
+ }
358
+ return {
359
+ ok: true,
360
+ launchMode,
361
+ hostKind,
362
+ imageRef,
363
+ status: "deployed",
364
+ serviceRefs: services,
365
+ envRefs: Object.fromEntries(Object.keys(env).map((key) => [key, isCapacityProviderSecretEnvKey(key) ? "<host-secret>" : redactedEnv[key] ?? env[key]])),
366
+ diagnostics,
367
+ deployedAt: (input.now ?? /* @__PURE__ */ new Date()).toISOString()
368
+ };
369
+ } catch (error) {
370
+ const message = error instanceof Error ? error.message : String(error);
371
+ return {
372
+ ok: false,
373
+ launchMode,
374
+ hostKind,
375
+ imageRef,
376
+ status: "failed",
377
+ serviceRefs: services,
378
+ envRefs: Object.fromEntries(Object.keys(env).map((key) => [key, isCapacityProviderSecretEnvKey(key) ? "<host-secret>" : redactedEnv[key] ?? env[key]])),
379
+ diagnostics: [message],
380
+ deployedAt: null,
381
+ error: { message }
382
+ };
383
+ }
384
+ }
385
+ function deployCapacityProviderToRailway(input) {
386
+ return deployCapacityProviderWithAdapter(input, "connected_host", "railway");
387
+ }
388
+ function deployCapacityProviderToManagedMarketHost(input) {
389
+ return deployCapacityProviderWithAdapter(input, "managed_market_host", "managed_market_host");
390
+ }
391
+ class MarketProviderClient {
392
+ marketUrl;
393
+ marketId;
394
+ apiKey;
395
+ fetchImpl;
396
+ userAgent;
397
+ constructor(options) {
398
+ this.marketUrl = normalizeBaseUrl(options.marketUrl);
399
+ this.marketId = options.marketId.trim();
400
+ this.apiKey = options.apiKey.trim();
401
+ if (!this.marketId) throw new Error("Capacity provider Market ID is required.");
402
+ if (!this.apiKey) throw new Error("Capacity provider API key is required.");
403
+ this.fetchImpl = options.fetchImpl ?? fetch;
404
+ this.userAgent = options.userAgent;
405
+ }
406
+ async requestJson(path, options = {}) {
407
+ const headers = {
408
+ accept: "application/json",
409
+ [TREESEED_REMOTE_CONTRACT_HEADER]: String(TREESEED_REMOTE_CONTRACT_VERSION),
410
+ ...buildCapacityProviderAuthHeaders(this.apiKey)
411
+ };
412
+ if (this.userAgent) headers["user-agent"] = this.userAgent;
413
+ if (options.body !== void 0) headers["content-type"] = "application/json";
414
+ const response = await this.fetchImpl(`${this.marketUrl}${path}`, {
415
+ method: options.method ?? "GET",
416
+ headers,
417
+ body: options.body === void 0 ? void 0 : JSON.stringify(options.body)
418
+ });
419
+ const payload = await response.json().catch(() => ({}));
420
+ if (!response.ok) {
421
+ const message = isRecord(payload) && typeof payload.error === "string" ? payload.error : `Capacity provider request failed with ${response.status}.`;
422
+ throw new CapacityProviderApiError(message, response.status, payload);
423
+ }
424
+ return payload;
425
+ }
426
+ register(request) {
427
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.register, {
428
+ method: "POST",
429
+ body: { ...request, marketId: request.marketId ?? this.marketId }
430
+ }).then((response) => {
431
+ assertCapacityProviderRegistrationResponse(response);
432
+ return response;
433
+ });
434
+ }
435
+ heartbeat(request = {}) {
436
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.heartbeat, {
437
+ method: "POST",
438
+ body: { ...request, marketId: request.marketId ?? this.marketId }
439
+ }).then((response) => {
440
+ assertCapacityProviderOkEnvelope(response, "Capacity provider heartbeat response");
441
+ return response;
442
+ });
443
+ }
444
+ portfolio() {
445
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.portfolio).then((response) => {
446
+ assertCapacityProviderPortfolioManifest(response);
447
+ return response;
448
+ });
449
+ }
450
+ createWorkday(request) {
451
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.workdays, {
452
+ method: "POST",
453
+ body: request
454
+ }).then((response) => {
455
+ assertCapacityProviderOkEnvelope(response, "Capacity provider workday response");
456
+ return response;
457
+ });
458
+ }
459
+ claimTask(request = {}) {
460
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.claimTask, {
461
+ method: "POST",
462
+ body: request
463
+ }).then((response) => {
464
+ assertCapacityProviderOkEnvelope(response, "Capacity provider task claim response");
465
+ if (!Array.isArray(response.tasks)) throw new Error("Capacity provider task claim response is missing tasks.");
466
+ return response;
467
+ });
468
+ }
469
+ appendTaskEvent(taskId, request) {
470
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.taskEvents(taskId), {
471
+ method: "POST",
472
+ body: request
473
+ }).then((response) => {
474
+ assertCapacityProviderOkEnvelope(response, "Capacity provider task event response");
475
+ return response;
476
+ });
477
+ }
478
+ completeTask(taskId, request = {}) {
479
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.completeTask(taskId), {
480
+ method: "POST",
481
+ body: request
482
+ }).then((response) => {
483
+ assertCapacityProviderOkEnvelope(response, "Capacity provider task completion response");
484
+ return response;
485
+ });
486
+ }
487
+ failTask(taskId, request) {
488
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.failTask(taskId), {
489
+ method: "POST",
490
+ body: request
491
+ }).then((response) => {
492
+ assertCapacityProviderOkEnvelope(response, "Capacity provider task failure response");
493
+ return response;
494
+ });
495
+ }
496
+ reportUsage(request) {
497
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.usage, {
498
+ method: "POST",
499
+ body: request
500
+ }).then((response) => {
501
+ assertCapacityProviderOkEnvelope(response, "Capacity provider usage response");
502
+ return response;
503
+ });
504
+ }
505
+ writeReport(request) {
506
+ return this.requestJson(CAPACITY_PROVIDER_ENDPOINTS.reports, {
507
+ method: "POST",
508
+ body: request
509
+ }).then((response) => {
510
+ assertCapacityProviderOkEnvelope(response, "Capacity provider report response");
511
+ return response;
512
+ });
513
+ }
514
+ }
515
+ export {
516
+ CAPACITY_PROVIDER_DEPLOYMENT_SERVICE_ROLES,
517
+ CAPACITY_PROVIDER_ENDPOINTS,
518
+ CAPACITY_PROVIDER_ENV_KEYS,
519
+ CAPACITY_PROVIDER_SCOPES,
520
+ CapacityProviderApiError,
521
+ MarketProviderClient,
522
+ assertCapacityProviderOkEnvelope,
523
+ assertCapacityProviderPortfolioManifest,
524
+ assertCapacityProviderRegistrationResponse,
525
+ buildCapacityProviderAuthHeaders,
526
+ deployCapacityProviderToManagedMarketHost,
527
+ deployCapacityProviderToRailway,
528
+ isCapacityProviderSecretEnvKey,
529
+ persistCapacityProviderConnectionToTreeseedConfig,
530
+ redactCapacityProviderEnv,
531
+ redactCapacityProviderSecret,
532
+ renderCapacityProviderSelfHostInstructions,
533
+ resolveCapacityProviderEnvironment,
534
+ resolveCapacityProviderLaunchEnvironment
535
+ };
@@ -1,38 +1,5 @@
1
- import type { AttentionEstimate, AttentionPolicy, CapacityEstimateConfidence, CapacityGrant, CapacityPlan, CapacityProvider, CapacityProviderLane, CapacityReservation, CreateCapacityReservationRequest, CreateCapacityRoutingDecisionRequest, ExecutionProfile, HybridExecutionPlan, PlannedTaskNode, PlanningAdmissionResult, PlanningPolicy, PredictiveReservePolicy, RecordCapacityUsageRequest, ReservePrediction, TaskAdmissionDecision, TaskAdmissionPolicy, TaskClassification, TaskEstimateProfile, TaskPlanProposal, TaskMutationScope, TaskUsageActual, UtilityEstimate, UtilityPolicy, WorkdayBudgetEnvelope } from './sdk-types.ts';
1
+ import type { AttentionEstimate, AttentionPolicy, CapacityEstimateConfidence, CapacityGrant, CapacityPlan, CapacityProvider, CapacityProviderLane, CapacityReservation, CreateCapacityReservationRequest, CreateCapacityRoutingDecisionRequest, ExecutionProfile, HybridExecutionPlan, PlannedTaskNode, PlanningAdmissionResult, PlanningPolicy, PredictiveReservePolicy, ProjectEnvironmentName, RecordCapacityUsageRequest, ReservePrediction, TaskAdmissionDecision, TaskAdmissionPolicy, TaskClassification, TaskEstimateProfile, TaskPlanProposal, TaskMutationScope, TaskUsageActual, UtilityEstimate, UtilityPolicy, WorkdayBudgetEnvelope } from './sdk-types.ts';
2
2
  import type { AgentProviderProfile } from './types/agents.ts';
3
- export type ProcessingEnvironment = 'local' | 'staging' | 'prod';
4
- export interface CapacityProviderRegistration {
5
- id: string;
6
- teamId: string;
7
- providerKind: 'processing-host';
8
- serviceBaseUrl: string;
9
- environments: ProcessingEnvironment[];
10
- capabilities: string[];
11
- status: 'pending' | 'active' | 'degraded' | 'disabled';
12
- heartbeatAt: string;
13
- limits: {
14
- maxWorkers: number;
15
- dailyTaskCreditBudget: number;
16
- maxQueuedTasks: number;
17
- };
18
- }
19
- export interface CapacityProviderHeartbeat {
20
- providerId: string;
21
- status: CapacityProviderRegistration['status'];
22
- heartbeatAt: string;
23
- queueDepth?: number | null;
24
- activeWorkers?: number | null;
25
- draining?: boolean;
26
- }
27
- export interface CapacityProviderHealth {
28
- ok: boolean;
29
- status: CapacityProviderRegistration['status'];
30
- capabilities: string[];
31
- queueDepth: number;
32
- activeWorkers: number;
33
- draining: boolean;
34
- checkedAt: string;
35
- }
36
3
  export interface CapacityEstimateInput {
37
4
  taskSignature?: string | null;
38
5
  taskKind?: string | null;
@@ -141,7 +108,7 @@ export interface TeamCapacitySummary {
141
108
  }
142
109
  export interface ProjectCapacitySummary extends TeamCapacitySummary {
143
110
  projectId: string;
144
- environment: ProcessingEnvironment;
111
+ environment: ProjectEnvironmentName | 'local';
145
112
  readiness: 'ready' | 'waiting_for_budget' | 'waiting_for_provider' | 'paused_by_policy' | 'needs_approval';
146
113
  reasons: string[];
147
114
  }
@@ -1,4 +1,4 @@
1
- import type { AgentPool, AgentPoolRegistration, AgentPoolScaleDecision, ApprovalRequest, CapacityGrant, CapacityPlan, CapacityProvider, CapacityProviderLane, CapacityReservation, CapacityRoutingDecision, CatalogArtifactVersion, CatalogItem, CatalogItemFilters, CreateCapacityReservationRequest, CreateCapacityRoutingDecisionRequest, CreateProjectDeploymentRequest, CreateTaskEstimateRequest, CreateTaskUsageActualRequest, PriorityOverride, PrioritySnapshot, ProjectConnection, ProjectDeployment, ProjectEnvironment, ProjectEnvironmentName, ProjectHosting, ProjectInfrastructureResource, ProjectWorkdaySummary, RecordAgentPoolRegistrationRequest, RecordCapacityUsageRequest, RepositoryClaim, RunnerScaleDecision, ScaleDecision, SdkAppendTaskEventRequest, SdkClaimTaskRequest, SdkClaimWorkdayManagerLeaseRequest, SdkCloseWorkDayRequest, SdkCompleteTaskRequest, SdkCreateTaskRequest, SdkFailTaskRequest, SdkManagerContextPayload, SdkRecordRepositoryClaimRequest, SdkRecordRunnerScaleDecisionRequest, SdkRecordWorkerRunnerRequest, SdkReleaseWorkdayManagerLeaseRequest, SdkStartWorkDayRequest, SdkTaskEntity, SdkTaskEventEntity, SdkTaskOutputEntity, SdkTaskProgressRequest, SdkTaskSearchRequest, SdkCreateWorkdayRequest, SdkWorkDayEntity, TeamStorageLocator, TeamWebHost, TaskEstimate, UpsertAgentPoolRequest, UpsertCapacityGrantRequest, UpsertCapacityProviderLaneRequest, UpsertCapacityProviderRequest, UpsertCatalogArtifactVersionRequest, UpsertCatalogItemRequest, UpsertProjectEnvironmentRequest, UpsertProjectHostingRequest, UpsertProjectInfrastructureResourceRequest, UpsertTeamStorageLocatorRequest, UpsertTeamWebHostRequest, WorkdayPolicy, WorkdayManagerLease, WorkdayRequest, WorkerRunner, SdkPriorityOverrideRequest, SdkUpsertWorkPolicyRequest } from './sdk-types.ts';
1
+ import type { AgentPool, AgentPoolRegistration, AgentPoolScaleDecision, ApprovalRequest, CapacityGrant, CapacityPlan, CapacityProvider, CapacityProviderLane, CapacityProviderRotateKeyResponse, CapacityReservation, CapacityRoutingDecision, CatalogArtifactVersion, CatalogItem, CatalogItemFilters, CreateCapacityProviderRequest, CreateCapacityProviderResponse, CreateCapacityReservationRequest, CreateCapacityRoutingDecisionRequest, CreateProjectDeploymentRequest, CreateTaskEstimateRequest, CreateTaskUsageActualRequest, PriorityOverride, PrioritySnapshot, ProjectConnection, ProjectDeployment, ProjectEnvironment, ProjectEnvironmentName, ProjectHosting, ProjectInfrastructureResource, ProjectWorkdaySummary, RecordAgentPoolRegistrationRequest, RecordCapacityUsageRequest, RenameCapacityProviderRequest, RepositoryClaim, RunnerScaleDecision, ScaleDecision, SdkAppendTaskEventRequest, SdkClaimTaskRequest, SdkClaimWorkdayManagerLeaseRequest, SdkCloseWorkDayRequest, SdkCompleteTaskRequest, SdkCreateTaskRequest, SdkFailTaskRequest, SdkManagerContextPayload, SdkRecordRepositoryClaimRequest, SdkRecordRunnerScaleDecisionRequest, SdkRecordWorkerRunnerRequest, SdkReleaseWorkdayManagerLeaseRequest, SdkStartWorkDayRequest, SdkTaskEntity, SdkTaskEventEntity, SdkTaskOutputEntity, SdkTaskProgressRequest, SdkTaskSearchRequest, SdkCreateWorkdayRequest, SdkWorkDayEntity, TeamStorageLocator, TeamWebHost, TaskEstimate, UpsertAgentPoolRequest, UpsertCapacityGrantRequest, UpsertCapacityProviderLaneRequest, UpsertCapacityProviderRequest, UpsertCatalogArtifactVersionRequest, UpsertCatalogItemRequest, UpsertProjectEnvironmentRequest, UpsertProjectHostingRequest, UpsertProjectInfrastructureResourceRequest, UpsertTeamStorageLocatorRequest, UpsertTeamWebHostRequest, WorkdayPolicy, WorkdayManagerLease, WorkdayRequest, WorkerRunner, SdkPriorityOverrideRequest, SdkUpsertWorkPolicyRequest } from './sdk-types.ts';
2
2
  import type { AgentMessageRecord, AgentStatusRecord, DirectBoardItemSummary, InboxItem, LaunchProjectRequest, LaunchProjectResult, ProjectOverviewSummary, ReleaseDetail, ReleaseSummary, SharePackageStatus, TeamHomeSummary, TeamMemberSummary, WorkstreamDetail, WorkstreamSummary } from './project-workflow.ts';
3
3
  export interface ControlPlaneClientOptions {
4
4
  baseUrl: string;
@@ -128,8 +128,13 @@ export declare class ControlPlaneClient {
128
128
  listCapacityProviders(teamId: string): Promise<(CapacityProvider & {
129
129
  lanes?: CapacityProviderLane[];
130
130
  })[]>;
131
- createCapacityProvider(teamId: string, input: UpsertCapacityProviderRequest): Promise<CapacityProvider>;
132
- updateCapacityProvider(teamId: string, providerId: string, input: Partial<UpsertCapacityProviderRequest>): Promise<CapacityProvider>;
131
+ createCapacityProvider(teamId: string, input: UpsertCapacityProviderRequest): Promise<CreateCapacityProviderResponse>;
132
+ createCapacityProviderRegistration(teamId: string, input: CreateCapacityProviderRequest): Promise<CreateCapacityProviderResponse>;
133
+ updateCapacityProvider(teamId: string, providerId: string, input: Partial<UpsertCapacityProviderRequest> | RenameCapacityProviderRequest): Promise<{
134
+ ok: true;
135
+ provider: CapacityProvider;
136
+ }>;
137
+ rotateCapacityProviderApiKey(teamId: string, providerId: string): Promise<CapacityProviderRotateKeyResponse>;
133
138
  listCapacityProviderLanes(teamId: string, providerId: string): Promise<CapacityProviderLane[]>;
134
139
  createCapacityProviderLane(teamId: string, providerId: string, input: UpsertCapacityProviderLaneRequest): Promise<CapacityProviderLane>;
135
140
  listCapacityGrants(teamId: string, input?: {
@@ -41,7 +41,7 @@ class ControlPlaneClient {
41
41
  if (!payload.ok) {
42
42
  throw new Error(`Control-plane request returned a non-ok envelope for ${pathname}.`);
43
43
  }
44
- return payload.payload;
44
+ return Object.prototype.hasOwnProperty.call(payload, "payload") ? payload.payload : payload;
45
45
  }
46
46
  listCatalogItems(filters = {}) {
47
47
  return this.requestJson("GET", "/v1/catalog", {
@@ -476,6 +476,11 @@ class ControlPlaneClient {
476
476
  body: input
477
477
  });
478
478
  }
479
+ createCapacityProviderRegistration(teamId, input) {
480
+ return this.requestJson("POST", `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers`, {
481
+ body: input
482
+ });
483
+ }
479
484
  updateCapacityProvider(teamId, providerId, input) {
480
485
  return this.requestJson(
481
486
  "PATCH",
@@ -483,6 +488,12 @@ class ControlPlaneClient {
483
488
  { body: input }
484
489
  );
485
490
  }
491
+ rotateCapacityProviderApiKey(teamId, providerId) {
492
+ return this.requestJson(
493
+ "POST",
494
+ `/v1/teams/${encodeURIComponent(teamId)}/capacity-providers/${encodeURIComponent(providerId)}/keys/rotate`
495
+ );
496
+ }
486
497
  listCapacityProviderLanes(teamId, providerId) {
487
498
  return this.requestJson(
488
499
  "GET",
package/dist/dispatch.js CHANGED
@@ -72,7 +72,6 @@ const LOCAL_ONLY_WORKFLOW_OPERATIONS = /* @__PURE__ */ new Set([
72
72
  "secrets:rotate-passphrase",
73
73
  "secrets:rotate-machine-key",
74
74
  "dev",
75
- "dev:watch",
76
75
  "mailpit:up",
77
76
  "mailpit:down",
78
77
  "mailpit:logs",
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export { projectConnectionModeFromHosting } from './sdk-types.ts';
4
4
  export { createControlPlaneReporter } from './control-plane.ts';
5
5
  export { ControlPlaneClient } from './control-plane-client.ts';
6
6
  export * from './seeds/index.ts';
7
+ export { CAPACITY_PROVIDER_ENDPOINTS, CAPACITY_PROVIDER_DEPLOYMENT_SERVICE_ROLES, CAPACITY_PROVIDER_ENV_KEYS, CAPACITY_PROVIDER_SCOPES, CapacityProviderApiError, MarketProviderClient, assertCapacityProviderOkEnvelope, assertCapacityProviderPortfolioManifest, assertCapacityProviderRegistrationResponse, buildCapacityProviderAuthHeaders, deployCapacityProviderToManagedMarketHost, deployCapacityProviderToRailway, isCapacityProviderSecretEnvKey, redactCapacityProviderEnv, redactCapacityProviderSecret, renderCapacityProviderSelfHostInstructions, persistCapacityProviderConnectionToTreeseedConfig, resolveCapacityProviderEnvironment, resolveCapacityProviderLaunchEnvironment, } from './capacity-provider.ts';
7
8
  export { DEFAULT_EXECUTION_PROFILE_ID, DEFAULT_EXECUTION_PROFILES, DEFAULT_TASK_ADMISSION_POLICY, buildTaskEstimateProfileFromActuals, computeWorkdayBudgetEnvelope, decideTaskAdmission, estimateAttentionForTask, estimateConfidenceFromProfile, estimateLearningPercentile, estimateLearningVariance, estimateForClassification, estimateProfileConfidenceScore, estimateUtilityForTask, isInterruptedUsageActual, normalizeHybridExecutionPlan, mutationRequiresRepositoryClaim, normalizePlanningPolicy, normalizePredictiveReservePolicy, normalizeTaskPlanProposal, normalizeExecutionProfile, normalizeAttentionPolicy, normalizeTaskAdmissionPolicy, normalizeUtilityPolicy, predictReserveForCapacityPlan, progressivelyAdmitPlanProposal, rankPlannedTaskNodes, reservationHasCapacity, reserveCreditsForEstimate, routeAndReserveCapacity, scoreCapacityLane, selectBestCapacityLane, selectTaskEstimateProfile, settleCapacityActuals, shouldInterruptForCapacity, synthesizePlanEstimate, createReservationReleaseEntry, summarizeCapacityPlan, summarizeProjectCapacityPlan, summarizeTeamCapacityPlan, validateTaskPlanProposal, } from './capacity.ts';
8
9
  export { executeKnowledgeHubProviderLaunch, validateKnowledgeHubProviderLaunchPrerequisites, } from './operations/services/hub-provider-launch.ts';
9
10
  export { createKnowledgeHubRepositories, defaultHubContentResolutionPolicy, executeKnowledgeHubLaunch, normalizeKnowledgeHubLaunchIntent, planKnowledgeHubLaunch, planKnowledgeHubRepositories, validateRepositoryHost, type HubContentResolutionPolicy, type KnowledgeHubLaunchIntent, type KnowledgeHubLaunchPhase, type KnowledgeHubLaunchPlan, type KnowledgeHubLaunchResult, type KnowledgeHubRepositoryPlan, type RepositoryHost, } from './operations/services/hub-launch.ts';
@@ -39,6 +40,7 @@ export type { KnowledgeHubProviderLaunchPreflightReport, KnowledgeHubProviderLau
39
40
  export type * from './project-workflow.ts';
40
41
  export type { ControlPlaneAgentPoolHeartbeat, ControlPlaneDeploymentReport, ControlPlaneEnvironmentReport, ControlPlaneReporter, ControlPlaneReporterKind, ControlPlaneResourceReport, ControlPlaneScaleDecisionReport, ControlPlaneWorkdaySummaryReport, } from './control-plane.ts';
41
42
  export type { ControlPlaneClientOptions } from './control-plane-client.ts';
43
+ export type { CapacityProviderBudgetCapacity, CapacityProviderCapability, CapacityProviderConnectionState, CapacityProviderDeploymentIntent, CapacityProviderDeploymentResult, CapacityProviderDeploymentStatus, CapacityProviderEnvironmentInput, CapacityProviderEnvironmentName, CapacityProviderHealthState, CapacityProviderHeartbeatRequest, CapacityProviderHeartbeatResponse, CapacityProviderLaunchMode, CapacityProviderLaunchEnvironment, CapacityProviderLaunchEnvironmentInput, CapacityProviderConnectionConfigInput, CapacityProviderConnectionConfigResult, CapacityProviderPortfolioManifest, CapacityProviderPortfolioProject, CapacityProviderRegistrationRequest, CapacityProviderRegistrationResponse, CapacityProviderRuntimeInfo, CapacityProviderScope, CapacityProviderSelfHostInstructions, CapacityProviderStatus, MarketProviderClientOptions, ProviderReportRequest, ProviderReportResponse, ProviderTaskClaimRequest, ProviderTaskClaimResponse, ProviderTaskCompleteRequest, ProviderTaskCompleteResponse, ProviderTaskEventRequest, ProviderTaskEventResponse, ProviderTaskFailRequest, ProviderTaskFailResponse, ProviderUsageReport, ProviderUsageReportResponse, ProviderWorkdayRequest, ProviderWorkdayResponse, } from './capacity-provider.ts';
42
44
  export type { AdmissionEstimateInput, CapacityInterruptionInput, CapacityEstimateInput, CapacityLaneCandidate, CapacityLaneScore, CapacityTaskEstimate, AttentionEstimate, AttentionPolicy, CapacityRoutePressure, RouteAndReserveCandidate, RouteAndReserveResult, TaskAdmissionInput, WorkdayBudgetEnvelopeInput, } from './capacity.ts';
43
45
  export type { TreeseedFieldAliasBinding, TreeseedFieldAliasRegistry, } from './field-aliases.ts';
44
46
  export type * from './operations-types.ts';