@pithy-sh/support 0.1.3 → 0.1.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 (115) hide show
  1. package/dist/ai/classify.d.ts +2 -0
  2. package/dist/ai/classify.js +2 -0
  3. package/dist/attachment/store.d.ts +2 -0
  4. package/dist/attachment/store.js +2 -0
  5. package/dist/audit/actions.d.ts +2 -0
  6. package/dist/audit/actions.js +2 -0
  7. package/dist/capability.d.ts +2 -0
  8. package/dist/capability.js +2 -0
  9. package/dist/client/projection.d.ts +2 -0
  10. package/dist/client/projection.js +2 -0
  11. package/dist/config/config.d.ts +2 -0
  12. package/dist/config/config.js +2 -0
  13. package/dist/data/attachment.d.ts +2 -0
  14. package/dist/data/attachment.js +2 -0
  15. package/dist/data/billingScope.d.ts +2 -0
  16. package/dist/data/billingScope.js +2 -0
  17. package/dist/data/categories.d.ts +2 -0
  18. package/dist/data/categories.js +2 -0
  19. package/dist/data/classification.d.ts +2 -0
  20. package/dist/data/classification.js +2 -0
  21. package/dist/data/enums.d.ts +2 -0
  22. package/dist/data/enums.js +2 -0
  23. package/dist/data/flag.d.ts +2 -0
  24. package/dist/data/flag.js +2 -0
  25. package/dist/data/message.d.ts +2 -0
  26. package/dist/data/message.js +2 -0
  27. package/dist/data/tables.d.ts +2 -0
  28. package/dist/data/tables.js +2 -0
  29. package/dist/data/thread.d.ts +2 -0
  30. package/dist/data/thread.js +2 -0
  31. package/dist/error/errors.d.ts +2 -0
  32. package/dist/error/errors.js +2 -0
  33. package/dist/http/guards.d.ts +2 -0
  34. package/dist/http/guards.js +2 -0
  35. package/dist/http/handlers.d.ts +2 -0
  36. package/dist/http/handlers.js +2 -0
  37. package/dist/http/resolve.d.ts +2 -0
  38. package/dist/http/resolve.js +2 -0
  39. package/dist/http/responses.d.ts +2 -0
  40. package/dist/http/responses.js +2 -0
  41. package/dist/http/routes.d.ts +2 -0
  42. package/dist/http/routes.js +2 -0
  43. package/dist/http/schemas.d.ts +2 -0
  44. package/dist/http/schemas.js +2 -0
  45. package/dist/http/scopes.d.ts +2 -0
  46. package/dist/http/scopes.js +2 -0
  47. package/dist/http/views.d.ts +2 -0
  48. package/dist/http/views.js +2 -0
  49. package/dist/inbound/authenticity.d.ts +2 -0
  50. package/dist/inbound/authenticity.js +2 -0
  51. package/dist/inbound/guard.d.ts +2 -0
  52. package/dist/inbound/guard.js +2 -0
  53. package/dist/inbound/handler.d.ts +2 -0
  54. package/dist/inbound/handler.js +2 -0
  55. package/dist/inbound/ingest.d.ts +2 -0
  56. package/dist/inbound/ingest.js +2 -0
  57. package/dist/inbound/recipient.d.ts +2 -0
  58. package/dist/inbound/recipient.js +2 -0
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.js +2 -0
  61. package/dist/link/sender.d.ts +2 -0
  62. package/dist/link/sender.js +2 -0
  63. package/dist/migrations/0001_threads.d.ts +2 -0
  64. package/dist/migrations/0001_threads.js +2 -0
  65. package/dist/mime/address.d.ts +2 -0
  66. package/dist/mime/address.js +2 -0
  67. package/dist/mime/parse.d.ts +2 -0
  68. package/dist/mime/parse.js +2 -0
  69. package/dist/mime/sanitize.d.ts +2 -0
  70. package/dist/mime/sanitize.js +2 -0
  71. package/dist/mime/threading.d.ts +2 -0
  72. package/dist/mime/threading.js +2 -0
  73. package/dist/mime/truncate.d.ts +2 -0
  74. package/dist/mime/truncate.js +2 -0
  75. package/dist/provision/provisionSupport.d.ts +2 -0
  76. package/dist/provision/provisionSupport.js +2 -0
  77. package/dist/provision/resolveSupportConfig.d.ts +2 -0
  78. package/dist/provision/resolveSupportConfig.js +2 -0
  79. package/dist/reply/send.d.ts +2 -0
  80. package/dist/reply/send.js +2 -0
  81. package/dist/reply/snippets.d.ts +2 -0
  82. package/dist/reply/snippets.js +2 -0
  83. package/dist/secret/registry.d.ts +2 -0
  84. package/dist/secret/registry.js +2 -0
  85. package/dist/seeds/example.d.ts +2 -0
  86. package/dist/seeds/example.js +2 -0
  87. package/dist/store/paging.d.ts +2 -0
  88. package/dist/store/paging.js +2 -0
  89. package/dist/store/search.d.ts +2 -0
  90. package/dist/store/search.js +2 -0
  91. package/dist/store/searchIndex.d.ts +2 -0
  92. package/dist/store/searchIndex.js +2 -0
  93. package/dist/store/threads.d.ts +2 -0
  94. package/dist/store/threads.js +2 -0
  95. package/dist/submission/encoding.d.ts +3 -1
  96. package/dist/submission/encoding.js +3 -1
  97. package/dist/submission/guard.d.ts +2 -0
  98. package/dist/submission/guard.js +2 -0
  99. package/dist/submission/submit.d.ts +3 -1
  100. package/dist/submission/submit.js +2 -0
  101. package/dist/version.generated.d.ts +3 -1
  102. package/dist/version.generated.js +3 -1
  103. package/dist/workflows/classify.d.ts +2 -0
  104. package/dist/workflows/classify.js +2 -0
  105. package/dist/workflows/retryPolicy.d.ts +2 -0
  106. package/dist/workflows/retryPolicy.js +2 -0
  107. package/dist/workflows/specs.d.ts +2 -0
  108. package/dist/workflows/specs.js +2 -0
  109. package/dist/workflows/worker.d.ts +2 -0
  110. package/dist/workflows/worker.js +2 -0
  111. package/package.json +8 -8
  112. package/src/http/handlers.ts +1 -1
  113. package/src/submission/encoding.ts +1 -1
  114. package/src/submission/submit.ts +1 -1
  115. 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 SupportCategories } from "../data/categories";
