@treeseed/core 0.8.2 → 0.8.4

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 (133) hide show
  1. package/README.md +7 -11
  2. package/dist/dev-watch.js +1 -1
  3. package/dist/dev.d.ts +2 -4
  4. package/dist/dev.js +4 -124
  5. package/dist/env.yaml +23 -175
  6. package/dist/index.d.ts +0 -4
  7. package/dist/index.js +0 -6
  8. package/dist/scripts/build-dist.js +3 -3
  9. package/dist/scripts/dev-platform.js +1 -7
  10. package/dist/scripts/run-fixture-astro-command.js +25 -51
  11. package/dist/scripts/test-smoke.js +50 -7
  12. package/package.json +5 -78
  13. package/templates/github/deploy-web.workflow.yml +106 -0
  14. package/templates/github/hosted-project.workflow.yml +4 -4
  15. package/dist/agent-runtime.d.ts +0 -17
  16. package/dist/agent-runtime.js +0 -117
  17. package/dist/agent.d.ts +0 -11
  18. package/dist/agent.js +0 -25
  19. package/dist/agents/adapters/execution.d.ts +0 -41
  20. package/dist/agents/adapters/execution.js +0 -73
  21. package/dist/agents/adapters/mutations.d.ts +0 -22
  22. package/dist/agents/adapters/mutations.js +0 -30
  23. package/dist/agents/adapters/notification.d.ts +0 -26
  24. package/dist/agents/adapters/notification.js +0 -46
  25. package/dist/agents/adapters/repository.d.ts +0 -23
  26. package/dist/agents/adapters/repository.js +0 -61
  27. package/dist/agents/adapters/research.d.ts +0 -26
  28. package/dist/agents/adapters/research.js +0 -59
  29. package/dist/agents/adapters/verification.d.ts +0 -36
  30. package/dist/agents/adapters/verification.js +0 -62
  31. package/dist/agents/cli-tools.d.ts +0 -1
  32. package/dist/agents/cli-tools.js +0 -5
  33. package/dist/agents/cli.d.ts +0 -15
  34. package/dist/agents/cli.js +0 -109
  35. package/dist/agents/contracts/messages.d.ts +0 -88
  36. package/dist/agents/contracts/messages.js +0 -138
  37. package/dist/agents/contracts/run.d.ts +0 -21
  38. package/dist/agents/contracts/run.js +0 -0
  39. package/dist/agents/index.d.ts +0 -1
  40. package/dist/agents/index.js +0 -5
  41. package/dist/agents/kernel/agent-kernel.d.ts +0 -51
  42. package/dist/agents/kernel/agent-kernel.js +0 -292
  43. package/dist/agents/kernel/trigger-resolver.d.ts +0 -19
  44. package/dist/agents/kernel/trigger-resolver.js +0 -157
  45. package/dist/agents/registry-helper.d.ts +0 -4
  46. package/dist/agents/registry-helper.js +0 -14
  47. package/dist/agents/registry.d.ts +0 -6
  48. package/dist/agents/registry.js +0 -98
  49. package/dist/agents/runtime-types.d.ts +0 -118
  50. package/dist/agents/runtime-types.js +0 -0
  51. package/dist/agents/spec-loader.d.ts +0 -18
  52. package/dist/agents/spec-loader.js +0 -55
  53. package/dist/agents/spec-normalizer.d.ts +0 -2
  54. package/dist/agents/spec-normalizer.js +0 -327
  55. package/dist/agents/spec-types.d.ts +0 -64
  56. package/dist/agents/spec-types.js +0 -0
  57. package/dist/agents/testing/agents-smoke.d.ts +0 -1
  58. package/dist/agents/testing/agents-smoke.js +0 -32
  59. package/dist/agents/testing/e2e-harness.d.ts +0 -44
  60. package/dist/agents/testing/e2e-harness.js +0 -504
  61. package/dist/api/agent-routes.d.ts +0 -13
  62. package/dist/api/agent-routes.js +0 -327
  63. package/dist/api/app.d.ts +0 -5
  64. package/dist/api/app.js +0 -361
  65. package/dist/api/auth/d1-database.d.ts +0 -3
  66. package/dist/api/auth/d1-database.js +0 -20
  67. package/dist/api/auth/d1-provider.d.ts +0 -79
  68. package/dist/api/auth/d1-provider.js +0 -92
  69. package/dist/api/auth/d1-store.d.ts +0 -114
  70. package/dist/api/auth/d1-store.js +0 -895
  71. package/dist/api/auth/memory-provider.d.ts +0 -77
  72. package/dist/api/auth/memory-provider.js +0 -249
  73. package/dist/api/auth/rbac.d.ts +0 -22
  74. package/dist/api/auth/rbac.js +0 -162
  75. package/dist/api/auth/tokens.d.ts +0 -18
  76. package/dist/api/auth/tokens.js +0 -56
  77. package/dist/api/capabilities.d.ts +0 -9
  78. package/dist/api/capabilities.js +0 -33
  79. package/dist/api/config.d.ts +0 -2
  80. package/dist/api/config.js +0 -77
  81. package/dist/api/http.d.ts +0 -28
  82. package/dist/api/http.js +0 -51
  83. package/dist/api/index.d.ts +0 -9
  84. package/dist/api/index.js +0 -18
  85. package/dist/api/operations-routes.d.ts +0 -11
  86. package/dist/api/operations-routes.js +0 -87
  87. package/dist/api/operations.d.ts +0 -3
  88. package/dist/api/operations.js +0 -26
  89. package/dist/api/project-routes.d.ts +0 -8
  90. package/dist/api/project-routes.js +0 -586
  91. package/dist/api/providers.d.ts +0 -2
  92. package/dist/api/providers.js +0 -62
  93. package/dist/api/railway.d.ts +0 -50
  94. package/dist/api/railway.js +0 -69
  95. package/dist/api/sdk-dispatch.d.ts +0 -5
  96. package/dist/api/sdk-dispatch.js +0 -13
  97. package/dist/api/sdk-routes.d.ts +0 -11
  98. package/dist/api/sdk-routes.js +0 -29
  99. package/dist/api/server.d.ts +0 -2
  100. package/dist/api/server.js +0 -10
  101. package/dist/api/templates.d.ts +0 -3
  102. package/dist/api/templates.js +0 -31
  103. package/dist/api/types.d.ts +0 -231
  104. package/dist/api/types.js +0 -0
  105. package/dist/api.d.ts +0 -1
  106. package/dist/api.js +0 -1
  107. package/dist/railway.d.ts +0 -1
  108. package/dist/railway.js +0 -4
  109. package/dist/services/agents.d.ts +0 -11
  110. package/dist/services/agents.js +0 -48
  111. package/dist/services/common.d.ts +0 -66
  112. package/dist/services/common.js +0 -212
  113. package/dist/services/index.d.ts +0 -6
  114. package/dist/services/index.js +0 -19
  115. package/dist/services/manager.d.ts +0 -267
  116. package/dist/services/manager.js +0 -1368
  117. package/dist/services/remote-runner.d.ts +0 -30
  118. package/dist/services/remote-runner.js +0 -230
  119. package/dist/services/workday-content.d.ts +0 -53
  120. package/dist/services/workday-content.js +0 -190
  121. package/dist/services/workday-manager.d.ts +0 -279
  122. package/dist/services/workday-manager.js +0 -163
  123. package/dist/services/workday-report.d.ts +0 -195
  124. package/dist/services/workday-report.js +0 -17
  125. package/dist/services/workday-start.d.ts +0 -195
  126. package/dist/services/workday-start.js +0 -17
  127. package/dist/services/worker-capacity.d.ts +0 -58
  128. package/dist/services/worker-capacity.js +0 -208
  129. package/dist/services/worker-pool-scaler.d.ts +0 -27
  130. package/dist/services/worker-pool-scaler.js +0 -127
  131. package/dist/services/worker.d.ts +0 -19
  132. package/dist/services/worker.js +0 -436
  133. package/templates/github/deploy.workflow.yml +0 -577
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # @treeseed/core
2
2
 
