@telorun/kernel 0.84.0 → 0.86.0

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 (64) hide show
  1. package/dist/bundle/module-artifact.d.ts +1 -1
  2. package/dist/bundle/module-artifact.d.ts.map +1 -1
  3. package/dist/bundle/module-artifact.js +3 -3
  4. package/dist/bundle/module-artifact.js.map +1 -1
  5. package/dist/controller-loaders/bundle-loader.d.ts +5 -5
  6. package/dist/controller-loaders/bundle-loader.js +7 -7
  7. package/dist/controller-loaders/bundle-loader.js.map +1 -1
  8. package/dist/evaluation-context.d.ts +158 -25
  9. package/dist/evaluation-context.d.ts.map +1 -1
  10. package/dist/evaluation-context.js +234 -44
  11. package/dist/evaluation-context.js.map +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/kernel.d.ts +60 -5
  17. package/dist/kernel.d.ts.map +1 -1
  18. package/dist/kernel.js +256 -9
  19. package/dist/kernel.js.map +1 -1
  20. package/dist/manifest-sources/local-manifest-cache-source.d.ts +6 -6
  21. package/dist/manifest-sources/local-manifest-cache-source.d.ts.map +1 -1
  22. package/dist/manifest-sources/local-manifest-cache-source.js +11 -12
  23. package/dist/manifest-sources/local-manifest-cache-source.js.map +1 -1
  24. package/dist/module-context.d.ts +31 -1
  25. package/dist/module-context.d.ts.map +1 -1
  26. package/dist/module-context.js +41 -1
  27. package/dist/module-context.js.map +1 -1
  28. package/dist/reconcile.d.ts +42 -0
  29. package/dist/reconcile.d.ts.map +1 -0
  30. package/dist/reconcile.js +58 -0
  31. package/dist/reconcile.js.map +1 -0
  32. package/dist/resource-edges.d.ts +58 -0
  33. package/dist/resource-edges.d.ts.map +1 -0
  34. package/dist/resource-edges.js +110 -0
  35. package/dist/resource-edges.js.map +1 -0
  36. package/dist/runtime-seam.d.ts.map +1 -1
  37. package/dist/runtime-seam.js +1 -2
  38. package/dist/runtime-seam.js.map +1 -1
  39. package/dist/transports/http-transport.d.ts +37 -0
  40. package/dist/transports/http-transport.d.ts.map +1 -0
  41. package/dist/transports/http-transport.js +168 -0
  42. package/dist/transports/http-transport.js.map +1 -0
  43. package/dist/transports/transport-registry.d.ts +13 -14
  44. package/dist/transports/transport-registry.d.ts.map +1 -1
  45. package/dist/transports/transport-registry.js +17 -24
  46. package/dist/transports/transport-registry.js.map +1 -1
  47. package/package.json +3 -3
  48. package/src/bundle/module-artifact.ts +2 -3
  49. package/src/controller-loaders/bundle-loader.ts +7 -7
  50. package/src/evaluation-context.ts +257 -53
  51. package/src/index.ts +1 -1
  52. package/src/kernel.ts +314 -12
  53. package/src/manifest-sources/local-manifest-cache-source.ts +9 -16
  54. package/src/module-context.ts +41 -1
  55. package/src/reconcile.ts +83 -0
  56. package/src/resource-edges.ts +114 -0
  57. package/src/runtime-seam.ts +1 -2
  58. package/src/transports/http-transport.ts +209 -0
  59. package/src/transports/transport-registry.ts +17 -24
  60. package/dist/transports/registry-transport.d.ts +0 -41
  61. package/dist/transports/registry-transport.d.ts.map +0 -1
  62. package/dist/transports/registry-transport.js +0 -282
  63. package/dist/transports/registry-transport.js.map +0 -1
  64. package/src/transports/registry-transport.ts +0 -339
@@ -28,8 +28,9 @@ import {
28
28
  type Tracer,
29
29
  } from "@telorun/sdk";
30
30
  import { RuntimeError } from "@telorun/sdk";
31
- import { evalPathCovers } from "@telorun/analyzer";
31
+ import { celResourceReads, evalPathCovers } from "@telorun/analyzer";
32
32
  import { effectOwnerOf, executeReturnedChain } from "./effect-scope.js";