2
4
  import { SupportPriority, SupportSentiment } from "../data/enums";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportClassificationError } from "../error/errors.js";
2
4
  import { SupportPriority, SupportSentiment, UNCATEGORIZED } from "../data/enums.js";
3
5
  import { categoryEnum, describeCategories } from "../data/categories.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { R2Bucket } from "@cloudflare/workers-types";
2
4
  import type { ObjectStore } from "@pithy-sh/storage/src/object/store";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/attachment/store.ts
2
4
  /**
3
5
  * Attachment bytes — written through the R2 binding, read back as a short-lived signed URL.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The audit action codes `@pithy-sh/support` emits, as `domain/reason` strings under the `support`
3
5
  * domain.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/audit/actions.ts
2
4
  /**
3
5
  * The audit action codes `@pithy-sh/support` emits, as `domain/reason` strings under the `support`
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { AuditEmit } from "@pithy-sh/core/src/audit/recorder";
2
4
  import { type Capability } from "@pithy-sh/core/src/capability/capability";
3
5
  import type { DatabaseSpecMap } from "@pithy-sh/core/src/data/databases";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { resolveReplies } from "./reply/snippets.js";
2
4
  import { SupportConfig, supportNeedsBucket } from "./config/config.js";
3
5
  import { resolveCategories } from "./data/categories.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * What a browser may know about this project's support inbox — the shape of `virtual:pithy/support`.
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
  /**
3
5
  * The support capability's configuration — the thin, user-owned surface in `pithy.config.ts`.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportReplySnippet } from "../reply/snippets.js";
2
4
  import { normalizeAddress, parseAddress } from "@pithy-sh/core/src/address/address";
3
5
  import { z } from "zod";
@@ -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 attachment in `pithy_support_attachments` — the metadata row for bytes that live in R2.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  import { SQLiteBoolean, SQLiteDate } from "@pithy-sh/core/src/data/codecs";
3
5
  //#region src/data/attachment.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The one payments subject kind support reads.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/data/billingScope.ts
2
4
  /**
3
5
  * The one payments subject kind support reads.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /** A category map: key → the instruction a model reads when deciding whether this is the one. */
3
5
  export type SupportCategories = Record<string, string>;
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportInvalidCategoryError } from "../error/errors.js";
2
4
  import { UNCATEGORIZED } from "./enums.js";
3
5
  import { z } from "zod";
@@ -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 classification in `pithy_support_classifications` — append-only, one row per model run.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportPriority, SupportSentiment } from "./enums.js";
2
4
  import { z } from "zod";
3
5
  import { SQLiteDate } from "@pithy-sh/core/src/data/codecs";
@@ -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 closed axes of the support model — the ones that are genuinely fixed, as opposed to the
@@ -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/enums.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
  * One viewer's private view of one thread, in `pithy_support_thread_flags`.
package/dist/data/flag.js CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  import { SQLiteBoolean, SQLiteDate } from "@pithy-sh/core/src/data/codecs";
3
5
  //#region src/data/flag.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
  * What the app knows about the moment a report was written, and the user did not have to type.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportChannel, SupportMessageDirection } from "./enums.js";
2
4
  import { z } from "zod";
3
5
  import { SQLiteDate, sqliteJson } from "@pithy-sh/core/src/data/codecs";
@@ -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 DatabaseSchema } from "@pithy-sh/core/src/data/db";
3
5
  import type { Kysely } from "kysely";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportAttachment } from "./attachment.js";
2
4
  import { SupportClassification } from "./classification.js";
3
5
  import { SupportThreadFlag } from "./flag.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
  * One conversation in `pithy_support_threads` — the row the inbox is a list of.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportAccountLinkSource, SupportChannel, SupportPriority, SupportSentiment, UNCATEGORIZED } from "./enums.js";
2
4
  import { z } from "zod";
3
5
  import { SQLiteBoolean, SQLiteDate } from "@pithy-sh/core/src/data/codecs";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { PithyError } from "@pithy-sh/core/src/error/pithyError";
2
4
  import type { MessageParams } from "@pithy-sh/core/src/i18n/catalog";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { PithyError } from "@pithy-sh/core/src/error/pithyError";
2
4
  //#region src/error/errors.ts
3
5
  /** A requested thread, message, or attachment does not exist. */
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { PithyHonoEnv } from "@pithy-sh/core/src/capability/capability";
2
4
  import type { MiddlewareHandler } from "hono";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { UnauthorizedError } from "@pithy-sh/core/src/error/pithyError";
2
4
  //#region src/http/guards.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { D1Database, R2Bucket } from "@cloudflare/workers-types";
2
4
  import type { AuditEmit } from "@pithy-sh/core/src/audit/recorder";
3
5
  import type { Logger } from "@pithy-sh/core/src/logger/logger";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportClassificationError, SupportNotFoundError } from "../error/errors.js";
2
4
  import { repliesForCategory } from "../reply/snippets.js";
3
5
  import { attachmentUrl } from "../attachment/store.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { D1Database, R2Bucket } from "@cloudflare/workers-types";
2
4
  import type { PithyHonoEnv } from "@pithy-sh/core/src/capability/capability";
3
5
  import type { Logger } from "@pithy-sh/core/src/logger/logger";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { supportDatabase } from "../data/tables.js";
2
4
  import { SUPPORT_R2_SECRET } from "../secret/registry.js";
3
5
  import { supportWorkflowRegistry, supportWorkflows } from "../workflows/specs.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  /** One conversation, as the inbox and the reading pane show it. */
3
5
  export declare const SupportThreadView: z.ZodObject<{
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportAccountLinkSource, SupportChannel, SupportMessageDirection, SupportPriority, SupportSentiment } from "../data/enums.js";
2
4
  import { SupportSubmissionContext } from "../data/message.js";
3
5
  import { SUPPORT_BILLING_SCOPE } from "../data/billingScope.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { PithyHonoEnv } from "@pithy-sh/core/src/capability/capability";
2
4
  import type { Context, Hono } from "hono";
3
5
  import { type HandlerDeps } from "./handlers";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { requireAuth } from "./guards.js";
2
4
  import { archiveConversation, listInbox, listMyThreads, listReplies, readConversation, readMyThread, reclassifyConversation, replyToConversation, submitFeedbackRequest, updateFlags } from "./handlers.js";
3
5
  import { ArchiveThreadInput, FlagsInput, ListThreadsQuery, MyThreadsQuery, RepliesQuery, ReplyInput, SubmitFeedbackInput, ThreadIdParam } from "./schemas.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 contracts every support route declares (CLAUDE.md §HTTP).
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { MAX_SUBMISSION_BODY_CHARS } from "../config/config.js";
2
4
  import { SupportChannel, SupportPriority, SupportSentiment } from "../data/enums.js";
3
5
  import { SupportSubmissionContext } from "../data/message.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { AdminRoute } from "@pithy-sh/core/src/controlPlane/discovery/adminRoute";
2
4
  import type { ControlPlaneScope } from "@pithy-sh/core/src/controlPlane/scope/scope";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/http/scopes.ts
2
4
  /**
3
5
  * Support's control-plane scopes, and the admin surface a manifest advertises.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { SupportMessage } from "../data/message";
2
4
  import type { SupportThread } from "../data/thread";
3
5
  import type { SenderContext } from "../link/sender";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/http/views.ts
2
4
  /**
3
5
  * The projections between a support row and the wire.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * Whether a message's `From:` header is something we are entitled to believe.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { parseAddress } from "@pithy-sh/core/src/address/address";
2
4
  import { getDomain } from "tldts";
3
5
  //#region src/inbound/authenticity.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { SupportGuardConfig } from "../config/config";
2
4
  import { type SupportDatabase } from "../data/tables";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SUPPORT_MESSAGES_TABLE } from "../data/tables.js";
2
4
  //#region src/inbound/guard.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { CapabilityEmailHandler } from "@pithy-sh/core/src/capability/capability";
2
4
  import type { SupportWiring } from "../capability";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { supportDatabase } from "../data/tables.js";
2
4
  import { makeClassifyDispatcher, resolveDb } from "../http/resolve.js";
3
5
  import { resolveSenderUserId } from "../link/sender.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { R2Bucket } from "@cloudflare/workers-types";
2
4
  import type { AuditEmit } from "@pithy-sh/core/src/audit/recorder";
3
5
  import type { Logger } from "@pithy-sh/core/src/logger/logger";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportAttachment } from "../data/attachment.js";
2
4
  import { SupportMessage } from "../data/message.js";
3
5
  import { SupportThread, UNCLASSIFIED } from "../data/thread.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * Resolve which configured inbox a message landed on, or `undefined` when none of them did.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { parseAddress } from "@pithy-sh/core/src/address/address";
2
4
  //#region src/inbound/recipient.ts
3
5
  /**
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The package entrypoint — the surface `pithy add support` wires into `pithy.config.ts`. Deliberately
3
5
  * narrow: the capability factory, its config and options types, the two federation helpers an adopter
package/dist/index.js CHANGED
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { DEFAULT_SUPPORT_REPLIES, SupportReplySnippet, defineSupportReplies } from "./reply/snippets.js";
2
4
  import { DEFAULT_CLASSIFY_MODEL, SupportAiConfig, SupportAttachmentsConfig, SupportConfig, SupportGuardConfig, SupportReplyConfig, SupportSearchConfig } from "./config/config.js";
3
5
  import { SupportMessageDirection, SupportPriority, SupportSentiment, UNCATEGORIZED } from "./data/enums.js";
@@ -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 { Entitlement } from "@pithy-sh/core/src/entitlement/entitlement";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SUPPORT_BILLING_SCOPE } from "../data/billingScope.js";
2
4
  import { parseAddress } from "@pithy-sh/core/src/address/address";
3
5
  //#region src/link/sender.ts
@@ -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 support inbox: threads, their messages, attachment metadata, the append-only classification
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/migrations/0001_threads.ts
2
4
  /**
3
5
  * The support inbox: threads, their messages, attachment metadata, the append-only classification
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * What a MIME header contributes that an address rule does not.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/mime/address.ts
2
4
  /**
3
5
  * What a MIME header contributes that an address rule does not.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * Inbound MIME, parsed into the shape the rest of the capability works in.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportUnparseableMessageError } from "../error/errors.js";
2
4
  import { normalizeMessageId, parseReferences } from "./threading.js";
3
5
  import { normalizeDisplayName } from "./address.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /** The largest sanitized body kept, **in bytes**. A dashboard rendering 5 MB of markup has already lost. */
2
4
  export declare const MAX_HTML_BYTES: number;
3
5
  /** Whether an `href` value is safe to keep. Relative URLs are fine; a bare scheme we do not know is not. */
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { truncateToBytes } from "./truncate.js";
2
4
  //#region src/mime/sanitize.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * RFC 5322 threading — turning `Message-ID`, `In-Reply-To`, and `References` into a conversation.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/mime/threading.ts