3
- `@treeseed/core` is the Treeseed integrated platform starter for Astro/Starlight sites, Hono API runtimes, agent runtimes, and worker services. It contains the published web runtime, API runtime, manager/worker entrypoints, integrated local dev orchestration, shared components and styles, the knowledge-factory content model, and the forms stack used by Treeseed tenants.
3
+ `@treeseed/core` is the Treeseed web framework package for Astro/Starlight sites. It contains the published web runtime, tenant site configuration, shared components and styles, the knowledge-factory content model, and the forms stack used by Treeseed tenants.
4
+
5
+ Backend API, agent runtime, manager, worker, and workday processing services are owned by `@treeseed/agent`.
4
6
 
5
7
  This repository is the package root. Run package commands from [`core`](./), not from the top-level `treeseed` workspace.
6
8
 
@@ -33,7 +35,7 @@ npm ci
33
35
  - `test/`: unit tests run by Vitest
34
36
  - `.fixtures/treeseed-fixtures/`: pinned shared fixtures submodule
35
37
  - `.github/workflows/`: CI and publish workflows for this package repo
36
- - `templates/github/deploy.workflow.yml`: downstream tenant deploy workflow template
38
+ - `templates/github/deploy-web.workflow.yml`: downstream tenant web deploy workflow template
37
39
 
38
40
  The package builds directly against the canonical shared working-site fixture in `treeseed-fixtures`.
39
41
 