33
+ import { impactClosure, reverseTopologicalOrder } from "./resource-edges.js";
33
34
  import {
34
35
  REDACTED,
35
36
  redactSensitive,
@@ -636,10 +637,32 @@ export class EvaluationContext implements IEvaluationContext {
636
637
 
637
638
  /** Per-resource dependency names, captured at create() time — BEFORE Phase-5
638
639
  * injection swaps refs for live instances, so the walk sees plain objects and
639
- * cannot wander into a controller's (possibly cyclic) object graph. Read only
640
- * when init fails, to attribute each failure to its cause. */
640
+ * cannot wander into a controller's (possibly cyclic) object graph.
641
+ *
642
+ * Read twice, and RETAINED for the context's lifetime because of the second
643
+ * reader: to attribute an init failure to its cause, and to order teardown
644
+ * (`teardownOrder`) so a consumer's inverses run while the resources it holds
645
+ * are still alive. */
641
646
  private readonly resourceDependencies = new Map<string, string[]>();
642
647
 
648
+ /**
649
+ * Names resolved by NAME during initialization, rather than through a
650
+ * declared reference slot — so a resource somebody may be holding, with no
651
+ * edge recording who.
652
+ *
653
+ * The set is of TARGETS, not of pairs: the door that records
654
+ * (`ModuleContext.getInstance`) is reached as `ctx.moduleContext`, which every
655
+ * resource of the module shares, so there is no caller to attribute the read
656
+ * to. That is enough for the one decision that depends on it — see
657
+ * {@link impactedBy}.
658
+ */
659
+ protected readonly opaquelyRead = new Set<string>();
660
+
661
+ /** Record a by-name resolution. Called by the recording door only. */
662
+ protected recordOpaqueRead(name: string): void {
663
+ this.opaquelyRead.add(name);
664
+ }
665
+
643
666
  /**
644
667
  * Optional hook called between create() and init() for each resource.
645
668
  * Set by the kernel to inject live instances into reference fields.
@@ -876,6 +899,32 @@ export class EvaluationContext implements IEvaluationContext {
876
899
  this.declaredManifests.set(name, resource);
877
900
  }
878
901
 
902
+ /**
903
+ * Forget a declaration entirely — the inverse of {@link registerManifest}.
904
+ *
905
+ * Reconciliation's other half: {@link unwindResources} disposes the INSTANCE,
906
+ * and this clears everything keyed by the name so the same name can be
907
+ * declared again. Without it `registerManifest` refuses with
908
+ * `ERR_DUPLICATE_RESOURCE`, which is the right answer for a manifest
909
+ * declaring one name twice and the wrong one for a second load of the same
910
+ * manifest.
911
+ *
912
+ * Every per-name record goes, not just the declaration: a resource left in
913
+ * `withheldResources` would be skipped by the init loop for the life of the
914
+ * kernel, and a stale `createdInstances` entry would have the loop initialize
915
+ * the object built from the PREVIOUS declaration.
916
+ */
917
+ deregisterManifest(name: string): void {
918
+ this.declaredManifests.delete(name);
919
+ this.resourceDependencies.delete(name);
920
+ this.createdInstances.delete(name);
921
+ this.withheldResources.delete(name);
922
+ this.recreatedResources.delete(name);
923
+ this.opaquelyRead.delete(name);
924
+ const pending = this.pendingResources.findIndex((r) => r.metadata?.name === name);
925
+ if (pending >= 0) this.pendingResources.splice(pending, 1);
926
+ }
927
+
879
928
  /**
880
929
  * The manifest a name was DECLARED with, resolved scope-local first and then
881
930
  * up the enclosing chain — the order `getInstance` and the CEL `resources`
@@ -1048,7 +1097,12 @@ export class EvaluationContext implements IEvaluationContext {
1048
1097
  if (!this.recreatedResources.has(name)) progress = true;
1049
1098
  const createdRes = created.resource;
1050
1099
  const refs = collectResourceRefs(createdRes);
1051
- this.resourceDependencies.set(name, localDependencyNames(refs));
1100
+ // `resource` rather than `createdRes`: the registered declaration
1101
+ // still holds its expressions, while the created copy holds the
1102
+ // values they were expanded to.
1103
+ this.resourceDependencies.set(name, [
1104
+ ...new Set([...localDependencyNames(refs), ...celResourceReads(resource)]),
1105
+ ]);
1052
1106
  const payload: Record<string, unknown> = {
1053
1107
  resource: {
1054
1108
  kind: createdRes.kind,
@@ -1164,9 +1218,6 @@ export class EvaluationContext implements IEvaluationContext {
1164
1218
  await this.publishSnapshot(name);
1165
1219
  this.resourceInstances.set(name, { resource, instance });
1166
1220
  this.createdInstances.delete(name);
1167
- // Read only on failure, and this one succeeded — drop it rather than
1168
- // holding a dep-name array per resource for the context's lifetime.
1169
- this.resourceDependencies.delete(name);
1170
1221
  errors.delete(name);
1171
1222
  progress = true;
1172
1223
  await this.emit(`${resource.kind}.${resource.metadata.name}.Initialized`, {
@@ -1365,16 +1416,33 @@ export class EvaluationContext implements IEvaluationContext {
1365
1416
  }
1366
1417
 
1367
1418
  /**
1368
- * Cascade teardown depth-first through the tree:
1369
- * 1. Tear down child contexts in reverse registration order.
1370
- * 2. Tear down own resource instances in reverse registration order,
1371
- * emitting a Teardown event for each via the injected emit callback.
1419
+ * Cascade teardown through the tree:
1420
+ * 1. Tear down own resource instances in {@link teardownOrder}, emitting a
1421
+ * Teardown event for each via the injected emit callback.
1422
+ * 2. Sweep any child context still standing, in {@link childTeardownOrder}.
1423
+ *
1424
+ * **Own resources go FIRST, and the child sweep is a backstop.** A child
1425
+ * context that belongs to a resource is torn down by that resource's own
1426
+ * inverse — an import's `init()` returns `child.teardownResources()`, and so
1427
+ * does a template's — so it already unwinds at its owner's position in step 1,
1428
+ * which is the position the edges put it at. Running a child cascade ahead of
1429
+ * step 1 tore every imported library down before any resource of THIS context,
1430
+ * so an app resource holding `!ref Alias.name` unwound after its provider was
1431
+ * already gone, and the owner's inverse then found nothing left to do.
1432
+ *
1433
+ * Sweeping afterwards rather than not at all is what still reclaims a context
1434
+ * no inverse claims: a `lifecycle: shared` library, which is spawned under the
1435
+ * root and deliberately gives no importer a claim on it, and an import whose
1436
+ * `init()` never ran to register one. `teardownResources` is idempotent, so a
1437
+ * context already taken down in step 1 costs the sweep nothing.
1372
1438
  */
1373
1439
  // eslint-disable-next-line @typescript-eslint/member-ordering
1374
1440
  async teardownResources(): Promise<void> {
1375
1441
  this.state = "Draining";
1376
- const failures: Array<{ resource: string; error: unknown }> = [];
1442
+ const failures = await this.unwindEach(this.teardownOrder());
1377
1443
 
1444
+ // The backstop: whatever no resource's inverse claimed. Everything an import
1445
+ // or a template owns is already down, so this is a no-op for it.
1378
1446
  for (const child of this.childTeardownOrder()) {
1379
1447
  try {
1380
1448
  await child.teardownResources();
@@ -1383,7 +1451,59 @@ export class EvaluationContext implements IEvaluationContext {
1383
1451
  }
1384
1452
  }
1385
1453
 
1386
- for (const [key, { resource, instance }] of this.teardownOrder()) {
1454
+ this.state = "Teardown";
1455
+ this.raiseTeardownFailures(failures);
1456
+ }
1457
+
1458
+ /**
1459
+ * Unwind SOME of this context's resources and leave the rest running.
1460
+ *
1461
+ * The reconciliation half of teardown: a host that has decided which
1462
+ * declarations moved unwinds exactly {@link impactedBy}'s answer, then
1463
+ * re-registers and re-initializes. Ordering is {@link teardownOrder}
1464
+ * restricted to the selection, so a consumer still unwinds before what it
1465
+ * holds — and the selection being closed under holders is what makes that
1466
+ * true of the resources left standing as well, since none of them holds
1467
+ * anything in it.
1468
+ *
1469
+ * The context keeps its state: it is neither draining nor torn down, and no
1470
+ * child context is swept, because a child belonging to an unwound import goes
1471
+ * down with that import's own inverse exactly as it does at teardown.
1472
+ *
1473
+ * A name with no live instance is skipped rather than reported — a resource
1474
+ * that failed to initialize has nothing to unwind, and a host asking for it is
1475
+ * asking about a declaration, not about an instance.
1476
+ */
1477
+ // eslint-disable-next-line @typescript-eslint/member-ordering
1478
+ async unwindResources(names: ReadonlySet<string>): Promise<void> {
1479
+ const selected = this.teardownOrder().filter(([, entry]) =>
1480
+ names.has(entry.resource.metadata.name as string),
1481
+ );
1482
+ this.raiseTeardownFailures(await this.unwindEach(selected));
1483
+ }
1484
+
1485
+ private raiseTeardownFailures(failures: Array<{ resource: string; error: unknown }>): void {
1486
+ if (failures.length === 0) return;
1487
+ throw new RuntimeError(
1488
+ "ERR_TEARDOWN_FAILED",
1489
+ `${failures.length} resource(s) failed during teardown`,
1490
+ failures.map(({ resource, error }) => ({
1491
+ severity: "error" as const,
1492
+ message: error instanceof Error ? error.message : String(error),
1493
+ resource,
1494
+ })),
1495
+ );
1496
+ }
1497
+
1498
+ /** Unwind the given entries in the order supplied, aggregating what refused.
1499
+ * Failures are returned rather than thrown so one refusing inverse cannot
1500
+ * strand the resources after it — the log sinks above all. */
1501
+ private async unwindEach(
1502
+ entries: Array<readonly [string, { resource: any; instance: any }]>,
1503
+ ): Promise<Array<{ resource: string; error: unknown }>> {
1504
+ const failures: Array<{ resource: string; error: unknown }> = [];
1505
+
1506
+ for (const [key, { resource, instance }] of entries) {
1387
1507
  const label = `${resource.kind}.${resource.metadata.name}`;
1388
1508
  // A reading belongs to the run that produced it. The WeakMap would drop it
1389
1509
  // with the instance anyway; clearing here also covers an instance something
@@ -1436,34 +1556,29 @@ export class EvaluationContext implements IEvaluationContext {
1436
1556
  failures.push({ resource: `${label} (Teardown event)`, error: err });
1437
1557
  }
1438
1558
  this.resourceInstances.delete(key);
1559
+ // A torn-down resource must stop being readable: a CEL expansion that still
1560
+ // found its reading would bake a value nothing is serving any more.
1561
+ this.clearPublishedReading(resource.metadata.name as string);
1439
1562
  }
1440
1563
 
1441
- this.state = "Teardown";
1442
-
1443
- if (failures.length > 0) {
1444
- throw new RuntimeError(
1445
- "ERR_TEARDOWN_FAILED",
1446
- `${failures.length} resource(s) failed during teardown`,
1447
- failures.map(({ resource, error }) => ({
1448
- severity: "error" as const,
1449
- message: error instanceof Error ? error.message : String(error),
1450
- resource,
1451
- })),
1452
- );
1453
- }
1564
+ return failures;
1454
1565
  }
1455
1566
 
1456
1567
  /**
1457
- * Child contexts in teardown order: ascending `teardownPriority` (default 0),
1458
- * with the base reverse-registration order preserved within each tier.
1568
+ * Child contexts for the backstop sweep: ascending `teardownPriority`
1569
+ * (default 0), reverse registration within a tier.
1459
1570
  *
1460
- * The same rule `teardownOrder` applies to resource instances, and for the
1461
- * same reason: reverse registration is reverse init order in the happy path,
1462
- * but a node that must reliably outlive the rest has to say so rather than
1463
- * depend on when it happened to be created. A `lifecycle: shared` library is
1464
- * registered when the FIRST import reaches it which, for an import declared
1465
- * inside another library, is after that library's own context so reverse
1466
- * registration would tear the singleton down while a borrower still holds it.
1571
+ * What reaches the sweep is a context no resource's inverse claimed, which in
1572
+ * practice is the `lifecycle: shared` libraries. Those are spawned under the
1573
+ * ROOT and give no importer a claim, so nothing but this orders them and
1574
+ * reverse registration alone does not, since a singleton is registered when
1575
+ * the FIRST import reaches it, which for an import declared inside another
1576
+ * library is after that library's own context. `TEARDOWN_LAST` on the context
1577
+ * is what keeps a singleton alive until the libraries borrowing it have gone.
1578
+ *
1579
+ * Its protection now stops at library-against-library. Every resource of the
1580
+ * context that owns the sweep has already unwound by the time it runs, which
1581
+ * is the ordering the sweep used to invert.
1467
1582
  */
1468
1583
  private childTeardownOrder(): IEvaluationContext[] {
1469
1584
  return [...this.children]
@@ -1476,31 +1591,120 @@ export class EvaluationContext implements IEvaluationContext {
1476
1591
  }
1477
1592
 
1478
1593
  /**
1479
- * Resource instances in teardown order: ascending `teardownPriority`, with the
1480
- * base reverse-insertion order preserved within each priority tier.
1594
+ * Resource instances in teardown order: ascending `teardownPriority` as a hard
1595
+ * tier, and within a tier a consumer before every resource it holds
1596
+ * ({@link reverseTopologicalOrder} over the create-time edges), with reverse
1597
+ * insertion as the tiebreak.
1481
1598
  *
1482
- * The base order is reverse *insertion*, which is reverse init order in the
1483
- * happy path but the init loop is a multi-pass retry, so a resource that
1484
- * failed its first pass lands later in the map than its topological rank
1485
- * implies. That makes the dependency graph an unreliable way to say "last".
1486
- * A resource that must reliably outlive the rest declares it directly via
1487
- * `teardownPriority` (log sinks set `TEARDOWN_LAST`), so the generic teardown
1488
- * path orders by a declared number rather than sniffing any one subsystem's
1489
- * instance shape.
1599
+ * `teardownPriority` is a TIER rather than another edge because it is the
1600
+ * author's statement about an edge nothing captured: a log sink is reached
1601
+ * through `ctx.log` rather than through a ref slot, so no walk of the manifest
1602
+ * can find the resources that will log on the way down. Letting topology
1603
+ * reorder across tiers would let one discovered edge override a declaration
1604
+ * made precisely because the edges are not all discoverable.
1490
1605
  */
1491
- private teardownOrder(): Array<[string, { resource: any; instance: any }]> {
1606
+ private teardownOrder(): Array<readonly [string, { resource: any; instance: any }]> {
1492
1607
  // A borrowed instance is torn down by the scope that declared it, never
1493
1608
  // here — see `borrowedResources`.
1494
1609
  const entries = [...this.resourceInstances.entries()]
1495
1610
  .filter(([name]) => !this.borrowedResources.has(name))
1496
1611
  .reverse();
1497
- // Stable sort by priority (default 0); Array.prototype.sort is stable, so
1498
- // the reverse-insertion order survives within each tier.
1499
- return entries.sort(
1500
- ([, a], [, b]) =>
1501
- ((a.instance as { teardownPriority?: number })?.teardownPriority ?? 0) -
1502
- ((b.instance as { teardownPriority?: number })?.teardownPriority ?? 0),
1503
- );
1612
+ const tiers = new Map<number, Array<readonly [string, { resource: any; instance: any }]>>();
1613
+ for (const entry of entries) {
1614
+ const priority = (entry[1].instance as { teardownPriority?: number })?.teardownPriority ?? 0;
1615
+ const tier = tiers.get(priority);
1616
+ if (tier) tier.push(entry);
1617
+ else tiers.set(priority, [entry]);
1618
+ }
1619
+ return [...tiers.keys()]
1620
+ .sort((a, b) => a - b)
1621
+ .flatMap((priority) =>
1622
+ reverseTopologicalOrder(
1623
+ tiers.get(priority)!,
1624
+ (value) => value.resource.metadata.name as string,
1625
+ (name) => this.resourceDependencies.get(name),
1626
+ ),
1627
+ );
1628
+ }
1629
+
1630
+ /**
1631
+ * Every resource of this context that becomes invalid when `names` do — the
1632
+ * named resources plus everything that transitively holds one
1633
+ * ({@link impactClosure} over the same create-time edges teardown reads).
1634
+ *
1635
+ * What a reconciliation unwinds. A cross-module reference projects onto the
1636
+ * local `Telo.Import` (`localDependencyNames`), so a change inside an
1637
+ * imported library reaches this context as its import being impacted, and the
1638
+ * library goes down with that import's own inverse — which is why this
1639
+ * answers for one context rather than walking the tree.
1640
+ *
1641
+ * **`opaque` is what the answer cannot cover.** A name resolved by NAME during
1642
+ * initialization ({@link opaquelyRead}) may be held by a resource no edge
1643
+ * names, so a closure reaching one is not an answer at all. Those names are
1644
+ * reported rather than absorbed: expanding the set to "every resource here"
1645
+ * would sweep in the module document, which is not a resource a caller can
1646
+ * unwind and re-register, and would present a whole-context rebuild as a
1647
+ * narrowing. The caller escalates, and can say which resource forced it.
1648
+ */
1649
+ // eslint-disable-next-line @typescript-eslint/member-ordering
1650
+ impactedBy(names: Iterable<string>): { impacted: Set<string>; opaque: string[] } {
1651
+ const impacted = impactClosure(names, this.resourceDependencies);
1652
+ const opaque = [...impacted].filter((name) => this.opaquelyRead.has(name));
1653
+ return { impacted, opaque };
1654
+ }
1655
+
1656
+ /** Whether this resource's `run()` has been dispatched. A rebuilt resource
1657
+ * that had been started is one nothing will start again — boot targets run
1658
+ * once — so a caller reconciling has to escalate rather than leave it
1659
+ * constructed and idle. */
1660
+ wasStarted(name: string): boolean {
1661
+ const instance = this.resourceInstances.get(name)?.instance;
1662
+ return instance !== undefined && startedInstances.has(instance);
1663
+ }
1664
+
1665
+ /** Drop a resource's published reading. A context with no `resources` scope of
1666
+ * its own has nothing to drop; `ModuleContext` overrides. */
1667
+ clearPublishedReading(name: string): void {
1668
+ void name;
1669
+ }
1670
+
1671
+ /** The declaration registered under `name` in THIS context, without the
1672
+ * walk up the enclosing chain a name lookup does. */
1673
+ declaredManifestFor(name: string): ResourceManifest | undefined {
1674
+ return this.declaredManifests.get(name);
1675
+ }
1676
+
1677
+ /** Replace a declaration in place, without queueing the resource for
1678
+ * creation. For a survivor of a reconciliation: its declaration is
1679
+ * content-identical by construction, but the object carries fresh loader
1680
+ * stamps (`metadata.sourceLine` above all), and a diagnostic anchored on the
1681
+ * stale one points at a pre-edit line. */
1682
+ refreshManifest(name: string, resource: ResourceManifest): void {
1683
+ if (this.declaredManifests.has(name)) this.declaredManifests.set(name, resource);
1684
+ }
1685
+
1686
+ /** Re-open an initialized context for another initialization pass.
1687
+ *
1688
+ * The transition is the context's own, not a field a caller assigns: while it
1689
+ * is open, a reference to a resource that has not been rebuilt yet must
1690
+ * produce the deferral the init loop retries on rather than a hard
1691
+ * not-found, and leaving it open after a failed pass turns every later
1692
+ * lookup into that deferral with no pass coming. */
1693
+ reopenForInitialization(): void {
1694
+ if (this.state === "Initialized") this.state = "Validated";
1695
+ }
1696
+
1697
+ /** Close a pass opened by {@link reopenForInitialization} that did not reach
1698
+ * the end of `initializeResources`. */
1699
+ closeInitialization(): void {
1700
+ if (this.state === "Validated") this.state = "Initialized";
1701
+ }
1702
+
1703
+ /** Names a resource resolved by NAME while this context was initializing, so
1704
+ * no edge records who is holding them. Read by {@link impactedBy}; exposed so
1705
+ * a host can report why a reconciliation could not be narrowed. */
1706
+ opaqueReads(): ReadonlySet<string> {
1707
+ return this.opaquelyRead;
1504
1708
  }
1505
1709
 
1506
1710
  transientChild(context: Record<string, any>): EvaluationContext {
package/src/index.ts CHANGED
@@ -12,7 +12,7 @@ export {
12
12
  export { MemorySource } from "./manifest-sources/memory-source.js";
13
13
  export { WORKSPACE_FILENAME, findWorkspaceRoot, realPath } from "./workspace-marker.js";
14
14
  export type { Transport } from "./transports/transport.js";
15
- export { RegistryTransport } from "./transports/registry-transport.js";
15
+ export { HttpTransport } from "./transports/http-transport.js";
16
16
  export { OciTransport } from "./transports/oci/oci-transport.js";
17
17
  export { OciClient } from "./transports/oci/oci-client.js";
18
18
  export { isOciRef, parseOciRef, type ParsedOciRef } from "./transports/oci/oci-ref.js";