2
4
  /**
3
5
  * RFC 5322 threading — turning `Message-ID`, `In-Reply-To`, and `References` into a conversation.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /** How many bytes this string occupies as UTF-8. */
2
4
  export declare function byteLength(value: string): number;
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/mime/truncate.ts
2
4
  /**
3
5
  * Truncation that counts **bytes**, because the limits it serves are byte limits.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { DeclaredEnvironments } from "@pithy-sh/core/src/naming/environment";
2
4
  import { type ManagedEnvironment } from "@pithy-sh/secrets/src/scope";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SUPPORT_CAPABILITY } from "../workflows/specs.js";
2
4
  import { GLOBAL_SCOPE } from "@pithy-sh/core/src/naming/environment";
3
5
  import { resourceName } from "@pithy-sh/core/src/naming/resource";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { type WorkflowHostTemplate } from "@pithy-sh/core/src/workflow/host";
2
4
  import type { ManagedEnvironment } from "@pithy-sh/secrets/src/scope";
3
5
  import type { SupportConfig } from "../config/config";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SUPPORT_CAPABILITY, supportWorkflowRegistry } from "../workflows/specs.js";
2
4
  import { hostWorkflowsFor, resolveWorkflowHost } from "@pithy-sh/core/src/workflow/host";
3
5
  //#region src/provision/resolveSupportConfig.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { AuditEmit } from "@pithy-sh/core/src/audit/recorder";
2
4
  import type { Logger } from "@pithy-sh/core/src/logger/logger";
3
5
  import type { SupportConfig } from "../config/config";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportNotFoundError, SupportReplyFailedError } from "../error/errors.js";
2
4
  import { SupportMessage } from "../data/message.js";
3
5
  import { SUPPORT_MESSAGES_TABLE, SUPPORT_THREADS_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
  * The tokens a dashboard substitutes before sending. Documented here because they are a contract
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportInvalidCategoryError } from "../error/errors.js";
2
4
  import { z } from "zod";
3
5
  //#region src/reply/snippets.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The secrets support reads — exactly one, and it is not support's own shape.
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { r2CredentialsRegistry } from "@pithy-sh/storage/src/secret/registry";
2
4
  //#region src/secret/registry.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { type SeedSet } from "@pithy-sh/core/src/seed/seed";
2
4
  export declare const supportExampleSeed: SeedSet;
3
5
  //# sourceMappingURL=example.d.ts.map
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportClassification } from "../data/classification.js";
2
4
  import { SupportMessage } from "../data/message.js";
3
5
  import { SupportThread } from "../data/thread.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The inbox page bounds, in the one module that has no reason to import anything (#430).
3
5
  *
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/store/paging.ts
2
4
  /**
3
5
  * The inbox page bounds, in the one module that has no reason to import anything (#430).
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { type Expression, type SqlBool } from "kysely";
2
4
  import { type SupportDatabase } from "../data/tables";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SUPPORT_MESSAGES_TABLE } from "../data/tables.js";
2
4
  import { sql } from "kysely";
3
5
  //#region src/store/search.ts
@@ -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 { SupportDatabase } from "../data/tables";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { sql } from "kysely";
2
4
  //#region src/store/searchIndex.ts
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { Logger } from "@pithy-sh/core/src/logger/logger";
2
4
  import { SupportAttachment } from "../data/attachment";
3
5
  import type { SupportChannel, SupportPriority, SupportSentiment } from "../data/enums";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportNotFoundError } from "../error/errors.js";
2
4
  import { SupportAttachment } from "../data/attachment.js";
3
5
  import { SupportMessage } from "../data/message.js";
@@ -1,7 +1,9 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /**
2
4
  * The largest base64 string worth decoding, derived from a decoded-byte bound.
3
5
  *
4
- * Checked **before** decoding, not after. `atob` materialises the whole result, so a client that sends
6
+ * Checked **before** decoding, not after. `atob` materializes the whole result, so a client that sends
5
7
  * fifty megabytes of base64 has already been allocated fifty megabytes of Worker memory by the time a
6
8
  * post-hoc size check could refuse it — and the request that does that is the one an attacker sends.
7
9
  * A little slack for padding and any whitespace a client's encoder inserted.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { ValidationError } from "@pithy-sh/core/src/error/pithyError";
2
4
  //#region src/submission/encoding.ts
3
5
  /**
@@ -14,7 +16,7 @@ const BASE64_EXPANSION = 4 / 3;
14
16
  /**
15
17
  * The largest base64 string worth decoding, derived from a decoded-byte bound.
16
18
  *
17
- * Checked **before** decoding, not after. `atob` materialises the whole result, so a client that sends
19
+ * Checked **before** decoding, not after. `atob` materializes the whole result, so a client that sends
18
20
  * fifty megabytes of base64 has already been allocated fifty megabytes of Worker memory by the time a
19
21
  * post-hoc size check could refuse it — and the request that does that is the one an attacker sends.
20
22
  * A little slack for padding and any whitespace a client's encoder inserted.
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { SupportSubmissionConfig } from "../config/config";
2
4
  import { type SupportDatabase } from "../data/tables";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SUPPORT_MESSAGES_TABLE } from "../data/tables.js";
2
4
  import { GUARD_WINDOW_MS } from "../inbound/guard.js";
3
5
  //#region src/submission/guard.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { R2Bucket } from "@cloudflare/workers-types";
2
4
  import type { AuditEmit } from "@pithy-sh/core/src/audit/recorder";
3
5
  import type { Logger } from "@pithy-sh/core/src/logger/logger";
@@ -31,7 +33,7 @@ import { type SupportDatabase } from "../data/tables";
31
33
  * The mail path's rule, applied to a different shape: **refuse on the cheapest true reason first.**
32
34
  * The two shape bounds a client controls the cost of — how many files, and how large each encoded one
33
35
  * is — are applied at the transport boundary in `http/handlers.ts` *before* anything is decoded,
34
- * because `atob` materialises its whole result and a size check after it has already been handed the
36
+ * because `atob` materializes its whole result and a size check after it has already been handed the
35
37
  * allocation it meant to refuse. What is left arrives here as bytes:
36
38
  *
37
39
  * 0. **The declared category**, which needs no I/O at all — it is a comparison against a taxonomy this
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportInvalidCategoryError, SupportNotFoundError, SupportRejectedError } from "../error/errors.js";
2
4
  import { categoryEnum } from "../data/categories.js";
3
5
  import { SupportAttachment } from "../data/attachment.js";
@@ -1,5 +1,7 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  /** This package's npm name — the join key against a release feed. */
2
4
  export declare const PACKAGE_NAME = "@pithy-sh/support";
3
5
  /** This package's version, stamped from its own package.json at generation time. */
4
- export declare const PACKAGE_VERSION = "0.1.3";
6
+ export declare const PACKAGE_VERSION = "0.1.4";
5
7
  //# sourceMappingURL=version.generated.d.ts.map
@@ -1,7 +1,9 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/version.generated.ts
2
4
  /** This package's npm name — the join key against a release feed. */
3
5
  const PACKAGE_NAME = "@pithy-sh/support";
4
6
  /** This package's version, stamped from its own package.json at generation time. */
5
- const PACKAGE_VERSION = "0.1.3";
7
+ const PACKAGE_VERSION = "0.1.4";
6
8
  //#endregion
7
9
  export { PACKAGE_NAME, PACKAGE_VERSION };
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { SupportAi } from "../ai/classify";
2
4
  import type { SupportAiConfig } from "../config/config";
3
5
  import type { SupportCategories } from "../data/categories";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import "../data/enums.js";
2
4
  import { SupportClassification } from "../data/classification.js";
3
5
  import { SUPPORT_CLASSIFICATIONS_TABLE, SUPPORT_MESSAGES_TABLE, SUPPORT_THREADS_TABLE } from "../data/tables.js";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { WorkflowRetryPolicy } from "@pithy-sh/core/src/workflow/faults";
