@treeseed/sdk 0.8.7 → 0.8.9

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 (37) hide show
  1. package/dist/capacity.d.ts +120 -1
  2. package/dist/capacity.js +371 -2
  3. package/dist/control-plane-client.d.ts +1 -1
  4. package/dist/d1-store.d.ts +5 -5
  5. package/dist/d1-store.js +24 -24
  6. package/dist/db/d1.d.ts +102 -0
  7. package/dist/db/node-sqlite.d.ts +102 -0
  8. package/dist/db/schema.d.ts +204 -0
  9. package/dist/db/schema.js +9 -0
  10. package/dist/index.d.ts +5 -5
  11. package/dist/index.js +33 -23
  12. package/dist/market-client.d.ts +32 -0
  13. package/dist/market-client.js +48 -0
  14. package/dist/operations/services/config-runtime.js +57 -20
  15. package/dist/operations/services/d1-migration.js +10 -2
  16. package/dist/operations/services/github-automation.js +1 -1
  17. package/dist/operations/services/hosting-audit.d.ts +2 -1
  18. package/dist/operations/services/hosting-audit.js +18 -9
  19. package/dist/operations/services/hub-provider-launch.d.ts +3 -3
  20. package/dist/operations/services/hub-provider-launch.js +16 -16
  21. package/dist/operations/services/{knowledge-coop-packaging.d.ts → market-packaging.d.ts} +13 -13
  22. package/dist/operations/services/{knowledge-coop-packaging.js → market-packaging.js} +10 -10
  23. package/dist/operations/services/project-platform.d.ts +32 -0
  24. package/dist/operations/services/project-platform.js +91 -1
  25. package/dist/platform/contracts.d.ts +53 -31
  26. package/dist/platform/utils/site-config-schema.js +120 -52
  27. package/dist/{knowledge-coop.d.ts → project-workflow.d.ts} +15 -15
  28. package/dist/{knowledge-coop.js → project-workflow.js} +15 -15
  29. package/dist/reconcile/builtin-adapters.js +95 -11
  30. package/dist/scripts/tenant-d1-migrate-local.js +1 -0
  31. package/dist/sdk-types.d.ts +5 -4
  32. package/dist/sdk.d.ts +1 -1
  33. package/dist/stores/{knowledge-coop-store.d.ts → project-workflow-store.d.ts} +3 -3
  34. package/dist/stores/{knowledge-coop-store.js → project-workflow-store.js} +4 -4
  35. package/dist/workflow/operations.js +6 -6
  36. package/dist/workflow-state.js +2 -2
  37. package/package.json +1 -1
@@ -48,6 +48,8 @@ import {
48
48
  resolveRailwayWorkspaceContext,
49
49
  upsertRailwayVariables
50
50
  } from "../operations/services/railway-api.js";
51
+ import { loadTreeseedReconcileState } from "./state.js";
52
+ import { createTreeseedReconcileUnitId } from "./units.js";
51
53
  function toDeployTarget(target) {
52
54
  return target.kind === "persistent" ? createPersistentDeployTarget(target.scope) : createBranchPreviewDeployTarget(target.branchName);
53
55
  }