@@ -50,10 +52,6 @@ That means the fixture may reference package surfaces owned by `sdk`, `core`, an
50
52
  ```bash
51
53
  npm run dev
52
54
  npm run dev:web
53
- npm run dev:api
54
- npm run dev:worker
55
- npm run dev:workday-manager
56
- npm run dev:worker-runner
57
55
  npm run fixtures:check
58
56
  npm run build:dist
59
57
  npm run test:unit
@@ -64,10 +62,8 @@ npm run test:smoke
64
62
 
65
63
  What they do:
66
64
 
67
- - `dev`: starts the integrated Astro UI and Hono API local runtime from `core`
65
+ - `dev`: starts the Astro UI local runtime from `core`
68
66
  - `dev:web`: starts only the Astro UI dev surface through the `core` runtime
69
- - `dev:api`: starts only the Hono API dev surface through the `core` runtime
70
- - `dev:workday-manager`, `dev:worker-runner`: start the scheduled manager and worker runner entrypoints from `core`
71
67
  - `fixtures:check`: verifies that the pinned shared fixture is initialized and usable
72
68
  - `build:dist`: builds the publishable `dist/` package output
73
69
  - `test:unit`: runs package unit tests with Vitest
@@ -117,7 +113,7 @@ This repo ships two package workflows:
117
113
  - [`ci.yml`](./.github/workflows/ci.yml): runs on push and pull request, installs with `npm ci`, then runs `npm run verify`
118
114
  - [`publish.yml`](./.github/workflows/publish.yml): runs on `workflow_dispatch` and on plain semver tags like `0.1.0`; it installs with `npm ci`, validates the tag with `release:check-tag`, runs `npm run verify`, and publishes with `NPM_TOKEN`
119
115
 
120
- The deploy workflow template at [`templates/github/deploy.workflow.yml`](./templates/github/deploy.workflow.yml) is for downstream Treeseed site repositories, not for publishing this package.
116
+ The deploy workflow template at [`templates/github/deploy-web.workflow.yml`](./templates/github/deploy-web.workflow.yml) is for downstream Treeseed web repositories, not for publishing this package. Processing host deploy assets are owned by `@treeseed/agent`.
121
117
 
122
118
  ## Consumer Contract
123
119
 
@@ -132,7 +128,7 @@ The published package includes:
132
128
  - `utils/`
133
129
  - `README.md`
134
130
 
135
- The package currently depends on `@treeseed/sdk` plus the runtime packages needed for its web, API, and worker surfaces. It does not depend on `@treeseed/cli`.
131
+ The package currently depends on `@treeseed/sdk` plus the runtime packages needed for its web surfaces. It does not depend on `@treeseed/cli` or `@treeseed/agent`.
136
132
 
137
133
  ## Contributor Workflow
138
134
 
package/dist/dev-watch.js CHANGED
@@ -85,7 +85,7 @@ function classifyChanges(changedPaths, watchEntries) {
85
85
  }
86
86
  function isTenantApiInput(filePath) {
87
87
  const normalized = filePath.split(sep).join("/");
88
- return normalized.includes("/src/api/") || normalized.endsWith("/src/api") || normalized.endsWith("/treeseed.site.yaml") || normalized.endsWith("/treeseed.config.ts") || normalized.endsWith("/package.json") || normalized.endsWith("/tsconfig.json");
88
+ return normalized.endsWith("/treeseed.site.yaml") || normalized.endsWith("/treeseed.config.ts") || normalized.endsWith("/package.json") || normalized.endsWith("/tsconfig.json");
89
89
  }
90
90
  const tenantChanged = changedPaths.some(
91
91
  (filePath) => watchEntries.some((entry) => entry.kind === "tenant" && matchesEntry(filePath, entry))
package/dist/dev.d.ts CHANGED
@@ -5,11 +5,10 @@ export declare const TREESEED_DEFAULT_WEB_HOST = "127.0.0.1";
5
5
  export declare const TREESEED_DEFAULT_WEB_PORT = 4321;
6
6
  export declare const TREESEED_DEFAULT_API_HOST = "127.0.0.1";
7
7
  export declare const TREESEED_DEFAULT_API_PORT = 3000;
8
- export declare const TREESEED_DEFAULT_MANAGER_PORT = 3100;
9
8
  export declare const TREESEED_DEFAULT_LOCAL_SMTP_HOST = "127.0.0.1";
10
9
  export declare const TREESEED_DEFAULT_LOCAL_SMTP_PORT = 1025;
11
10
  export declare const TREESEED_DEFAULT_MAILPIT_UI_PORT = 8025;
12
- export type TreeseedIntegratedDevSurface = 'integrated' | 'services' | 'web' | 'api' | 'manager' | 'worker';
11
+ export type TreeseedIntegratedDevSurface = 'integrated' | 'web';
13
12
  export type TreeseedIntegratedDevSetupMode = 'auto' | 'check' | 'off';
14
13
  export type TreeseedIntegratedDevFeedbackMode = 'live' | 'restart' | 'off';
15
14
  export type TreeseedIntegratedDevOpenMode = 'auto' | 'on' | 'off';
@@ -31,7 +30,6 @@ export type TreeseedIntegratedDevOptions = {
31
30
  webPort?: number;
32
31
  apiHost?: string;
33
32
  apiPort?: number;
34
- managerPort?: number;
35
33
  setupMode?: TreeseedIntegratedDevSetupMode;
36
34
  feedbackMode?: TreeseedIntegratedDevFeedbackMode;
37
35
  openMode?: TreeseedIntegratedDevOpenMode;
@@ -46,7 +44,7 @@ export type TreeseedIntegratedDevOptions = {
46
44
  shutdownGraceMs?: number;
47
45
  };
48
46
  export type TreeseedIntegratedDevCommand = {
49
- id: 'web' | 'api' | 'manager' | 'worker';
47
+ id: 'web';
50
48
  label: string;
51
49
  command: string;
52
50
  args: string[];
package/dist/dev.js CHANGED
@@ -27,7 +27,6 @@ const TREESEED_DEFAULT_WEB_HOST = "127.0.0.1";
27
27
  const TREESEED_DEFAULT_WEB_PORT = 4321;
28
28
  const TREESEED_DEFAULT_API_HOST = "127.0.0.1";
29
29
  const TREESEED_DEFAULT_API_PORT = 3e3;
30
- const TREESEED_DEFAULT_MANAGER_PORT = 3100;
31
30
  const TREESEED_DEFAULT_LOCAL_SMTP_HOST = "127.0.0.1";
32
31
  const TREESEED_DEFAULT_LOCAL_SMTP_PORT = 1025;
33
32
  const TREESEED_DEFAULT_MAILPIT_UI_PORT = 8025;
@@ -83,28 +82,6 @@ function resolveOptionalScriptEntrypoint(packageDir, sourceRelativePath, distRel
83
82
  }
84
83
  return null;
85
84
  }
86
- function resolveTenantApiEntrypoint(tenantRoot, runTsPath) {
87
- const javascriptCandidates = [
88
- resolve(tenantRoot, "src", "api", "server.js"),
89
- resolve(tenantRoot, "src", "api", "server.mjs")
90
- ];
91
- for (const candidate of javascriptCandidates) {
92
- if (existsSync(candidate)) {
93
- return {
94
- command: process.execPath,
95
- args: [candidate]
96
- };
97
- }
98
- }
99
- const typescriptCandidate = resolve(tenantRoot, "src", "api", "server.ts");
100
- if (existsSync(typescriptCandidate) && existsSync(runTsPath)) {
101
- return {
102
- command: process.execPath,
103
- args: [runTsPath, typescriptCandidate]
104
- };
105
- }
106
- return null;
107
- }
108
85
  function normalizePort(value, fallback) {
109
86
  return Number.isInteger(value) && Number(value) > 0 ? Number(value) : fallback;
110
87
  }
@@ -156,20 +133,6 @@ function selectWebLocalRuntime(surfaceConfig, providerFallback = "local") {
156
133
  reason: requested === "local" ? "Configured to use the full local Astro runtime." : `Provider "${provider}" has no provider-local web runtime; using Astro local.`
157
134
  };
158
135
  }
159
- function selectServiceLocalRuntime(serviceName, serviceConfig) {
160
- const record = serviceConfig && typeof serviceConfig === "object" ? serviceConfig : {};
161
- const provider = normalizeProvider(record.provider, "railway");
162
- const requested = normalizeLocalRuntimeMode(record.local?.runtime);
163
- if (requested === "provider") {
164
- throw new Error(unsupportedProviderRuntimeMessage("service", serviceName, provider));
165
- }
166
- return {
167
- requested,
168
- provider,
169
- selected: "node-local",
170
- reason: requested === "local" ? "Configured to use the full local Node runtime." : `Provider "${provider}" has no provider-local service runtime; using Node local.`
171
- };
172
- }
173
136
  function loadDevDeployConfig(tenantRoot) {
174
137
  try {
175
138
  return loadTreeseedDeployConfig(resolve(tenantRoot, "treeseed.site.yaml"));
@@ -272,9 +235,6 @@ function createWatchEntries(tenantRoot, sdkPackageRoot) {
272
235
  }
273
236
  return entries;
274
237
  }
275
- function isSurfaceIncluded(plan, id) {
276
- return plan.commands.some((command) => command.id === id);
277
- }
278
238
  function createSetupSteps(tenantRoot, setupMode, sdkPackageRoot, planLike, env, mailpitEnabled, usesCloudflareWebRuntime) {
279
239
  if (setupMode === "off") {
280
240
  return [
@@ -311,7 +271,7 @@ function createSetupSteps(tenantRoot, setupMode, sdkPackageRoot, planLike, env,
311
271
  {
312
272
  id: "wrangler",
313
273
  label: "Verify Wrangler executable",
314
- required: usesCloudflareWebRuntime || isSurfaceIncluded(planLike, "api"),
274
+ required: usesCloudflareWebRuntime,
315
275
  status: "planned",
316
276
  detail: resolveTreeseedToolBinary("wrangler", { env }) ?? void 0
317
277
  },
@@ -354,7 +314,7 @@ function createSetupSteps(tenantRoot, setupMode, sdkPackageRoot, planLike, env,
354
314
  detail: mailpitEnabled ? mailpit ? "Mailpit SMTP will listen on 127.0.0.1:1025 and the web UI on http://127.0.0.1:8025." : "Unable to resolve the Mailpit startup script." : "Docker Compose is unavailable, so Mailpit is disabled for this local dev run."
355
315
  }
356
316
  ];
357
- if ((isSurfaceIncluded(planLike, "api") || usesCloudflareWebRuntime) && existsSync(resolve(tenantRoot, "migrations"))) {
317
+ if (usesCloudflareWebRuntime && existsSync(resolve(tenantRoot, "migrations"))) {
358
318
  const migrate = resolveOptionalScriptEntrypoint(
359
319
  sdkPackageRoot,
360
320
  "scripts/tenant-d1-migrate-local.ts",
@@ -383,8 +343,6 @@ function createTreeseedIntegratedDevPlan(options = {}) {
383
343
  const webPort = normalizePort(options.webPort, TREESEED_DEFAULT_WEB_PORT);
384
344
  const apiHost = options.apiHost ?? TREESEED_DEFAULT_API_HOST;
385
345
  const apiPort = normalizePort(options.apiPort, TREESEED_DEFAULT_API_PORT);
386
- const managerPort = normalizePort(options.managerPort, TREESEED_DEFAULT_MANAGER_PORT);
387
- const includeServices = options.includeServices ?? (surface === "integrated" || surface === "services");
388
346
  const machineEnv = resolveLocalMachineEnv(tenantRoot);
389
347
  const mergedEnv = { ...process.env, ...machineEnv, ...options.env ?? {} };
390
348
  const projectId = options.projectId ?? mergedEnv.TREESEED_PROJECT_ID;
@@ -394,13 +352,7 @@ function createTreeseedIntegratedDevPlan(options = {}) {
394
352
  const sdkPackageRoot = resolvePackageRoot("@treeseed/sdk", tenantRoot);
395
353
  const deployConfig = loadDevDeployConfig(tenantRoot);
396
354
  const webLocalRuntime = selectWebLocalRuntime(deployConfig?.surfaces?.web, fallbackWebProviderFromDeployConfig(deployConfig));
397
- const serviceLocalRuntimes = {
398
- api: selectServiceLocalRuntime("api", deployConfig?.services?.api),
399
- manager: selectServiceLocalRuntime("manager", deployConfig?.services?.manager),
400
- worker: selectServiceLocalRuntime("worker", deployConfig?.services?.worker)
401
- };
402
355
  const usesCloudflareWebRuntime = webLocalRuntime.selected === "cloudflare-wrangler-local";
403
- const coreRunTsPath = resolve(packageRoot, "scripts", "run-ts.mjs");
404
356
  const webEntrypoint = resolveNodeEntrypoint(
405
357
  sdkPackageRoot,
406
358
  "scripts/tenant-astro-command.ts",
@@ -420,21 +372,6 @@ function createTreeseedIntegratedDevPlan(options = {}) {
420
372
  String(webPort)
421
373
  ]
422
374
  };
423
- const apiEntrypoint = resolveTenantApiEntrypoint(tenantRoot, coreRunTsPath) ?? resolveNodeEntrypoint(
424
- packageRoot,
425
- "src/api/server.ts",
426
- "dist/api/server.js"
427
- );
428
- const managerEntrypoint = resolveNodeEntrypoint(
429
- packageRoot,
430
- "src/services/manager.ts",
431
- "dist/services/manager.js"
432
- );
433
- const workerEntrypoint = resolveNodeEntrypoint(
434
- packageRoot,
435
- "src/services/worker.ts",
436
- "dist/services/worker.js"
437
- );
438
375
  const watchEntries = watch ? createWatchEntries(tenantRoot, sdkPackageRoot) : [];
439
376
  const mailpitEnabled = dockerComposeIsAvailable(mergedEnv);
440
377
  const resetRequested = options.reset === true;
@@ -480,46 +417,6 @@ function createTreeseedIntegratedDevPlan(options = {}) {
480
417
  localRuntime: webLocalRuntime
481
418
  });
482
419
  }
483
- if (surface === "integrated" || surface === "api") {
484
- commands.push({
485
- id: "api",
486
- label: "Hono API",
487
- command: apiEntrypoint.command,
488
- args: apiEntrypoint.args,
489
- cwd: tenantRoot,
490
- env: {
491
- ...sharedEnv,
492
- PORT: options.apiPort != null ? String(apiPort) : sharedEnv.PORT ?? String(apiPort)
493
- },
494
- localRuntime: serviceLocalRuntimes.api
495
- });
496
- }
497
- if (includeServices || surface === "manager") {
498
- commands.push({
499
- id: "manager",
500
- label: "Manager",
501
- command: managerEntrypoint.command,
502
- args: managerEntrypoint.args,
503
- cwd: tenantRoot,
504
- env: {
505
- ...sharedEnv,
506
- PORT: options.managerPort != null ? String(managerPort) : sharedEnv.PORT ?? String(managerPort),
507
- TREESEED_MANAGER_BASE_URL: options.managerPort != null ? `http://${apiHost}:${managerPort}` : sharedEnv.TREESEED_MANAGER_BASE_URL ?? `http://${apiHost}:${managerPort}`
508
- },
509
- localRuntime: serviceLocalRuntimes.manager
510
- });
511
- }
512
- if (includeServices || surface === "worker") {
513
- commands.push({
514
- id: "worker",
515
- label: "Worker",
516
- command: workerEntrypoint.command,
517
- args: workerEntrypoint.args,
518
- cwd: tenantRoot,
519
- env: sharedEnv,
520
- localRuntime: serviceLocalRuntimes.worker
521
- });
522
- }
523
420
  const readyChecks = commands.map((command) => {
524
421
  if (command.id === "web") {
525
422
  return {
@@ -530,15 +427,6 @@ function createTreeseedIntegratedDevPlan(options = {}) {
530
427
  url: webUrl ?? void 0
531
428
  };
532
429
  }
533
- if (command.id === "api") {
534
- return {
535
- id: command.id,
536
- label: command.label,
537
- required: true,
538
- strategy: "http",
539
- url: `${apiBaseUrl.replace(/\/$/u, "")}/readyz`
540
- };
541
- }
542
430
  return {
543
431
  id: command.id,
544
432
  label: command.label,
@@ -569,8 +457,7 @@ function createTreeseedIntegratedDevPlan(options = {}) {
569
457
  watchEntries,
570
458
  commands,
571
459
  localRuntimes: {
572
- web: webLocalRuntime,
573
- ...serviceLocalRuntimes
460
+ web: webLocalRuntime
574
461
  },
575
462
  reset
576
463
  };
@@ -1284,13 +1171,7 @@ async function runTreeseedIntegratedDev(options = {}, deps = {}) {
1284
1171
  await restartCommand("web");
1285
1172
  }
1286
1173
  if (change.packageChanged || change.sdkChanged) {
1287
- await Promise.all([
1288
- restartCommand("api"),
1289
- restartCommand("manager"),
1290
- restartCommand("worker")
1291
- ]);
1292
- } else if (change.tenantApiChanged) {
1293
- await restartCommand("api");
1174
+ await restartCommand("web");
1294
1175
  }
1295
1176
  if (plan.feedbackMode === "live") {
1296
1177
  writeDevReloadStamp(plan.tenantRoot);
@@ -1379,7 +1260,6 @@ export {
1379
1260
  TREESEED_DEFAULT_LOCAL_SMTP_HOST,
1380
1261
  TREESEED_DEFAULT_LOCAL_SMTP_PORT,
1381
1262
  TREESEED_DEFAULT_MAILPIT_UI_PORT,
1382
- TREESEED_DEFAULT_MANAGER_PORT,
1383
1263
  TREESEED_DEFAULT_WEB_HOST,
1384
1264
  TREESEED_DEFAULT_WEB_PORT,
1385
1265
  createTreeseedIntegratedDevPlan,
package/dist/env.yaml CHANGED
@@ -1,198 +1,34 @@
1
1
  entries:
2
- GH_TOKEN:
3
- label: GitHub access token
2
+ TREESEED_PROJECT_DOMAINS:
3
+ label: Project custom domains
4
4
  group: auth
5
- description: Personal access token used by Treeseed for GitHub CLI automation, repository setup, CI secret sync, and GitHub Copilot SDK-backed workflows.
6
- howToGet: "Create a GitHub fine-grained personal access token scoped to the TreeSeed repository. Required repository permissions: Contents read/write, Environments read/write, Secrets and variables read/write, Actions and workflows read/write, Pull requests read/write, Issues read/write. Then paste it here as GH_TOKEN."
7
- sensitivity: secret
8
- targets:
9
- - local-runtime
10
- - railway-secret
11
- scopes:
12
- - local
13
- - staging
14
- - prod
15
- requirement: required
16
- purposes:
17
- - save
18
- - config
19
- validation:
20
- kind: nonempty
21
- minLength: 8
22
- sourcePriority:
23
- - machine-config
24
- - process-env
25
- TREESEED_GITHUB_OWNER:
26
- label: GitHub repository owner
27
- group: github
28
- description: GitHub user or organization that owns the Treeseed repository used for bootstrap, CI/CD, and environment sync.
29
- howToGet: Treeseed suggests this from the origin remote when available. Otherwise enter the GitHub user or organization that should own the repository.
30
- sensitivity: plain
31
- targets:
32
- - local-runtime
33
- scopes:
34
- - local
35
- storage: scoped
36
- requirement: required
37
- purposes:
38
- - config
39
- validation:
40
- kind: nonempty
41
- sourcePriority:
42
- - machine-config
43
- - process-env
44
- defaultValueRef: githubOwnerDefault
45
- TREESEED_GITHUB_REPOSITORY_NAME:
46
- label: GitHub repository name
47
- group: github
48
- description: GitHub repository name Treeseed should verify or create before GitHub bootstrap.
49
- howToGet: Treeseed suggests this from the origin remote when available and otherwise defaults it from the site slug.
50
- sensitivity: plain
51
- targets:
52
- - local-runtime
53
- scopes:
54
- - local
55
- storage: scoped
56
- requirement: required
57
- purposes:
58
- - config
59
- validation:
60
- kind: nonempty
61
- sourcePriority:
62
- - machine-config
63
- - process-env
64
- defaultValueRef: githubRepositoryNameDefault
65
- TREESEED_GITHUB_REPOSITORY_VISIBILITY:
66
- label: GitHub repository visibility
67
- group: github
68
- description: Visibility to use if Treeseed needs to create the GitHub repository during bootstrap.
69
- howToGet: Choose private, public, or internal. Treeseed defaults new repositories to private.
70
- sensitivity: plain
71
- targets:
72
- - local-runtime
73
- scopes:
74
- - local
75
- storage: scoped
76
- requirement: optional
77
- purposes:
78
- - config
79
- validation:
80
- kind: enum
81
- values:
82
- - private
83
- - public
84
- - internal
85
- sourcePriority:
86
- - machine-config
87
- - process-env
88
- defaultValueRef: githubRepositoryVisibilityDefault
89
- CLOUDFLARE_API_TOKEN:
90
- label: Cloudflare API token
91
- group: auth
92
- description: Account-level Cloudflare API token used by Wrangler, Workers AI, and CI to manage Pages, Workers, Workers KV, D1, Queues, DNS, secrets, and deploys.
93
- howToGet: "Create a Cloudflare account-level API token scoped to the target domain and account. Required permissions: Account Cloudflare Pages edit, Account Workers Scripts edit, Account Workers KV Storage edit, Account D1 edit, Account Queues edit, Zone DNS edit, Workers AI Read, and Workers AI Edit for model execution. If TREESEED_COMMIT_AI_GATEWAY_ID is configured, also grant AI Gateway Read/Run access for the gateway. Then paste it here as CLOUDFLARE_API_TOKEN."
94
- sensitivity: secret
95
- targets:
96
- - local-runtime
97
- - github-secret
98
- scopes:
99
- - local
100
- - staging
101
- - prod
102
- storage: shared
103
- requirement: required
104
- purposes:
105
- - save
106
- - deploy
107
- - destroy
108
- - config
109
- validation:
110
- kind: nonempty
111
- minLength: 8
112
- sourcePriority:
113
- - machine-config
114
- - process-env
115
- RAILWAY_API_TOKEN:
116
- label: Railway API token
117
- group: auth
118
- description: Primary Railway token for user or workspace scoped access, including project creation and most Treeseed-managed Railway flows.
119
- howToGet: In Railway, create a user or workspace API token that can create and manage the target project, then paste it here.
120
- sensitivity: secret
121
- targets:
122
- - local-runtime
123
- - github-secret
124
- - railway-secret
125
- scopes:
126
- - staging
127
- - prod
128
- requirement: conditional
129
- purposes:
130
- - deploy
131
- - destroy
132
- - config
133
- validation:
134
- kind: nonempty
135
- minLength: 8
136
- sourcePriority:
137
- - machine-config
138
- - process-env
139
- relevanceRef: railwayManagedEnabled
140
- requiredWhenRef: railwayManagedEnabled
141
- TREESEED_RAILWAY_WORKSPACE:
142
- label: Railway workspace
143
- group: railway
144
- description: Railway workspace Treeseed should use when listing or creating projects during bootstrap and config reconciliation.
145
- howToGet: In Railway, use the workspace slug or name shown in the workspace switcher. Treeseed defaults this repository to knowledge-coop unless you override it here.
146
- sensitivity: plain
147
- targets:
148
- - railway-var
149
- scopes:
150
- - staging
151
- - prod
152
- storage: shared
153
- requirement: conditional
154
- purposes:
155
- - deploy
156
- - destroy
157
- - config
158
- validation:
159
- kind: nonempty
160
- sourcePriority:
161
- - machine-config
162
- - process-env
163
- defaultValueRef: railwayWorkspaceDefault
164
- relevanceRef: railwayManagedEnabled
165
- requiredWhenRef: railwayManagedEnabled
166
- CLOUDFLARE_ACCOUNT_ID:
167
- label: Cloudflare account ID
168
- group: cloudflare
169
- description: Identifies the Cloudflare account Treeseed should provision, deploy into, and use for Workers AI commit message generation.
170
- howToGet: In the Cloudflare dashboard, open Workers & Pages or Account Home and copy the account ID.
5
+ description: Comma-separated domains for the web-facing project surfaces. Treeseed uses this as a shared hint when it needs to complete environment-specific URL defaults.
6
+ howToGet: List one or more custom domains, separated by commas. Leave the default if the primary site URL already reflects the right domain.
171
7
  sensitivity: plain
172
8
  targets:
173
- - local-runtime
174
9
  - github-variable
175
- - config-file
10
+ - railway-var
11
+ - cloudflare-var
176
12
  scopes:
177
- - local
178
13
  - staging
179
14
  - prod
180
15
  storage: shared
181
- requirement: required
16
+ requirement: optional
182
17
  purposes:
183
- - save
184
18
  - deploy
185
- - destroy
186
19
  - config
187
20
  validation:
188
21
  kind: nonempty
189
22
  sourcePriority:
190
23
  - machine-config
191
24
  - process-env
192
- - treeseed.site.yaml
25
+ defaultValueRef: projectDomainsDefault
26
+ relevanceRef: webSurfaceEnabled
193
27
  TREESEED_FORM_TOKEN_SECRET:
194
28
  label: Forms token secret
195
29
  group: forms
30
+ cluster: forms-core
31
+ startupProfile: core
196
32
  description: Signs form-related tokens and protects Treeseed forms workflows in local and hosted runtimes.
197
33
  howToGet: Treeseed can generate a strong random secret for you. Reuse it across environments only if that matches your security model.
198
34
  sensitivity: secret
@@ -219,9 +55,11 @@ entries:
219
55
  - process-env
220
56
  defaultValueRef: generatedSecret
221
57
  localDefaultValueRef: generatedSecret
58
+ relevanceRef: formsEnabled
222
59
  TREESEED_PUBLIC_TURNSTILE_SITE_KEY:
223
60
  label: Turnstile site key
224
61
  group: forms
62
+ cluster: turnstile
225
63
  description: Public site key used by the browser to render the Turnstile challenge when forms protection is enabled.
226
64
  howToGet: Create a Turnstile widget in Cloudflare Turnstile and copy the site key.
227
65
  sensitivity: plain
@@ -247,6 +85,7 @@ entries:
247
85
  TREESEED_TURNSTILE_SECRET_KEY:
248
86
  label: Turnstile secret key
249
87
  group: forms
88
+ cluster: turnstile
250
89
  description: Server-side Turnstile secret used to verify challenge responses.
251
90
  howToGet: Create a Turnstile widget in Cloudflare Turnstile and copy the secret key.
252
91
  sensitivity: secret
@@ -272,6 +111,7 @@ entries:
272
111
  TREESEED_SMTP_HOST:
273
112
  label: SMTP host
274
113
  group: smtp
114
+ cluster: smtp
275
115
  description: SMTP host for Treeseed email delivery when SMTP-backed forms behavior is enabled.
276
116
  howToGet: Use the SMTP hostname from your email provider or local Mailpit instance.
277
117
  sensitivity: plain
@@ -302,6 +142,7 @@ entries:
302
142
  TREESEED_SMTP_PORT:
303
143
  label: SMTP port
304
144
  group: smtp
145
+ cluster: smtp
305
146
  description: Port used to connect to the SMTP server.
306
147
  howToGet: Use the port provided by your email service, commonly 587, 465, or the Mailpit local port.
307
148
  sensitivity: plain
@@ -332,6 +173,7 @@ entries:
332
173
  TREESEED_SMTP_USERNAME:
333
174
  label: SMTP username
334
175
  group: smtp
176
+ cluster: smtp
335
177
  description: SMTP identity used when authenticating to the mail provider.
336
178
  howToGet: Use the SMTP username or mailbox identity from your email provider.
337
179
  sensitivity: plain
@@ -361,6 +203,7 @@ entries:
361
203
  TREESEED_SMTP_PASSWORD:
362
204
  label: SMTP password
363
205
  group: smtp
206
+ cluster: smtp
364
207
  description: SMTP password or app password used for authenticated email sending.
365
208
  howToGet: Use the SMTP password or app-specific password from your email provider.
366
209
  sensitivity: secret
@@ -390,6 +233,7 @@ entries:
390
233
  TREESEED_SMTP_FROM:
391
234
  label: SMTP from address
392
235
  group: smtp
236
+ cluster: smtp
393
237
  description: Email address Treeseed uses as the sender for mail notifications.
394
238
  howToGet: Use a verified sender address from your SMTP provider.
395
239
  sensitivity: plain
@@ -414,11 +258,13 @@ entries:
414
258
  sourcePriority:
415
259
  - machine-config
416
260
  - process-env
261
+ localDefaultValueRef: contactEmailDefault
417
262
  relevanceRef: smtpEnabled
418
263
  requiredWhenRef: smtpNonLocal
419
264
  TREESEED_SMTP_REPLY_TO:
420
265
  label: SMTP reply-to address
421
266
  group: smtp
267
+ cluster: smtp
422
268
  description: Reply-to address attached to Treeseed-generated emails.
423
269
  howToGet: Use a monitored mailbox that should receive replies from end users.
424
270
  sensitivity: plain
@@ -443,5 +289,7 @@ entries:
443
289
  sourcePriority:
444
290
  - machine-config
445
291
  - process-env
292
+ localDefaultValueRef: contactEmailDefault
446
293
  relevanceRef: smtpEnabled
447
294
  requiredWhenRef: smtpNonLocal
295
+
package/dist/index.d.ts CHANGED
@@ -1,10 +1,6 @@
1
1
  export { buildTreeseedSiteLayers, resolveTreeseedPageEntrypoint, resolveTreeseedSiteResource, resolveTreeseedStyleEntrypoint, TREESEED_SITE_RESOURCE_KINDS, } from './site-resources';
2
2
  export { buildTreeseedPlatformLayers, resolveTreeseedPlatformResource, TREESEED_PLATFORM_RESOURCE_KINDS, } from './platform-resources';
3
3
  export { parseSiteConfig } from './utils/site-config-schema.js';
4
- export { createTreeseedApiApp } from './api/app';
5
- export { createRailwayTreeseedApiServer } from './api/railway';
6
- export { resolveApiConfig } from './api/config';
7
4
  export { executeKnowledgeHubProviderLaunch, validateKnowledgeHubProviderLaunchPrerequisites, } from './launch';
8
5
  export { createTreeseedIntegratedDevPlan, runTreeseedIntegratedDev, type TreeseedIntegratedDevCommand, type TreeseedIntegratedDevOptions, type TreeseedIntegratedDevPlan, type TreeseedIntegratedDevSurface, } from './dev';
9
6
  export { filterSiteRenderedModels, isSiteRenderedModel, siteModelRendered, } from './utils/site-models.ts';
10
- export type * from './api/types';
package/dist/index.js CHANGED
@@ -11,9 +11,6 @@ import {
11
11
  TREESEED_PLATFORM_RESOURCE_KINDS
12
12
  } from "./platform-resources.js";
13
13
  import { parseSiteConfig } from "./utils/site-config-schema.js";
14
- import { createTreeseedApiApp } from "./api/app.js";
15
- import { createRailwayTreeseedApiServer } from "./api/railway.js";
16
- import { resolveApiConfig } from "./api/config.js";
17
14
  import {
18
15
  executeKnowledgeHubProviderLaunch,
19
16
  validateKnowledgeHubProviderLaunchPrerequisites
@@ -32,14 +29,11 @@ export {
32
29
  TREESEED_SITE_RESOURCE_KINDS,
33
30
  buildTreeseedPlatformLayers,
34
31
  buildTreeseedSiteLayers,
35
- createRailwayTreeseedApiServer,
36
- createTreeseedApiApp,
37
32
  createTreeseedIntegratedDevPlan,
38
33
  executeKnowledgeHubProviderLaunch,
39
34
  filterSiteRenderedModels,
40
35
  isSiteRenderedModel,
41
36
  parseSiteConfig,
42
- resolveApiConfig,
43
37
  resolveTreeseedPageEntrypoint,
44
38
  resolveTreeseedPlatformResource,
45
39
  resolveTreeseedSiteResource,
@@ -232,9 +232,9 @@ function emitTypeDeclarations() {
232
232
  resolve(srcRoot, 'services/index.ts'),
233
233
  resolve(srcRoot, 'plugin-default.ts'),
234
234
  resolve(srcRoot, 'index.ts'),
235
- ...walkFiles(resolve(srcRoot, 'api')).filter((filePath) => filePath.endsWith('.ts') && !filePath.endsWith('.d.js')),
236
- ...walkFiles(resolve(srcRoot, 'agents')).filter((filePath) => filePath.endsWith('.ts') && !filePath.endsWith('.d.js')),
237
- ...walkFiles(resolve(srcRoot, 'services')).filter((filePath) => filePath.endsWith('.ts') && !filePath.endsWith('.d.js')),
235
+ ...(existsSync(resolve(srcRoot, 'api')) ? walkFiles(resolve(srcRoot, 'api')).filter((filePath) => filePath.endsWith('.ts') && !filePath.endsWith('.d.js')) : []),
236
+ ...(existsSync(resolve(srcRoot, 'agents')) ? walkFiles(resolve(srcRoot, 'agents')).filter((filePath) => filePath.endsWith('.ts') && !filePath.endsWith('.d.js')) : []),
237
+ ...(existsSync(resolve(srcRoot, 'services')) ? walkFiles(resolve(srcRoot, 'services')).filter((filePath) => filePath.endsWith('.ts') && !filePath.endsWith('.d.js')) : []),
238
238
  ].filter((filePath) => existsSync(filePath));
239
239
  if (sourceFiles.length === 0) {
240
240
  return;