2
4
  /**
3
5
  * **What a classification retries, and what it refuses to.**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  //#region src/workflows/retryPolicy.ts
2
4
  /**
3
5
  * **What a classification retries, and what it refuses to.**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import type { WorkflowRegistry } from "@pithy-sh/core/src/workflow/spec";
2
4
  import { z } from "zod";
3
5
  /**
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { z } from "zod";
2
4
  import { workflowKey } from "@pithy-sh/core/src/workflow/naming";
3
5
  //#region src/workflows/specs.ts
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { WorkflowEntrypoint, type WorkflowEvent, type WorkflowStep } from "cloudflare:workers";
2
4
  import type { D1Database } from "@cloudflare/workers-types";
3
5
  import type { SupportAi } from "../ai/classify";
@@ -1,3 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 Pithy
2
+ // SPDX-License-Identifier: MIT
1
3
  import { SupportConfig } from "../config/config.js";
2
4
  import { resolveCategories } from "../data/categories.js";
3
5
  import { supportDatabase } from "../data/tables.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pithy-sh/support",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,7 +25,7 @@
25
25
  }
26
26
  },
27
27
  "scripts": {
28
- "build": "tsdown && tsc -p tsconfig.build.json",
28
+ "build": "tsdown && tsc -p tsconfig.build.json && bun ../../tooling/build/src/stampDeclarations.ts",
29
29
  "typecheck": "tsc -p tsconfig.json",
30
30
  "test": "vitest run",
31
31
  "test:node": "vitest run --project=node",
@@ -36,16 +36,16 @@
36
36
  "dependencies": {
37
37
  "@cloudflare/workers-types": "^5.20260729.1",
38
38
  "@hono/zod-validator": "^0.9.0",
39
- "@pithy-sh/core": "^0.1.3",
40
- "@pithy-sh/email": "^0.1.3",
41
- "@pithy-sh/secrets": "^0.1.3",
42
- "@pithy-sh/storage": "^0.1.3",
39
+ "@pithy-sh/core": "^0.1.5",
40
+ "@pithy-sh/email": "^0.1.4",
41
+ "@pithy-sh/secrets": "^0.1.4",
42
+ "@pithy-sh/storage": "^0.1.4",
43
43
  "postal-mime": "^3.0.0",
44
44
  "tldts": "^7.4.10"
45
45
  },
46
46
  "peerDependencies": {
47
- "@pithy-sh/auth": "^0.1.3",
48
- "@pithy-sh/payments": "^0.1.3",
47
+ "@pithy-sh/auth": "^0.1.4",
48
+ "@pithy-sh/payments": "^0.1.5",
49
49
  "hono": "^4.13.2",
50
50
  "kysely": "^0.29.0",
51
51
  "zod": "^4.4.0"
@@ -359,7 +359,7 @@ export async function submitFeedbackRequest(
359
359
  context: input.context,
360
360
  // Decoded here, at the transport boundary, so `submitFeedback` takes bytes and stays testable
361
361
  // without a request — the same split `ingest.ts` has from the `email()` handler. The decode is
362
- // bounded before it allocates: `atob` materialises the whole result, so a size check afterwards
362
+ // bounded before it allocates: `atob` materializes the whole result, so a size check afterwards
363
363
  // has already paid for the attack it was meant to refuse.
364
364
  attachments: input.attachments.map((attachment) => ({
365
365
  filename: attachment.filename,
@@ -19,7 +19,7 @@ const BASE64_EXPANSION = 4 / 3;
19
19
  /**
20
20
  * The largest base64 string worth decoding, derived from a decoded-byte bound.
21
21
  *
22
- * Checked **before** decoding, not after. `atob` materialises the whole result, so a client that sends
22
+ * Checked **before** decoding, not after. `atob` materializes the whole result, so a client that sends
23
23
  * fifty megabytes of base64 has already been allocated fifty megabytes of Worker memory by the time a
24
24
  * post-hoc size check could refuse it — and the request that does that is the one an attacker sends.
25
25
  * A little slack for padding and any whitespace a client's encoder inserted.
@@ -50,7 +50,7 @@ import { checkAccountRate, checkAttachment } from "./guard";
50
50
  * The mail path's rule, applied to a different shape: **refuse on the cheapest true reason first.**
51
51
  * The two shape bounds a client controls the cost of — how many files, and how large each encoded one
52
52
  * is — are applied at the transport boundary in `http/handlers.ts` *before* anything is decoded,
53
- * because `atob` materialises its whole result and a size check after it has already been handed the
53
+ * because `atob` materializes its whole result and a size check after it has already been handed the
54
54
  * allocation it meant to refuse. What is left arrives here as bytes:
55
55
  *
56
56
  * 0. **The declared category**, which needs no I/O at all — it is a comparison against a taxonomy this
@@ -13,4 +13,4 @@
13
13
  export const PACKAGE_NAME = "@pithy-sh/support";
14
14
 
15
15
  /** This package's version, stamped from its own package.json at generation time. */
16
- export const PACKAGE_VERSION = "0.1.3";
16
+ export const PACKAGE_VERSION = "0.1.4";