@@ -289,6 +291,28 @@ function storeCustomDomainState(input, provider, domain, value) {
289
291
  function getCustomDomainState(input, provider, domain) {
290
292
  return input.context.session.get(customDomainStateKey(provider, domain));
291
293
  }
294
+ function getPersistedCustomDomainState(input, provider, domain) {
295
+ if (!domain) {
296
+ return null;
297
+ }
298
+ if (provider === "railway") {
299
+ try {
300
+ const state = loadTreeseedReconcileState(input.context.tenantRoot, input.context.target);
301
+ const unitId = createTreeseedReconcileUnitId("custom-domain:api", domain);
302
+ const unit = state.units[unitId];
303
+ const reconciled = unit?.lastReconciledState;
304
+ if (reconciled && typeof reconciled === "object" && reconciled.domain === domain) {
305
+ return reconciled;
306
+ }
307
+ const observed = unit?.lastObservedState;
308
+ if (observed && typeof observed === "object" && observed.domain === domain) {
309
+ return observed;
310
+ }
311
+ } catch {
312
+ }
313
+ }
314
+ return null;
315
+ }
292
316
  function listCloudflareDnsRecords(env, zoneId, recordName) {
293
317
  const query = recordName ? `?name=${encodeURIComponent(recordName)}` : "";
294
318
  const payload = cloudflareApiRequest(`/zones/${encodeURIComponent(zoneId)}/dns_records${query}`, {
@@ -402,22 +426,70 @@ function normalizeRailwayDomainDnsRecord(value) {
402
426
  status: typeof record.status === "string" ? record.status.trim().toUpperCase() : ""
403
427
  };
404
428
  }
429
+ function firstRailwayDomainString(...values) {
430
+ for (const value of values) {
431
+ if (typeof value === "string" && value.trim()) {
432
+ return value.trim();
433
+ }
434
+ }
435
+ return null;
436
+ }
437
+ function firstRailwayDomainArray(...values) {
438
+ for (const value of values) {
439
+ if (Array.isArray(value)) {
440
+ return value;
441
+ }
442
+ }
443
+ return [];
444
+ }
405
445
  function normalizeRailwayDomainPayload(value) {
406
446
  if (!value || typeof value !== "object") {
407
447
  return null;
408
448
  }
409
449
  const record = value;
450
+ const status = record.status && typeof record.status === "object" ? record.status : {};
410
451
  const domain = typeof record.domain === "string" ? record.domain.trim() : typeof record.name === "string" ? record.name.trim() : "";
411
- const dnsRecordCandidates = Array.isArray(record.dnsRecords) ? record.dnsRecords : Array.isArray(record.status?.dnsRecords) ? record.status.dnsRecords : [];
452
+ const serviceDomain = firstRailwayDomainString(
453
+ record.serviceDomain,
454
+ record.target,
455
+ record.targetDomain,
456
+ record.cnameTarget,
457
+ record.cname,
458
+ record.dnsTarget,
459
+ status.serviceDomain,
460
+ status.target,
461
+ status.targetDomain,
462
+ status.cnameTarget,
463
+ status.cname,
464
+ status.dnsTarget
465
+ );
466
+ const dnsRecordCandidates = firstRailwayDomainArray(
467
+ record.dnsRecords,
468
+ record.requiredDnsRecords,
469
+ record.requiredRecords,
470
+ record.records,
471
+ record.dns,
472
+ status.dnsRecords,
473
+ status.requiredDnsRecords,
474
+ status.requiredRecords,
475
+ status.records,
476
+ status.dns
477
+ );
412
478
  const dnsRecords = dnsRecordCandidates.map((entry) => normalizeRailwayDomainDnsRecord(entry)).filter(Boolean);
479
+ const effectiveDnsRecords = dnsRecords.length > 0 || !domain || !serviceDomain || serviceDomain === domain ? dnsRecords : [{
480
+ type: "CNAME",
481
+ name: domain,
482
+ content: serviceDomain,
483
+ status: ""
484
+ }];
413
485
  return {
414
486
  id: typeof record.id === "string" ? record.id.trim() : null,
415
487
  domain,
416
- serviceDomain: typeof record.serviceDomain === "string" ? record.serviceDomain.trim() : typeof record.target === "string" ? record.target.trim() : null,
417
- certificateStatus: typeof record.status?.certificateStatus === "string" ? String(record.status.certificateStatus).trim().toUpperCase() : null,
418
- verificationDnsHost: typeof record.verificationDnsHost === "string" ? record.verificationDnsHost.trim() : typeof record.status?.verificationDnsHost === "string" ? String(record.status.verificationDnsHost).trim() : null,
419
- verificationToken: typeof record.verificationToken === "string" ? record.verificationToken.trim() : typeof record.status?.verificationToken === "string" ? String(record.status.verificationToken).trim() : null,
420
- dnsRecords
488
+ serviceDomain,
489
+ certificateStatus: typeof status.certificateStatus === "string" ? String(status.certificateStatus).trim().toUpperCase() : null,
490
+ verificationDnsHost: typeof record.verificationDnsHost === "string" ? record.verificationDnsHost.trim() : typeof status.verificationDnsHost === "string" ? String(status.verificationDnsHost).trim() : null,
491
+ verificationToken: typeof record.verificationToken === "string" ? record.verificationToken.trim() : typeof status.verificationToken === "string" ? String(status.verificationToken).trim() : null,
492
+ dnsRecords: effectiveDnsRecords
421
493
  };
422
494
  }
423
495
  async function ensureRailwayCustomDomain(input, service, domain, env, identifiers) {
@@ -1581,8 +1653,16 @@ function resolveDesiredDnsRecords(input) {
1581
1653
  if (!domain) {
1582
1654
  return [];
1583
1655
  }
1584
- const railwayState = getCustomDomainState(input, "railway", domain) ?? input.persistedState?.lastObservedState ?? input.persistedState?.lastReconciledState;
1656
+ const railwayState = getCustomDomainState(input, "railway", domain) ?? getPersistedCustomDomainState(input, "railway", domain) ?? input.persistedState?.lastObservedState ?? input.persistedState?.lastReconciledState;
1585
1657
  const records = Array.isArray(railwayState?.dnsRecords) ? railwayState.dnsRecords.map((entry) => normalizeRailwayDomainDnsRecord(entry)).filter(Boolean) : [];
1658
+ if (records.length === 0 && typeof railwayState?.serviceDomain === "string" && railwayState.serviceDomain.trim() && railwayState.serviceDomain.trim() !== domain) {
1659
+ records.push({
1660
+ type: "CNAME",
1661
+ name: domain,
1662
+ content: railwayState.serviceDomain.trim(),
1663
+ status: ""
1664
+ });
1665
+ }
1586
1666
  const desiredRecords = records.map((record) => ({
1587
1667
  ...record,
1588
1668
  proxied: false
@@ -1685,8 +1765,9 @@ function verifyCustomDomainUnit(input) {
1685
1765
  }
1686
1766
  case "custom-domain:api": {
1687
1767
  const domain = String(input.unit.spec.domain ?? "").trim();
1688
- const live = getCustomDomainState(input, "railway", domain) ?? input.persistedState?.lastObservedState ?? input.persistedState?.lastReconciledState ?? null;
1768
+ const live = getCustomDomainState(input, "railway", domain) ?? getPersistedCustomDomainState(input, "railway", domain) ?? input.persistedState?.lastObservedState ?? input.persistedState?.lastReconciledState ?? null;
1689
1769
  const dnsRecords = Array.isArray(live?.dnsRecords) ? live.dnsRecords : [];
1770
+ const hasDnsRequirements = dnsRecords.length > 0 || typeof live?.serviceDomain === "string" && live.serviceDomain.trim().length > 0 || typeof live?.verificationDnsHost === "string" && live.verificationDnsHost.trim().length > 0 && typeof live?.verificationToken === "string" && live.verificationToken.trim().length > 0;
1690
1771
  return summarizeVerification(input.unit.unitId, [
1691
1772
  verificationCheck("custom-domain.exists", "Railway custom domain attachment exists", "cli", {
1692
1773
  exists: Boolean(live?.domain),
@@ -1695,10 +1776,13 @@ function verifyCustomDomainUnit(input) {
1695
1776
  issues: live?.domain ? [] : [`Railway custom domain ${domain || "(unset)"} is missing.`]
1696
1777
  }),
1697
1778
  verificationCheck("custom-domain.dns-requirements", "Railway custom domain exposes DNS requirements", "api", {
1698
- exists: dnsRecords.length > 0,
1779
+ exists: hasDnsRequirements,
1699
1780
  expected: true,
1700
- observed: dnsRecords.length,
1701
- issues: dnsRecords.length > 0 ? [] : [`Railway custom domain ${domain || "(unset)"} did not expose DNS requirements.`]
1781
+ observed: dnsRecords.length > 0 ? dnsRecords.length : {
1782
+ serviceDomain: typeof live?.serviceDomain === "string" ? live.serviceDomain : null,
1783
+ verificationDnsHost: typeof live?.verificationDnsHost === "string" ? live.verificationDnsHost : null
1784
+ },
1785
+ issues: hasDnsRequirements ? [] : [`Railway custom domain ${domain || "(unset)"} did not expose DNS requirements.`]
1702
1786
  })
1703
1787
  ]);
1704
1788
  }
@@ -12,3 +12,4 @@ runLocalD1Migrations({
12
12
  wranglerConfig,
13
13
  migrationsRoot,
14
14
  });
15
+ process.exit(0);
@@ -394,21 +394,21 @@ export interface TaskCreditLedgerEntry {
394
394
  projectId: string;
395
395
  workDayId: string;
396
396
  taskId: string | null;
397
- phase: 'seed' | 'settle' | 'refund' | 'grant' | 'reserve' | 'consume' | 'release' | 'adjustment';
397
+ phase: 'seed' | 'settle' | 'refund' | 'grant' | 'reserve' | 'consume' | 'release' | 'adjustment' | 'grant_created' | 'reservation_created' | 'reservation_released' | 'task_started' | 'task_completed_estimate_settlement' | 'task_completed_actual_settlement' | 'task_failed_refund' | 'manual_adjustment' | 'monthly_rollover' | 'overrun_hold';
398
398
  credits: number;
399
399
  metadata?: Record<string, unknown>;
400
400
  createdAt: string;
401
401
  }
402
402
  export type CapacityProviderKind = 'treeseed_managed' | 'team_owned' | 'external' | 'hybrid';
403
- export type CapacityProviderStatus = 'pending' | 'active' | 'paused' | 'configuration_required' | 'disabled';
403
+ export type CapacityProviderStatus = 'pending' | 'credential_required' | 'registering' | 'active' | 'degraded' | 'draining' | 'paused' | 'configuration_required' | 'disabled' | 'failed';
404
404
  export type CapacityProviderBillingScope = 'treeseed' | 'team' | 'external';
405
405
  export type CapacityBusinessModel = 'subscription_quota' | 'token_metered' | 'hybrid_usage_based' | 'infrastructure_runtime' | 'custom';
406
406
  export type CapacityLaneUnit = 'treeseed_credit' | 'quota_minute' | 'token_usd' | 'github_ai_credit' | 'worker_second' | 'request' | 'custom';
407
407
  export type CapacityScarcityLevel = 'low' | 'medium' | 'high';
408
408
  export type CapacityGrantScope = 'team' | 'project' | 'workday' | 'overflow_pool';
409
409
  export type CapacityGrantState = 'active' | 'paused' | 'expired' | 'disabled';
410
- export type CapacityOverflowPolicy = 'hard_grant' | 'soft_grant' | 'weighted_fair_share' | 'approval_required';
411
- export type CapacityReservationState = 'reserved' | 'consumed' | 'released' | 'expired' | 'cancelled';
410
+ export type CapacityOverflowPolicy = 'deny' | 'hard_grant' | 'soft_grant' | 'weighted_fair_share' | 'approval_required' | 'fallback_lane' | 'platform_subsidy';
411
+ export type CapacityReservationState = 'reserved' | 'consuming' | 'consumed' | 'released' | 'expired' | 'cancelled' | 'failed' | 'overran_pending_approval';
412
412
  export type CapacityEstimatePhase = 'intent' | 'discovery' | 'plan' | 'execution' | 'actual';
413
413
  export type CapacityEstimateConfidence = 'low' | 'medium' | 'high';
414
414
  export type CapacityApprovalState = 'pending' | 'approved' | 'rejected' | 'expired' | 'superseded';
@@ -1667,6 +1667,7 @@ export interface RecordCapacityUsageRequest {
1667
1667
  usd?: number | null;
1668
1668
  source?: string;
1669
1669
  metadata?: Record<string, unknown> | null;
1670
+ usageActual?: Record<string, unknown> | null;
1670
1671
  }
1671
1672
  export interface CreateCapacityRoutingDecisionRequest {
1672
1673
  id?: string;
package/dist/sdk.d.ts CHANGED
@@ -2,7 +2,7 @@ import type { AgentPermissionConfig, AgentRuntimeSpec } from './types/agents.ts'
2
2
  import { ContentStore } from './content-store.ts';
3
3
  import { type AgentDatabase } from './d1-store.ts';
4
4
  import { type LoadedTreeseedPluginEntry } from './platform/plugins.ts';
5
- import type { ReleaseDetail, ReleaseSummary, SharePackageStatus, WorkstreamDetail, WorkstreamEvent, WorkstreamSummary } from './knowledge-coop.ts';
5
+ import type { ReleaseDetail, ReleaseSummary, SharePackageStatus, WorkstreamDetail, WorkstreamEvent, WorkstreamSummary } from './project-workflow.ts';
6
6
  import type { SdkAckMessageRequest, SdkClaimMessageRequest, SdkClaimTaskRequest, SdkCloseWorkDayRequest, SdkCompleteTaskRequest, SdkCreateReportRequest, SdkCreateMessageRequest, SdkCreatePrioritySnapshotRequest, SdkCreateTaskRequest, SdkCursorRequest, SdkFailTaskRequest, SdkFollowRequest, SdkGetRequest, SdkGetCursorRequest, SdkJsonEnvelope, SdkLeaseReleaseRequest, SdkManagerContextPayload, SdkMutationRequest, SdkGraphQueryOptions, SdkGraphQueryRequest, SdkGraphRefreshRequest, SdkGraphSearchOptions, SdkContextPackRequest, SdkGraphDslParseResult, SdkPickRequest, SdkPriorityOverrideRequest, SdkClaimWorkdayManagerLeaseRequest, SdkCreateWorkdayRequest, SdkRecordRepositoryClaimRequest, SdkRecordRunnerScaleDecisionRequest, SdkRecordWorkerRunnerRequest, SdkRecordRunRequest, SdkRecordScaleDecisionRequest, SdkRecordTaskCreditsRequest, SdkReleaseWorkdayManagerLeaseRequest, SdkSearchRequest, SdkStartWorkDayRequest, SdkTaskProgressRequest, SdkTaskSearchRequest, SdkUpsertWorkPolicyRequest, SdkUpdateWorkDayGraphRequest, SdkUpdateRequest, SdkModelDefinition, SdkModelRegistry, SdkGraphRankingProvider, SdkDispatchConfig, SdkDispatchRequest, SdkDispatchResult, PrioritySnapshot, RepositoryClaim, RunnerScaleDecision, ScaleDecision, TaskCreditLedgerEntry, WorkdayManagerLease, WorkdayPolicy, WorkdayRequest, WorkerRunner } from './sdk-types.ts';
7
7
  export interface AgentSdkOptions {
8
8
  repoRoot?: string;
@@ -1,6 +1,6 @@
1
- import type { ReleaseDetail, ReleaseSummary, SharePackageStatus, WorkstreamDetail, WorkstreamEvent, WorkstreamState, WorkstreamSummary, LinkedProjectRecordRef } from '../knowledge-coop.ts';
1
+ import type { ReleaseDetail, ReleaseSummary, SharePackageStatus, WorkstreamDetail, WorkstreamEvent, WorkstreamState, WorkstreamSummary, LinkedProjectRecordRef } from '../project-workflow.ts';
2
2
  import { SqliteStoreBase } from './helpers.ts';
3
- export declare class MemoryKnowledgeCoopStore {
3
+ export declare class MemoryProjectWorkflowStore {
4
4
  private readonly workstreams;
5
5
  private readonly workstreamEvents;
6
6
  private readonly releases;
@@ -19,7 +19,7 @@ export declare class MemoryKnowledgeCoopStore {
19
19
  getSharePackage(packageId: string): SharePackageStatus | null;
20
20
  upsertSharePackage(input: Partial<SharePackageStatus> & Pick<SharePackageStatus, 'projectId' | 'kind' | 'title'>): SharePackageStatus;
21
21
  }
22
- export declare class SqliteKnowledgeCoopStore extends SqliteStoreBase {
22
+ export declare class SqliteProjectWorkflowStore extends SqliteStoreBase {
23
23
  private initialized;
24
24
  private ensureSchema;
25
25
  listWorkstreams(projectId: string): Promise<WorkstreamSummary[]>;
@@ -85,7 +85,7 @@ function sharePackageFromRow(row) {
85
85
  metadata: parseJson(row.metadata_json, {})
86
86
  };
87
87
  }
88
- class MemoryKnowledgeCoopStore {
88
+ class MemoryProjectWorkflowStore {
89
89
  workstreams = /* @__PURE__ */ new Map();
90
90
  workstreamEvents = /* @__PURE__ */ new Map();
91
91
  releases = /* @__PURE__ */ new Map();
@@ -211,7 +211,7 @@ class MemoryKnowledgeCoopStore {
211
211
  return next;
212
212
  }
213
213
  }
214
- class SqliteKnowledgeCoopStore extends SqliteStoreBase {
214
+ class SqliteProjectWorkflowStore extends SqliteStoreBase {
215
215
  initialized = false;
216
216
  async ensureSchema() {
217
217
  if (this.initialized) return;
@@ -477,6 +477,6 @@ class SqliteKnowledgeCoopStore extends SqliteStoreBase {
477
477
  }
478
478
  }
479
479
  export {
480
- MemoryKnowledgeCoopStore,
481
- SqliteKnowledgeCoopStore
480
+ MemoryProjectWorkflowStore,
481
+ SqliteProjectWorkflowStore
482
482
  };
@@ -973,14 +973,14 @@ async function connectTreeseedMarketProject(helpers, tenantRoot, input, context)
973
973
  "Treeseed config --connect-market requires a market base URL. Pass --market-base-url or configure an authenticated remote host first."
974
974
  );
975
975
  }
976
- const hostId = normalizeOptionalString(marketSettings.hostId) ?? "knowledge-coop";
976
+ const hostId = normalizeOptionalString(marketSettings.hostId) ?? "treeseed-market";
977
977
  const activeRemoteSession = resolveTreeseedRemoteSession(tenantRoot, hostId) ?? resolveTreeseedRemoteSession(tenantRoot, remoteSettings.activeHostId) ?? resolveTreeseedRemoteSession(tenantRoot, "official");
978
978
  const accessToken = normalizeOptionalString(input.marketAccessToken) ?? normalizeOptionalString(activeRemoteSession?.accessToken);
979
979
  if (!accessToken) {
980
980
  workflowError(
981
981
  "config",
982
982
  "validation_failed",
983
- "Treeseed config --connect-market requires a market access token. Authenticate to the Knowledge Coop control-plane first or pass --market-access-token."
983
+ "Treeseed config --connect-market requires a market access token. Authenticate to the TreeSeed control-plane first or pass --market-access-token."
984
984
  );
985
985
  }
986
986
  const projectId = normalizeOptionalString(input.marketProjectId) ?? normalizeOptionalString(marketSettings.projectId);
@@ -1018,7 +1018,7 @@ async function connectTreeseedMarketProject(helpers, tenantRoot, input, context)
1018
1018
  const hosts = Array.isArray(remoteSettings.hosts) ? [...remoteSettings.hosts] : [];
1019
1019
  const updatedHost = {
1020
1020
  id: hostId,
1021
- label: "Knowledge Coop",
1021
+ label: "TreeSeed",
1022
1022
  baseUrl,
1023
1023
  official: false
1024
1024
  };
@@ -1051,7 +1051,7 @@ async function connectTreeseedMarketProject(helpers, tenantRoot, input, context)
1051
1051
  expiresAt: "",
1052
1052
  principal: {
1053
1053
  id: `runner:${projectId}`,
1054
- displayName: "Knowledge Coop Project Runner",
1054
+ displayName: "TreeSeed Project Runner",
1055
1055
  scopes: [],
1056
1056
  roles: ["project_runner"],
1057
1057
  permissions: [],
@@ -1104,10 +1104,10 @@ async function connectTreeseedMarketProject(helpers, tenantRoot, input, context)
1104
1104
  runnerTokenIssued: Boolean(connectionResult.runnerToken)
1105
1105
  },
1106
1106
  {
1107
- summary: "Knowledge Coop project pairing completed.",
1107
+ summary: "TreeSeed project pairing completed.",
1108
1108
  nextSteps: createNextSteps([
1109
1109
  { operation: "status", reason: "Confirm the new market connection, runner health, and current workstream posture." },
1110
- { operation: "tasks", reason: "Inspect the branch-backed workstreams that will now sync into the Knowledge Coop UI." }
1110
+ { operation: "tasks", reason: "Inspect the branch-backed workstreams that will now sync into the TreeSeed UI." }
1111
1111
  ])
1112
1112
  }
1113
1113
  );
@@ -703,8 +703,8 @@ function resolveTreeseedWorkflowState(cwd, options = {}) {
703
703
  state.marketConnection.verificationPosture = state.readiness.local.ready ? "ready" : state.files.machineConfig ? "blocked" : "pending";
704
704
  const registrationRequired = state.marketConnection.runtimeRegistration === "required";
705
705
  state.marketConnection.approvalBlockers = [
706
- ...registrationRequired && !state.marketConnection.configured ? ["Knowledge Coop runtime attachment is not configured."] : [],
707
- ...registrationRequired && !state.marketConnection.runtimeReady ? ["Knowledge Coop runtime credential is missing or not ready."] : []
706
+ ...registrationRequired && !state.marketConnection.configured ? ["TreeSeed runtime attachment is not configured."] : [],
707
+ ...registrationRequired && !state.marketConnection.runtimeReady ? ["TreeSeed runtime credential is missing or not ready."] : []
708
708
  ];
709
709
  state.recommendations = recommendTreeseedNextSteps(state);
710
710
  return state;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treeseed/sdk",
3
- "version": "0.8.7",
3
+ "version": "0.8.9",
4
4
  "description": "Shared Treeseed SDK for content-backed and D1-backed object models.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {