@pithy-sh/core 0.1.4 → 0.2.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 (270) hide show
  1. package/dist/address/address.d.ts +2 -0
  2. package/dist/address/address.js +2 -0
  3. package/dist/audit/auditEvent.d.ts +2 -0
  4. package/dist/audit/auditEvent.js +2 -0
  5. package/dist/audit/recorder.d.ts +2 -0
  6. package/dist/audit/recorder.js +2 -0
  7. package/dist/capability/bindings.d.ts +2 -0
  8. package/dist/capability/bindings.js +2 -0
  9. package/dist/capability/capability.d.ts +20 -0
  10. package/dist/capability/capability.d.ts.map +1 -1
  11. package/dist/capability/capability.js +2 -0
  12. package/dist/capability/client.d.ts +2 -0
  13. package/dist/capability/client.js +2 -0
  14. package/dist/capability/compose.d.ts +2 -0
  15. package/dist/capability/compose.js +2 -0
  16. package/dist/capability/composition.d.ts +2 -0
  17. package/dist/capability/composition.js +2 -0
  18. package/dist/capability/config.d.ts +2 -0
  19. package/dist/capability/config.js +2 -0
  20. package/dist/capability/devSecret.d.ts +2 -0
  21. package/dist/capability/devSecret.js +2 -0
  22. package/dist/capability/manifest.d.ts +63 -0
  23. package/dist/capability/manifest.d.ts.map +1 -1
  24. package/dist/capability/manifest.js +63 -1
  25. package/dist/capability/secretOrigin.d.ts +2 -0
  26. package/dist/capability/secretOrigin.js +2 -0
  27. package/dist/capability/settings.d.ts +2 -0
  28. package/dist/capability/settings.js +2 -0
  29. package/dist/capability/validateBindings.d.ts +2 -0
  30. package/dist/capability/validateBindings.js +2 -0
  31. package/dist/capability/vanishingKey.d.ts +2 -0
  32. package/dist/capability/vanishingKey.js +2 -0
  33. package/dist/controlPlane/audit/actions.d.ts +2 -0
  34. package/dist/controlPlane/audit/actions.js +2 -0
  35. package/dist/controlPlane/capability.d.ts +2 -0
  36. package/dist/controlPlane/capability.js +2 -0
  37. package/dist/controlPlane/config/config.d.ts +2 -0
  38. package/dist/controlPlane/config/config.js +2 -0
  39. package/dist/controlPlane/context.d.ts +2 -0
  40. package/dist/controlPlane/context.js +2 -0
  41. package/dist/controlPlane/data/connection.d.ts +2 -0
  42. package/dist/controlPlane/data/connection.js +2 -0
  43. package/dist/controlPlane/data/keyLifecycle.d.ts +2 -0
  44. package/dist/controlPlane/data/keyLifecycle.js +2 -0
  45. package/dist/controlPlane/data/replay.d.ts +2 -0
  46. package/dist/controlPlane/data/replay.js +2 -0
  47. package/dist/controlPlane/data/tables.d.ts +2 -0
  48. package/dist/controlPlane/data/tables.js +2 -0
  49. package/dist/controlPlane/discovery/adminRoute.d.ts +2 -0
  50. package/dist/controlPlane/discovery/adminRoute.js +2 -0
  51. package/dist/controlPlane/discovery/configuration.d.ts +2 -0
  52. package/dist/controlPlane/discovery/configuration.js +2 -0
  53. package/dist/controlPlane/discovery/drift.d.ts +2 -0
  54. package/dist/controlPlane/discovery/drift.js +2 -0
  55. package/dist/controlPlane/discovery/health.d.ts +2 -0
  56. package/dist/controlPlane/discovery/health.js +2 -0
  57. package/dist/controlPlane/discovery/healthSummary.d.ts +2 -0
  58. package/dist/controlPlane/discovery/healthSummary.js +2 -0
  59. package/dist/controlPlane/error/errors.d.ts +2 -0
  60. package/dist/controlPlane/error/errors.js +2 -0
  61. package/dist/controlPlane/http/cors.d.ts +2 -0
  62. package/dist/controlPlane/http/cors.js +2 -0
  63. package/dist/controlPlane/http/guard.d.ts +2 -0
  64. package/dist/controlPlane/http/guard.js +2 -0
  65. package/dist/controlPlane/http/handlers.d.ts +2 -0
  66. package/dist/controlPlane/http/handlers.js +2 -0
  67. package/dist/controlPlane/http/responses.d.ts +2 -0
  68. package/dist/controlPlane/http/responses.js +2 -0
  69. package/dist/controlPlane/http/routes.d.ts +2 -0
  70. package/dist/controlPlane/http/routes.js +2 -0
  71. package/dist/controlPlane/http/schemas.d.ts +2 -0
  72. package/dist/controlPlane/http/schemas.js +2 -0
  73. package/dist/controlPlane/http/verify.d.ts +2 -0
  74. package/dist/controlPlane/http/verify.js +2 -0
  75. package/dist/controlPlane/migrations/0001_init.d.ts +2 -0
  76. package/dist/controlPlane/migrations/0001_init.js +2 -0
  77. package/dist/controlPlane/replay/d1Guard.d.ts +2 -0
  78. package/dist/controlPlane/replay/d1Guard.js +2 -0
  79. package/dist/controlPlane/replay/guard.d.ts +2 -0
  80. package/dist/controlPlane/replay/guard.js +2 -0
  81. package/dist/controlPlane/replay/kvGuard.d.ts +2 -0
  82. package/dist/controlPlane/replay/kvGuard.js +2 -0
  83. package/dist/controlPlane/scope/scope.d.ts +2 -0
  84. package/dist/controlPlane/scope/scope.js +2 -0
  85. package/dist/controlPlane/token/base64url.d.ts +2 -0
  86. package/dist/controlPlane/token/base64url.js +2 -0
  87. package/dist/controlPlane/token/claims.d.ts +2 -0
  88. package/dist/controlPlane/token/claims.js +2 -0
  89. package/dist/controlPlane/token/digest.d.ts +2 -0
  90. package/dist/controlPlane/token/digest.js +2 -0
  91. package/dist/controlPlane/token/jws.d.ts +2 -0
  92. package/dist/controlPlane/token/jws.js +2 -0
  93. package/dist/controlPlane/token/mint.d.ts +2 -0
  94. package/dist/controlPlane/token/mint.js +2 -0
  95. package/dist/controlPlane/wire.d.ts +2 -0
  96. package/dist/controlPlane/wire.js +2 -0
  97. package/dist/createBackend.d.ts +2 -0
  98. package/dist/createBackend.js +2 -0
  99. package/dist/createEntrypoint.d.ts +2 -0
  100. package/dist/createEntrypoint.d.ts.map +1 -1
  101. package/dist/createEntrypoint.js +3 -0
  102. package/dist/data/boundParameters.d.ts +2 -0
  103. package/dist/data/boundParameters.js +2 -0
  104. package/dist/data/codecs.d.ts +2 -0
  105. package/dist/data/codecs.js +2 -0
  106. package/dist/data/cursor.d.ts +2 -0
  107. package/dist/data/cursor.js +2 -0
  108. package/dist/data/databases.d.ts +2 -0
  109. package/dist/data/databases.js +2 -0
  110. package/dist/data/db.d.ts +2 -0
  111. package/dist/data/db.js +2 -0
  112. package/dist/data/withD1Retry.d.ts +2 -0
  113. package/dist/data/withD1Retry.js +2 -0
  114. package/dist/entitlement/entitlement.d.ts +2 -0
  115. package/dist/entitlement/entitlement.js +2 -0
  116. package/dist/entitlement/gateScan.d.ts +2 -0
  117. package/dist/entitlement/gateScan.js +2 -0
  118. package/dist/entitlement/require.d.ts +2 -0
  119. package/dist/entitlement/require.js +2 -0
  120. package/dist/env/ambient.d.ts +2 -0
  121. package/dist/env/ambient.js +2 -0
  122. package/dist/env/ci.d.ts +2 -0
  123. package/dist/env/ci.js +2 -0
  124. package/dist/env/stem.d.ts +2 -0
  125. package/dist/env/stem.js +2 -0
  126. package/dist/error/cause.d.ts +68 -0
  127. package/dist/error/cause.d.ts.map +1 -1
  128. package/dist/error/cause.js +94 -1
  129. package/dist/error/client.d.ts +2 -0
  130. package/dist/error/client.js +2 -0
  131. package/dist/error/extend.d.ts +2 -0
  132. package/dist/error/extend.js +2 -0
  133. package/dist/error/http.d.ts +2 -0
  134. package/dist/error/http.js +2 -0
  135. package/dist/error/payload.d.ts +2 -0
  136. package/dist/error/payload.js +2 -0
  137. package/dist/error/pithyError.d.ts +2 -0
  138. package/dist/error/pithyError.js +2 -0
  139. package/dist/error/terminal.d.ts +2 -0
  140. package/dist/error/terminal.js +2 -0
  141. package/dist/http/authContext.d.ts +2 -0
  142. package/dist/http/authContext.js +2 -0
  143. package/dist/http/routeContract.d.ts +2 -0
  144. package/dist/http/routeContract.js +2 -0
  145. package/dist/http/sameOrigin.d.ts +2 -0
  146. package/dist/http/sameOrigin.js +2 -0
  147. package/dist/http/signedWebhook.d.ts +2 -0
  148. package/dist/http/signedWebhook.js +2 -0
  149. package/dist/http/validation.d.ts +2 -0
  150. package/dist/http/validation.js +2 -0
  151. package/dist/http/verification.d.ts +2 -0
  152. package/dist/http/verification.js +2 -0
  153. package/dist/i18n/acceptLanguage.d.ts +2 -0
  154. package/dist/i18n/acceptLanguage.js +2 -0
  155. package/dist/i18n/catalog.d.ts +2 -0
  156. package/dist/i18n/catalog.js +2 -0
  157. package/dist/i18n/locale.d.ts +2 -0
  158. package/dist/i18n/locale.js +2 -0
  159. package/dist/i18n/localeMarker.d.ts +2 -0
  160. package/dist/i18n/localeMarker.js +2 -0
  161. package/dist/i18n/match.d.ts +2 -0
  162. package/dist/i18n/match.js +2 -0
  163. package/dist/i18n/registry.d.ts +2 -0
  164. package/dist/i18n/registry.js +2 -0
  165. package/dist/i18n/translator.d.ts +2 -0
  166. package/dist/i18n/translator.js +2 -0
  167. package/dist/index.d.ts +2 -0
  168. package/dist/index.js +2 -0
  169. package/dist/kv/kv.d.ts +2 -0
  170. package/dist/kv/kv.js +2 -0
  171. package/dist/kv/namespaces.d.ts +2 -0
  172. package/dist/kv/namespaces.js +2 -0
  173. package/dist/logger/local.d.ts +2 -0
  174. package/dist/logger/local.js +2 -0
  175. package/dist/logger/logger.d.ts +2 -0
  176. package/dist/logger/logger.js +2 -0
  177. package/dist/logger/record.d.ts +2 -0
  178. package/dist/logger/record.js +2 -0
  179. package/dist/logger/worker.d.ts +2 -0
  180. package/dist/logger/worker.js +2 -0
  181. package/dist/migrations/batch.d.ts +2 -0
  182. package/dist/migrations/batch.js +2 -0
  183. package/dist/migrations/bookkeeping.d.ts +2 -0
  184. package/dist/migrations/bookkeeping.js +2 -0
  185. package/dist/migrations/owner.d.ts +2 -0
  186. package/dist/migrations/owner.js +2 -0
  187. package/dist/migrations/registry.d.ts +2 -0
  188. package/dist/migrations/registry.js +2 -0
  189. package/dist/migrations/runner.d.ts +2 -0
  190. package/dist/migrations/runner.js +2 -0
  191. package/dist/naming/domains.d.ts +2 -0
  192. package/dist/naming/domains.js +2 -0
  193. package/dist/naming/environment.d.ts +2 -0
  194. package/dist/naming/environment.js +2 -0
  195. package/dist/naming/feature.d.ts +2 -0
  196. package/dist/naming/feature.js +2 -0
  197. package/dist/naming/limits.d.ts +2 -0
  198. package/dist/naming/limits.js +2 -0
  199. package/dist/naming/provisionScope.d.ts +2 -0
  200. package/dist/naming/provisionScope.js +2 -0
  201. package/dist/naming/resource.d.ts +2 -0
  202. package/dist/naming/resource.js +2 -0
  203. package/dist/naming/resourceNames.d.ts +2 -0
  204. package/dist/naming/resourceNames.js +2 -0
  205. package/dist/naming/segment.d.ts +2 -0
  206. package/dist/naming/segment.js +2 -0
  207. package/dist/projection/asRead.d.ts +2 -0
  208. package/dist/projection/asRead.js +2 -0
  209. package/dist/projection/published.d.ts +2 -0
  210. package/dist/projection/published.js +2 -0
  211. package/dist/schema/describedness.d.ts +2 -0
  212. package/dist/schema/describedness.js +2 -0
  213. package/dist/seed/compose.d.ts +2 -0
  214. package/dist/seed/compose.js +2 -0
  215. package/dist/seed/devLogin.d.ts +2 -0
  216. package/dist/seed/devLogin.js +2 -0
  217. package/dist/seed/exampleIdentities.d.ts +2 -0
  218. package/dist/seed/exampleIdentities.js +2 -0
  219. package/dist/seed/metadata.d.ts +2 -0
  220. package/dist/seed/metadata.js +2 -0
  221. package/dist/seed/seed.d.ts +2 -0
  222. package/dist/seed/seed.js +2 -0
  223. package/dist/seed/seededRows.d.ts +2 -0
  224. package/dist/seed/seededRows.js +2 -0
  225. package/dist/seed/writeD1.d.ts +2 -0
  226. package/dist/seed/writeD1.js +2 -0
  227. package/dist/seed/writeKv.d.ts +2 -0
  228. package/dist/seed/writeKv.js +2 -0
  229. package/dist/semver/semver.d.ts +2 -0
  230. package/dist/semver/semver.js +2 -0
  231. package/dist/text/comments.d.ts +2 -0
  232. package/dist/text/comments.js +2 -0
  233. package/dist/version.generated.d.ts +3 -1
  234. package/dist/version.generated.js +3 -1
  235. package/dist/worker/health.d.ts +2 -0
  236. package/dist/worker/health.js +2 -0
  237. package/dist/worker/identity.d.ts +2 -0
  238. package/dist/worker/identity.js +2 -0
  239. package/dist/workflow/bindings.d.ts +2 -0
  240. package/dist/workflow/bindings.js +2 -0
  241. package/dist/workflow/dispatch.d.ts +2 -0
  242. package/dist/workflow/dispatch.js +2 -0
  243. package/dist/workflow/dispatchRoute.d.ts +2 -0
  244. package/dist/workflow/dispatchRoute.js +2 -0
  245. package/dist/workflow/faults.d.ts +2 -0
  246. package/dist/workflow/faults.js +2 -0
  247. package/dist/workflow/host.d.ts +2 -0
  248. package/dist/workflow/host.js +2 -0
  249. package/dist/workflow/hostEntry.d.ts +2 -0
  250. package/dist/workflow/hostEntry.js +2 -0
  251. package/dist/workflow/hostEnv.d.ts +2 -0
  252. package/dist/workflow/hostEnv.js +2 -0
  253. package/dist/workflow/loopback.d.ts +2 -0
  254. package/dist/workflow/loopback.js +2 -0
  255. package/dist/workflow/naming.d.ts +2 -0
  256. package/dist/workflow/naming.js +2 -0
  257. package/dist/workflow/register.d.ts +2 -0
  258. package/dist/workflow/register.js +2 -0
  259. package/dist/workflow/schemas.d.ts +2 -0
  260. package/dist/workflow/schemas.js +2 -0
  261. package/dist/workflow/spec.d.ts +2 -0
  262. package/dist/workflow/spec.js +2 -0
  263. package/dist/workflow/stepMessage.d.ts +2 -0
  264. package/dist/workflow/stepMessage.js +2 -0
  265. package/package.json +2 -2
  266. package/src/capability/capability.ts +18 -0
  267. package/src/capability/manifest.ts +94 -0
  268. package/src/createEntrypoint.ts +5 -0
  269. package/src/error/cause.ts +116 -0
  270. package/src/version.generated.ts +1 -1
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Hono } from "hono";
2
4
  import type { Capability } from "../../capability/capability";
3
5
  import type { AdminRoute } from "./adminRoute";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { isControlPlaneGuard } from "../http/guard.js";
2
4
  //#region src/controlPlane/discovery/drift.ts
3
5
  /** `app.routes` entries, reduced to the pairs worth comparing. */
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Context } from "hono";
2
4
  import type { z } from "zod";
3
5
  import type { Capability, PithyHonoEnv } from "../../capability/capability";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { InternalError } from "../../error/pithyError.js";
2
4
  import { HealthSummaryKey } from "./healthSummary.js";
3
5
  //#region src/controlPlane/discovery/health.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /** What kind of scalar a key reports. */
3
5
  export declare const HealthValueKind: z.ZodEnum<{
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ControlPlaneScope } from "../scope/scope.js";
2
4
  import { z } from "zod";
3
5
  //#region src/controlPlane/discovery/healthSummary.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { PithyError } from "../../error/pithyError";
2
4
  import type { MessageParams } from "../../i18n/catalog";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { PithyError } from "../../error/pithyError.js";
2
4
  //#region src/controlPlane/error/errors.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Hono, MiddlewareHandler } from "hono";
2
4
  import type { PithyHonoEnv } from "../../capability/capability";
3
5
  import type { AdminRoute } from "../discovery/adminRoute";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import "../../worker/identity.js";
2
4
  import { CONTROL_PLANE_HEADER, CONTROL_PLANE_VERSION_CREATED_HEADER, CONTROL_PLANE_VERSION_HEADER } from "../wire.js";
3
5
  import "../../naming/environment.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { MiddlewareHandler } from "hono";
2
4
  import type { PithyHonoEnv } from "../../capability/capability";
3
5
  import type { ControlPlaneContext } from "../context";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { PithyError } from "../../error/pithyError.js";
2
4
  import { workerVersionMetadata } from "../../worker/identity.js";
3
5
  import { ControlPlaneAuditActions, safeEmit } from "../audit/actions.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Context } from "hono";
2
4
  import type { PithyHonoEnv } from "../../capability/capability";
3
5
  import type { ControlPlaneConfig } from "../config/config";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { workerVersion } from "../../worker/identity.js";
2
4
  import { ControlPlaneConnection } from "../data/connection.js";
3
5
  import { CONTROL_PLANE_CONNECTIONS_TABLE } from "../data/tables.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /**
3
5
  * What the seam's own routes return, as Zod objects a management client can validate against.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { Ed25519PublicJwk } from "../data/connection.js";
2
4
  import { z } from "zod";
3
5
  //#region src/controlPlane/http/responses.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Hono } from "hono";
2
4
  import type { PithyHonoEnv } from "../../capability/capability";
3
5
  import type { AdminRoute } from "../discovery/adminRoute";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ANY_VERIFIED_CALLER, KEYS_ROTATE_SCOPE, MANIFEST_READ_SCOPE } from "../scope/scope.js";
2
4
  import { requireControlPlane } from "./guard.js";
3
5
  import { validationHook } from "../../http/validation.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /**
3
5
  * The request contract for the seam's own routes. Every input surface is validated here and read in a
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { Ed25519PublicJwk } from "../data/connection.js";
2
4
  import { z } from "zod";
3
5
  //#region src/controlPlane/http/schemas.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { ControlPlaneConfig } from "../config/config";
2
4
  import { ControlPlaneContext } from "../context";
3
5
  import type { ControlPlaneConnection } from "../data/connection";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { scopeCovers } from "../scope/scope.js";
2
4
  import { ControlPlaneInsufficientScopeError, ControlPlaneInvalidCredentialError, ControlPlaneNotConnectedError } from "../error/errors.js";
3
5
  import { CONTROL_PLANE_HEADER, CONTROL_PLANE_VERSION_HEADER } from "../wire.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Migration } from "kysely/migration";
2
4
  /**
3
5
  * The control-plane seam's tables: which management client may call this Worker, and which of its tokens
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/controlPlane/migrations/0001_init.ts
2
4
  /**
3
5
  * The control-plane seam's tables: which management client may call this Worker, and which of its tokens
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { type ControlPlaneDatabase } from "../data/tables";
2
4
  import type { ReplayGuard } from "./guard";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ControlPlaneReplay } from "../data/replay.js";
2
4
  import { CONTROL_PLANE_REPLAYS_TABLE } from "../data/tables.js";
3
5
  //#region src/controlPlane/replay/d1Guard.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The replay guard: a control-plane token is spendable exactly once.
3
5
  *
@@ -0,0 +1,2 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  import type { TypedKv } from "../../kv/kv";
3
5
  import type { ReplayGuard } from "./guard";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import "../token/claims.js";
2
4
  import { z } from "zod";
3
5
  //#region src/controlPlane/replay/kvGuard.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /**
3
5
  * One granted operation. Validated on the way into the connection row and on the way out of a token,
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /**
3
5
  * One granted operation. Validated on the way into the connection row and on the way out of a token,
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /** Encode raw bytes as unpadded base64url. */
2
4
  export declare function base64UrlEncode(bytes: Uint8Array): string;
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ControlPlaneInvalidCredentialError } from "../error/errors.js";
2
4
  //#region src/controlPlane/token/base64url.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /**
3
5
  * The token a management client presents: what it claims, and what shape the envelope around it must
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ControlPlaneScope } from "../scope/scope.js";
2
4
  import { z } from "zod";
3
5
  //#region src/controlPlane/token/claims.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The two primitives the body-binding check needs: hash a request body, then compare that hash to the
3
5
  * one the token committed to.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { base64UrlEncode } from "./base64url.js";
2
4
  //#region src/controlPlane/token/digest.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Ed25519PublicJwk } from "../data/connection";
2
4
  import { ControlPlaneClaims, ControlPlaneJwsHeader } from "./claims";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ControlPlaneClaims, ControlPlaneJwsHeader } from "./claims.js";
2
4
  import { ControlPlaneInvalidCredentialError } from "../error/errors.js";
3
5
  import { base64UrlDecode } from "./base64url.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Ed25519PublicJwk } from "../data/connection";
2
4
  /**
3
5
  * Mint a control-plane token — the management client's half of the seam.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ControlPlaneClaims } from "./claims.js";
2
4
  import { base64UrlEncode } from "./base64url.js";
3
5
  import { sha256Base64Url } from "./digest.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The control-plane wire contract: the names both ends of the seam must spell identically, and the one
3
5
  * rule for reading what they carry.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/controlPlane/wire.ts
2
4
  /**
3
5
  * The control-plane wire contract: the names both ends of the seam must spell identically, and the one
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { Hono } from "hono";
2
4
  import type { Capability, MergedDatabases, MergedKvNamespaces, MergedWorkflowParams, PithyVars } from "./capability/capability";
3
5
  import { type DbRegistry } from "./data/databases";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { noopEmit } from "./audit/recorder.js";
2
4
  import { BindingSpec } from "./capability/bindings.js";
3
5
  import { ValidationError } from "./error/pithyError.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { ExecutionContext, ForwardableEmailMessage } from "@cloudflare/workers-types";
2
4
  import type { Capability } from "./capability/capability";
3
5
  import { type CreateBackendOptions } from "./createBackend";
@@ -1 +1 @@
1
- {"version":3,"file":"createEntrypoint.d.ts","sourceRoot":"","sources":["../src/createEntrypoint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,UAAU,EAA0B,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC;AAI3E;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/G;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjH;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzG;AAkBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,CAAC,IAAI,SAAS,SAAS,UAAU,EAAE,EACxC,KAAK,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EACrF,OAAO,EAAE,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,eAAe,CA+C3D"}
1
+ {"version":3,"file":"createEntrypoint.d.ts","sourceRoot":"","sources":["../src/createEntrypoint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,UAAU,EAA0B,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC;AAI3E;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/G;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjH;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzG;AAkBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,CAAC,IAAI,SAAS,SAAS,UAAU,EAAE,EACxC,KAAK,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EACrF,OAAO,EAAE,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,eAAe,CAoD3D"}
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { triggerWorkflow } from "./workflow/dispatch.js";
2
4
  import { composeWorkflows, scheduledWorkflows } from "./workflow/register.js";
3
5
  import { createBackend } from "./createBackend.js";
@@ -26,6 +28,7 @@ function createEntrypoint(options) {
26
28
  const app = createBackend(options);
27
29
  const all = options.app ? [...options.capabilities, options.app] : [...options.capabilities];
28
30
  const handlers = all.flatMap((cap) => cap.email ? [cap.email] : []);
31
+ for (const cap of all) cap.boot?.({ capabilities: all });
29
32
  const registry = composeWorkflows(all);
30
33
  const scheduled = scheduledWorkflows(registry);
31
34
  const entrypoint = { fetch: (request, env, ctx) => app.fetch(request, env, ctx) };
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { D1Database } from "@cloudflare/workers-types";
2
4
  /**
3
5
  * D1's bound-parameter ceiling, and the chunking every `in (...)` list needs to stay under it.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { InternalError } from "../error/pithyError.js";
2
4
  //#region src/data/boundParameters.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /** SQLiteBoolean: boolean ↔ 0|1. Decode is lenient (number/boolean/string). */
3
5
  export declare const SQLiteBoolean: z.ZodCodec<z.ZodUnion<readonly [z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodBoolean, z.ZodString]>, z.ZodBoolean>;
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  //#region src/data/codecs.ts
3
5
  const TRUTHY = [
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /**
3
5
  * Keyset pagination, once, for every capability that lists an unbounded table.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  //#region src/data/cursor.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Kysely } from "kysely";
2
4
  import type { Migration } from "kysely/migration";
3
5
  import type { z } from "zod";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { createDatabase } from "./db.js";
2
4
  import { bindingGroupsFrom, composeBindingGroups } from "../capability/compose.js";
3
5
  //#region src/data/databases.ts
package/dist/data/db.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { D1Database } from "@cloudflare/workers-types";
2
4
  import { type Generated, Kysely } from "kysely";
3
5
  import type { z } from "zod";
package/dist/data/db.js CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { guardBoundParameters } from "./boundParameters.js";
2
4
  import { CamelCasePlugin, Kysely } from "kysely";
3
5
  import { D1Dialect } from "kysely-d1";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * Retry a D1 write through transient faults. Ported from the CMS `withD1Retry`, adapted to
3
5
  * Pithy: no injected logger (core has none), an optional `onRetry` notifier instead, and a
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/data/withD1Retry.ts
2
4
  /**
3
5
  * Retry a D1 write through transient faults. Ported from the CMS `withD1Retry`, adapted to
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  export declare const EntitlementKey: z.ZodString;
3
5
  export type EntitlementKey = z.output<typeof EntitlementKey>;
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  const EntitlementKey = z.string().min(1).max(64).regex(/^[a-z][a-z0-9_]*$/, "An entitlement key is lowercase letters, digits, and underscores, starting with a letter.").describe("A logical entitlement key (`pro`, `ads_removed`) — what gating code names. Never a store SKU: many products across many rails grant one key.");
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The source with its comments blanked, so a `// TODO: requireEntitlement("pro")` is not read as a gate.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/entitlement/gateScan.ts
2
4
  /**
3
5
  * Finding an entitlement gate in source text — the pure half of the composition check.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { MiddlewareHandler } from "hono";
2
4
  import type { PithyHonoEnv } from "../capability/capability";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { InternalError, PithyError, UnauthorizedError, messageOf } from "../error/pithyError.js";
2
4
  import { ENTITLEMENT_DENIED_ACTION, EntitlementKey, grantedEntitlementKeys } from "./entitlement.js";
3
5
  //#region src/entitlement/require.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * What the *ambient* environment says about the composition being assembled — the two questions a
3
5
  * capability may ask before it registers anything, and the one reader for both.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import "../worker/identity.js";
2
4
  //#region src/env/ambient.ts
3
5
  /**
package/dist/env/ci.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { type AmbientEnv } from "./ambient";
2
4
  /**
3
5
  * Is this continuous integration? One read, one rule, one place — the convention starts here.
package/dist/env/ci.js CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ambientEnv, ambientFlag } from "./ambient.js";
2
4
  //#region src/env/ci.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * How a member of the dev set publishes its address, and how a sibling looks it up.
3
5
  *
package/dist/env/stem.js CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/env/stem.ts
2
4
  /**
3
5
  * How a member of the dev set publishes its address, and how a sibling looks it up.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * Reading a thrown value that no type describes — the one place the kit records **what a runtime does to
3
5
  * an error on its way out** (#223), and **the one place that decides whether what it says may be shown**
@@ -130,6 +132,39 @@ export interface FailurePosition {
130
132
  * coincidence of the path's own characters — and a fabricated position reads as authoritative.
131
133
  */
132
134
  export declare function failurePosition(cause: unknown): FailurePosition | undefined;
135
+ /** What kind of thing failed to resolve. Three causes that wore one sentence until #489. */
136
+ export type UnresolvedKind =
137
+ /** A bare specifier for a package that is not installed. Installing dependencies is the remedy. */
138
+ "package"
139
+ /** An installed package asked for a subpath it does not provide. Installing again changes nothing. */
140
+ | "package-subpath"
141
+ /** A relative import of a file in the project's own tree. Installing again changes nothing. */
142
+ | "local-file";
143
+ /**
144
+ * Which of the three unresolved-import causes this was, or `undefined` when it cannot be told.
145
+ *
146
+ * **The discriminator was already in the message and was being thrown away.** `unresolvedSpecifier`
147
+ * matches `Cannot find (?:package|module)` — and `package` versus `module` is exactly the fact that
148
+ * separates a missing dependency from the other two. It sat in a non-capturing group, so every cause
149
+ * arrived wearing one sentence, and for two of the three that sentence advised an install which is
150
+ * *guaranteed* to change nothing. That is #489's class exactly: guidance a caller cannot follow, worst
151
+ * for the caller it is written for, which has no human to shrug and try something else.
152
+ *
153
+ * Measured across Node 24.13.0 and Bun 1.3.14, because the two runtimes hand back different halves and
154
+ * each hands back exactly one usable one:
155
+ *
156
+ * | cause | Node says | Bun's `specifier` |
157
+ * |---|---|---|
158
+ * | package absent | `Cannot find package 'pkg'`, no `url` | `pkg` |
159
+ * | subpath missing | `Cannot find module '/abs/node_modules/pkg/src/nope.js'`, `url` under node_modules | `pkg/src/nope` |
160
+ * | adopter's file | `Cannot find module '/abs/apps/board/src/x'`, `url` outside node_modules | `./src/x` |
161
+ *
162
+ * Bun gives the **specifier as written**, so a leading `.` settles it. Node gives the **already-resolved
163
+ * path**, where being under `node_modules` settles it. Neither read works on both runtimes; the pair
164
+ * does, and it is the same predicate — *is this inside node_modules* — applied to whichever fact the
165
+ * runtime supplied.
166
+ */
167
+ export declare function unresolvedKind(cause: unknown): UnresolvedKind | undefined;
133
168
  /**
134
169
  * The specifier that did not resolve.
135
170
  *
@@ -140,4 +175,37 @@ export declare function failurePosition(cause: unknown): FailurePosition | undef
140
175
  * Whether a surface names it, and what it advises when it does, is that surface's policy and stays there.
141
176
  */
142
177
  export declare function unresolvedSpecifier(cause: unknown): string | undefined;
178
+ /**
179
+ * The package whose own source contained the import that did not resolve — **never a path**.
180
+ *
181
+ * {@link unresolvedSpecifier} answers *what* did not resolve. This answers *where the import lives*, and
182
+ * the two are different facts whenever the failing import is not the adopter's own. #480 is that case
183
+ * verbatim: `pithy add email` on a fresh project refused with
184
+ *
185
+ * > Nothing resolves "@pithy-sh/core/src/capability/capability".
186
+ *
187
+ * while `@pithy-sh/core` resolved from the Worker at every step of the run, before and after. The
188
+ * specifier was honest — the runtime really could not resolve it — but the import belonged to
189
+ * `@pithy-sh/email`, which had just been installed and was the package genuinely not linked. So the
190
+ * refusal named the one dependency that was definitely fine, and an adopter following it ran `bun
191
+ * install` against a tree that already had core in it. The importer is the half that would have pointed
192
+ * at `email`, and both runtimes hand it over: **Bun's `ResolveMessage` carries `referrer` as a field**
193
+ * (measured on 1.3.14) and Node states it in prose as `imported from <path>`.
194
+ *
195
+ * **A package name, or nothing.** The referrer is an absolute path — our frame, and the reason
196
+ * {@link unresolvedSpecifier} drops the prose around the specifier — so what travels is the one part of
197
+ * it that is not a path: the package directory it sits under. A referrer outside `node_modules` is the
198
+ * adopter's own file, and there is nothing to say about it that the refusal does not already say by
199
+ * naming the config, so it answers `undefined` rather than a path. The path itself is never returned
200
+ * from this module, which is what makes leaking it impossible rather than merely discouraged.
201
+ *
202
+ * The **last** `node_modules` in the path, because every store layout nests: pnpm's
203
+ * `node_modules/.pnpm/<id>/node_modules/<pkg>` and Bun's isolated linker's
204
+ * `node_modules/.bun/<pkg>@<version>/node_modules/<pkg>` (both measured) put the real owner last, and so
205
+ * does an ordinary nested install. The name is then checked against what npm allows, so a store's own
206
+ * bookkeeping directory (`.bun`, `.pnpm`, `hono@4.6.3`) can only ever answer nothing.
207
+ *
208
+ * Whether a surface names it, and what it advises when it does, is that surface's policy and stays there.
209
+ */
210
+ export declare function importingPackage(cause: unknown): string | undefined;
143
211
  //# sourceMappingURL=cause.d.ts.map