theokit 0.46.1 → 0.48.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 (171) hide show
  1. package/dist/{actions-virtual-module-LLDDAQWY.js → actions-virtual-module-2VVLVXHY.js} +6 -6
  2. package/dist/{actions-virtual-module-67K4POQ2.js → actions-virtual-module-Z5LXAX7E.js} +8 -7
  3. package/dist/actions-virtual-module-Z5LXAX7E.js.map +1 -0
  4. package/dist/{agent-WFULT3OB.js → agent-Y3JKRROD.js} +4 -4
  5. package/dist/{app-typed-client-S3VR4ZA3.js → app-typed-client-N4I4RBLT.js} +6 -6
  6. package/dist/app-typed-client-N4I4RBLT.js.map +1 -0
  7. package/dist/{app-typed-client-N5WUE2CP.js → app-typed-client-NI3CM2FA.js} +8 -7
  8. package/dist/app-typed-client-NI3CM2FA.js.map +1 -0
  9. package/dist/{aws-lambda-473QCOL6.js → aws-lambda-7SUTORXM.js} +3 -3
  10. package/dist/boot/index.js +1 -1
  11. package/dist/{build-YQ6MXOV6.js → build-SJQDRD2B.js} +10 -10
  12. package/dist/{bun-OQUCL3XW.js → bun-TLYZCEGE.js} +3 -3
  13. package/dist/{chunk-HEK4SET7.js → chunk-5JJCNEUS.js} +2 -2
  14. package/dist/chunk-5JJCNEUS.js.map +1 -0
  15. package/dist/chunk-6E5WKMDS.js +67 -0
  16. package/dist/chunk-6E5WKMDS.js.map +1 -0
  17. package/dist/{chunk-TDNNBLGW.js → chunk-6GGWS7J3.js} +1 -1
  18. package/dist/chunk-6GGWS7J3.js.map +1 -0
  19. package/dist/{chunk-FZG3JYB3.js → chunk-7ZOQN7UH.js} +1 -1
  20. package/dist/{chunk-B7ONQ4QJ.js → chunk-AOGYAXPY.js} +3 -3
  21. package/dist/{chunk-QPVXGC7O.js → chunk-CUYEA62B.js} +1 -1
  22. package/dist/{chunk-QPVXGC7O.js.map → chunk-CUYEA62B.js.map} +1 -1
  23. package/dist/{chunk-OXCALO3W.js → chunk-D3425YDV.js} +2 -2
  24. package/dist/{chunk-SMP2T335.js → chunk-DGQO372T.js} +2 -2
  25. package/dist/{chunk-C34PMLSN.js → chunk-DV34VG3N.js} +2 -10
  26. package/dist/chunk-DV34VG3N.js.map +1 -0
  27. package/dist/{chunk-U3H53IIN.js → chunk-FO55VGMQ.js} +3 -3
  28. package/dist/{chunk-VFU7DTUL.js → chunk-GEHX6CAE.js} +10 -8
  29. package/dist/chunk-GEHX6CAE.js.map +1 -0
  30. package/dist/{chunk-GDN3PXFH.js → chunk-HBU2GIMZ.js} +1 -1
  31. package/dist/chunk-HBU2GIMZ.js.map +1 -0
  32. package/dist/{chunk-7SABX4DJ.js → chunk-IZ3TIL6K.js} +28 -2
  33. package/dist/{chunk-7SABX4DJ.js.map → chunk-IZ3TIL6K.js.map} +1 -1
  34. package/dist/{chunk-L4Y6RJ4E.js → chunk-KSZGBUTI.js} +2 -2
  35. package/dist/{chunk-226KMIGZ.js → chunk-MNIQ5F3Y.js} +2 -10
  36. package/dist/chunk-MNIQ5F3Y.js.map +1 -0
  37. package/dist/{chunk-KBGGQK4I.js → chunk-O3JIAU3V.js} +4 -4
  38. package/dist/{chunk-UYMCKHML.js → chunk-O5W7XSUX.js} +40 -40
  39. package/dist/chunk-O5W7XSUX.js.map +1 -0
  40. package/dist/{chunk-EIRQM55C.js → chunk-OJLL4YD6.js} +5 -46
  41. package/dist/chunk-OJLL4YD6.js.map +1 -0
  42. package/dist/{chunk-6LNIGF5P.js → chunk-ORKNVORZ.js} +1 -1
  43. package/dist/chunk-ORKNVORZ.js.map +1 -0
  44. package/dist/{chunk-KPKLIUUL.js → chunk-TNI4MARH.js} +3 -3
  45. package/dist/{chunk-6KDXP472.js → chunk-UDPJP42U.js} +4 -4
  46. package/dist/{chunk-HGZL5EOI.js → chunk-VQIUTCK2.js} +28 -2
  47. package/dist/chunk-VQIUTCK2.js.map +1 -0
  48. package/dist/{chunk-6VDYQ4I6.js → chunk-VTJMND23.js} +4 -4
  49. package/dist/{chunk-6VDYQ4I6.js.map → chunk-VTJMND23.js.map} +1 -1
  50. package/dist/{chunk-37ZO643S.js → chunk-XALU5LCU.js} +3 -3
  51. package/dist/{chunk-SEELKQUM.js → chunk-Y2KHTD2W.js} +6 -2
  52. package/dist/chunk-Y2KHTD2W.js.map +1 -0
  53. package/dist/{chunk-SZU6BOMV.js → chunk-YRRWQDKK.js} +22 -18
  54. package/dist/chunk-YRRWQDKK.js.map +1 -0
  55. package/dist/{chunk-5AMXBU2R.js → chunk-ZALJIZH2.js} +13 -13
  56. package/dist/chunk-ZALJIZH2.js.map +1 -0
  57. package/dist/cli/index.js +31 -9
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/client/index.d.ts +1 -1
  60. package/dist/client/index.js +1 -1
  61. package/dist/{cloudflare-4YT5CK3P.js → cloudflare-JTBKOX3F.js} +3 -3
  62. package/dist/{deno-deploy-YYN6BNLF.js → deno-deploy-3ESNGYZU.js} +3 -3
  63. package/dist/{dev-YNO26JS3.js → dev-6TWDBX6G.js} +12 -12
  64. package/dist/{dev-emit-J7V6GWSK.js → dev-emit-7ZZRTYF3.js} +3 -3
  65. package/dist/{dev-emit-F54Y5TIU.js → dev-emit-E5Z26AMV.js} +3 -3
  66. package/dist/devtools/entry.js.map +1 -1
  67. package/dist/doctor-Y53QTUSP.js +56 -0
  68. package/dist/doctor-Y53QTUSP.js.map +1 -0
  69. package/dist/{error-envelope-BsNzzAV5.d.ts → error-envelope-DG47lt8E.d.ts} +4 -4
  70. package/dist/{generate-GXWPUVS7.js → generate-WQSNW4F6.js} +1 -1
  71. package/dist/{generate-GXWPUVS7.js.map → generate-WQSNW4F6.js.map} +1 -1
  72. package/dist/{index-BeAsvfPr.d.ts → index-BEtEv6ZH.d.ts} +2 -2
  73. package/dist/index.d.ts +5 -5
  74. package/dist/index.js +9 -8
  75. package/dist/index.js.map +1 -1
  76. package/dist/{info-ICDTPJDC.js → info-QB7Q3SHP.js} +5 -5
  77. package/dist/{internal-api-S7WK2WCY.js → internal-api-REGN3WMX.js} +11 -9
  78. package/dist/{internal-api-NO24QAXC.js → internal-api-XQA2L663.js} +6 -6
  79. package/dist/load-config-JKJ73TOD.js +14 -0
  80. package/dist/{mcp-3S6A4A4Q.js → mcp-CO4AGAXV.js} +5 -5
  81. package/dist/{netlify-2WZUQYI3.js → netlify-OFJUYXTZ.js} +3 -3
  82. package/dist/node-ND4MJU3Z.js +10 -0
  83. package/dist/{openapi-NIYA2VBG.js → openapi-5CZCL7YP.js} +7 -7
  84. package/dist/registry-QTSMLOVG.js +23 -0
  85. package/dist/{routes-2RD4S5PZ.js → routes-GWAWUVVQ.js} +6 -6
  86. package/dist/{schema-S553QCAU.js → schema-2JEG6TTU.js} +3 -3
  87. package/dist/server/agent/index.d.ts +90 -1
  88. package/dist/server/agent/index.js +14 -2
  89. package/dist/server/cost/index.d.ts +1 -0
  90. package/dist/server/cost/index.js +3 -1
  91. package/dist/server/http/index.d.ts +2 -2
  92. package/dist/server/http/index.js +2 -2
  93. package/dist/server/index.d.ts +499 -6
  94. package/dist/server/index.js +491 -12
  95. package/dist/server/index.js.map +1 -1
  96. package/dist/server/observability/index.d.ts +4 -4
  97. package/dist/server/observability/index.js +1 -1
  98. package/dist/server/rate-limit/index.js +2 -2
  99. package/dist/server/scan/index.js +2 -2
  100. package/dist/{server-error-to-envelope-UM7DEVM4.js → server-error-to-envelope-2MQOME5Q.js} +2 -2
  101. package/dist/{server-error-to-envelope-UUXDSLAZ.js → server-error-to-envelope-4TGCDQ2S.js} +2 -2
  102. package/dist/{services-typed-client-EO4RFNTZ.js → services-typed-client-II7LKXKO.js} +2 -2
  103. package/dist/sessions-gc-H4WC4IXB.js +38 -0
  104. package/dist/sessions-gc-H4WC4IXB.js.map +1 -0
  105. package/dist/{start-TVT7BZ4V.js → start-IO3ZYGEX.js} +13 -13
  106. package/dist/start-IO3ZYGEX.js.map +1 -0
  107. package/dist/{static-25H5K42R.js → static-HTT2WNIT.js} +3 -3
  108. package/dist/{theo-cloud-JL2KXHIS.js → theo-cloud-ZTQLXGPS.js} +2 -2
  109. package/dist/theo-cloud-ZTQLXGPS.js.map +1 -0
  110. package/dist/{vercel-FP3C6LN6.js → vercel-72HFEMJ3.js} +3 -3
  111. package/dist/vite-plugin/index.js +9 -8
  112. package/dist/{vite-plugin-K64KQZSU.js → vite-plugin-NQ6F7FGV.js} +12 -12
  113. package/package.json +6 -7
  114. package/dist/actions-virtual-module-67K4POQ2.js.map +0 -1
  115. package/dist/app-typed-client-N5WUE2CP.js.map +0 -1
  116. package/dist/app-typed-client-S3VR4ZA3.js.map +0 -1
  117. package/dist/chunk-226KMIGZ.js.map +0 -1
  118. package/dist/chunk-5AMXBU2R.js.map +0 -1
  119. package/dist/chunk-6LNIGF5P.js.map +0 -1
  120. package/dist/chunk-C34PMLSN.js.map +0 -1
  121. package/dist/chunk-EIRQM55C.js.map +0 -1
  122. package/dist/chunk-GDN3PXFH.js.map +0 -1
  123. package/dist/chunk-HEK4SET7.js.map +0 -1
  124. package/dist/chunk-HGZL5EOI.js.map +0 -1
  125. package/dist/chunk-SEELKQUM.js.map +0 -1
  126. package/dist/chunk-SZU6BOMV.js.map +0 -1
  127. package/dist/chunk-TDNNBLGW.js.map +0 -1
  128. package/dist/chunk-UYMCKHML.js.map +0 -1
  129. package/dist/chunk-VFU7DTUL.js.map +0 -1
  130. package/dist/load-config-ICCNMO74.js +0 -14
  131. package/dist/node-CMAYKDCM.js +0 -10
  132. package/dist/registry-72YH7ZJM.js +0 -23
  133. package/dist/start-TVT7BZ4V.js.map +0 -1
  134. package/dist/theo-cloud-JL2KXHIS.js.map +0 -1
  135. /package/dist/{actions-virtual-module-LLDDAQWY.js.map → actions-virtual-module-2VVLVXHY.js.map} +0 -0
  136. /package/dist/{agent-WFULT3OB.js.map → agent-Y3JKRROD.js.map} +0 -0
  137. /package/dist/{aws-lambda-473QCOL6.js.map → aws-lambda-7SUTORXM.js.map} +0 -0
  138. /package/dist/{build-YQ6MXOV6.js.map → build-SJQDRD2B.js.map} +0 -0
  139. /package/dist/{bun-OQUCL3XW.js.map → bun-TLYZCEGE.js.map} +0 -0
  140. /package/dist/{chunk-FZG3JYB3.js.map → chunk-7ZOQN7UH.js.map} +0 -0
  141. /package/dist/{chunk-B7ONQ4QJ.js.map → chunk-AOGYAXPY.js.map} +0 -0
  142. /package/dist/{chunk-OXCALO3W.js.map → chunk-D3425YDV.js.map} +0 -0
  143. /package/dist/{chunk-SMP2T335.js.map → chunk-DGQO372T.js.map} +0 -0
  144. /package/dist/{chunk-U3H53IIN.js.map → chunk-FO55VGMQ.js.map} +0 -0
  145. /package/dist/{chunk-L4Y6RJ4E.js.map → chunk-KSZGBUTI.js.map} +0 -0
  146. /package/dist/{chunk-KBGGQK4I.js.map → chunk-O3JIAU3V.js.map} +0 -0
  147. /package/dist/{chunk-KPKLIUUL.js.map → chunk-TNI4MARH.js.map} +0 -0
  148. /package/dist/{chunk-6KDXP472.js.map → chunk-UDPJP42U.js.map} +0 -0
  149. /package/dist/{chunk-37ZO643S.js.map → chunk-XALU5LCU.js.map} +0 -0
  150. /package/dist/{cloudflare-4YT5CK3P.js.map → cloudflare-JTBKOX3F.js.map} +0 -0
  151. /package/dist/{deno-deploy-YYN6BNLF.js.map → deno-deploy-3ESNGYZU.js.map} +0 -0
  152. /package/dist/{dev-YNO26JS3.js.map → dev-6TWDBX6G.js.map} +0 -0
  153. /package/dist/{dev-emit-J7V6GWSK.js.map → dev-emit-7ZZRTYF3.js.map} +0 -0
  154. /package/dist/{dev-emit-F54Y5TIU.js.map → dev-emit-E5Z26AMV.js.map} +0 -0
  155. /package/dist/{info-ICDTPJDC.js.map → info-QB7Q3SHP.js.map} +0 -0
  156. /package/dist/{internal-api-S7WK2WCY.js.map → internal-api-REGN3WMX.js.map} +0 -0
  157. /package/dist/{internal-api-NO24QAXC.js.map → internal-api-XQA2L663.js.map} +0 -0
  158. /package/dist/{load-config-ICCNMO74.js.map → load-config-JKJ73TOD.js.map} +0 -0
  159. /package/dist/{mcp-3S6A4A4Q.js.map → mcp-CO4AGAXV.js.map} +0 -0
  160. /package/dist/{netlify-2WZUQYI3.js.map → netlify-OFJUYXTZ.js.map} +0 -0
  161. /package/dist/{node-CMAYKDCM.js.map → node-ND4MJU3Z.js.map} +0 -0
  162. /package/dist/{openapi-NIYA2VBG.js.map → openapi-5CZCL7YP.js.map} +0 -0
  163. /package/dist/{registry-72YH7ZJM.js.map → registry-QTSMLOVG.js.map} +0 -0
  164. /package/dist/{routes-2RD4S5PZ.js.map → routes-GWAWUVVQ.js.map} +0 -0
  165. /package/dist/{schema-S553QCAU.js.map → schema-2JEG6TTU.js.map} +0 -0
  166. /package/dist/{server-error-to-envelope-UM7DEVM4.js.map → server-error-to-envelope-2MQOME5Q.js.map} +0 -0
  167. /package/dist/{server-error-to-envelope-UUXDSLAZ.js.map → server-error-to-envelope-4TGCDQ2S.js.map} +0 -0
  168. /package/dist/{services-typed-client-EO4RFNTZ.js.map → services-typed-client-II7LKXKO.js.map} +0 -0
  169. /package/dist/{static-25H5K42R.js.map → static-HTT2WNIT.js.map} +0 -0
  170. /package/dist/{vercel-FP3C6LN6.js.map → vercel-72HFEMJ3.js.map} +0 -0
  171. /package/dist/{vite-plugin-K64KQZSU.js.map → vite-plugin-NQ6F7FGV.js.map} +0 -0
@@ -64,7 +64,19 @@ var ERROR_NAME_TO_CODE = /* @__PURE__ */ new Map([
64
64
  // RouterConventionError reaches the wire only during dev-error overlay;
65
65
  // INTERNAL_SERVER_ERROR is appropriate, but we add a HintExt-shaped ext
66
66
  // with the migration guidance for the devtools display.
67
- ["RouterConventionError", "INTERNAL_SERVER_ERROR"]
67
+ ["RouterConventionError", "INTERNAL_SERVER_ERROR"],
68
+ // M80 — the agent errors, which this table contained NONE of.
69
+ //
70
+ // The consequence was concrete: a `GuardrailViolationError` — thrown when a prompt-injection or
71
+ // PII guard BLOCKS — crossed as HTTP 500, indistinguishable from a real server failure. Retry
72
+ // middleware then re-submitted the very input the guard had just rejected.
73
+ //
74
+ // The status codes say what actually happened: the request was refused (400), the caller has
75
+ // spent its budget (429), or a human must approve before this proceeds (403). None of the three
76
+ // is "the server broke", and none should be retried by a generic 5xx policy.
77
+ ["GuardrailViolationError", "BAD_REQUEST"],
78
+ ["CostBudgetExceededError", "TOO_MANY_REQUESTS"],
79
+ ["InProcessApprovalRequiredError", "FORBIDDEN"]
68
80
  ]);
69
81
  var META_EXTRACTORS = /* @__PURE__ */ new Map([
70
82
  [
@@ -87,6 +99,20 @@ var META_EXTRACTORS = /* @__PURE__ */ new Map([
87
99
  migrationUrl: e.migrationUrl
88
100
  };
89
101
  }
102
+ ],
103
+ [
104
+ // M80 — so telemetry can count blocks PER GUARD without parsing the message. A count derived
105
+ // from message text breaks the first time somebody improves the wording, and the improvement
106
+ // looks harmless right up until the dashboard goes flat.
107
+ //
108
+ // Read from the class's own public fields rather than the SDK's `metadata`: that type is
109
+ // provider-transport shaped (`provider`, `endpoint`, `statusCode`, `retryAfter`), and an
110
+ // agent-domain fact does not belong in it.
111
+ "GuardrailViolationError",
112
+ (err) => {
113
+ const e = err;
114
+ return { guardName: e.guardName, phase: e.phase };
115
+ }
90
116
  ]
91
117
  ]);
92
118
  var EXT_BUILDERS = /* @__PURE__ */ new Map([
@@ -132,4 +158,4 @@ export {
132
158
  TheoError,
133
159
  serverErrorToEnvelope
134
160
  };
135
- //# sourceMappingURL=chunk-HGZL5EOI.js.map
161
+ //# sourceMappingURL=chunk-VQIUTCK2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/contracts/theo-error.ts","../src/core/contracts/server-error-to-envelope.ts"],"sourcesContent":["/**\n * `TheoError` — envelope-emitting `Error` subclass per plan\n * g5-error-envelope-cross-layer v1.0 § Phase 1 / T1.2.\n *\n * Mirrors trpc's TRPCError ergonomic pattern (reference:\n * trpc/packages/server/src/unstable-core-do-not-import/error/TRPCError.ts:65-87)\n * adapted for theokit's hybrid envelope model (blueprint Form 4).\n *\n * Per ADR D5: `meta.stack` is auto-stripped in non-dev builds when serialized\n * via `toJSON()` — defense against accidental stack leak to clients (encore\n * `json:\"-\"` analog).\n *\n * Lives in `core/contracts/` per architecture.md v3 invariant #3.\n */\n\nimport type { TheoErrorCode, TheoErrorEnvelope } from './error-envelope.js'\n\n/**\n * Constructor options. `code` and `message` are required; `cause` follows TC39\n * proposal-error-cause; `meta` and `ext` are opt-in per blueprint ADR D2.\n */\nexport interface TheoErrorOptions<TExt = unknown> {\n readonly code: TheoErrorCode\n readonly message: string\n readonly cause?: unknown\n readonly meta?: Record<string, unknown>\n readonly ext?: TExt\n}\n\n/**\n * `TheoError` — envelope-emitting Error subclass. Use this anywhere in\n * `theokit/server`, route handlers, or middleware to emit a typed,\n * cross-layer-compatible error.\n *\n * Mirrors TRPCError pattern: `code` is required, `message` defaults to\n * code if omitted, `cause` chain is preserved via TC39 proposal-error-cause.\n */\nexport class TheoError<TExt = unknown> extends Error {\n override readonly name = 'TheoError'\n readonly code: TheoErrorCode\n readonly meta?: Record<string, unknown>\n readonly ext?: TExt\n\n constructor(opts: TheoErrorOptions<TExt>) {\n super(opts.message, opts.cause !== undefined ? { cause: opts.cause } : undefined)\n this.code = opts.code\n this.meta = opts.meta\n this.ext = opts.ext\n }\n\n /**\n * The canonical envelope view of this error. Use when crossing the wire\n * boundary or feeding telemetry — exposes the shape consumers can rely on\n * without depending on the class identity.\n */\n get envelope(): TheoErrorEnvelope<TExt> {\n return {\n code: this.code,\n message: this.message,\n cause: (this as Error & { cause?: unknown }).cause,\n meta: this.meta,\n ext: this.ext,\n }\n }\n\n /**\n * JSON serialization — emits envelope shape only (no name/stack class\n * internals). Per ADR D5, `meta.stack` is auto-stripped in non-dev to\n * prevent accidental leak; other meta keys are preserved.\n */\n toJSON(): TheoErrorEnvelope<TExt> {\n const meta = this.meta ? sanitizeMeta(this.meta) : undefined\n return {\n code: this.code,\n message: this.message,\n cause: (this as Error & { cause?: unknown }).cause,\n meta,\n ext: this.ext,\n }\n }\n}\n\n/**\n * Strip server-only sensitive meta keys in non-dev builds. Per ADR D5,\n * `stack` is the canonical leak vector (trpc accidentally exposes it via\n * `config.isDev` even today — references/trpc getErrorShape.ts:29-31).\n * Default to safe-by-default; preserve in dev only.\n */\nfunction sanitizeMeta(meta: Record<string, unknown>): Record<string, unknown> | undefined {\n // Treat anything other than NODE_ENV === 'development' as production-safe\n // (CI, staging, production all strip). Matches the security posture in\n // blueprint EC-5 (default STRICT).\n if (process.env.NODE_ENV === 'development') {\n return meta\n }\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(meta)) {\n if (k === 'stack') continue\n out[k] = v\n }\n return out\n}\n\n/**\n * Coerce any unknown value into a TheoError envelope.\n *\n * - If value is already a TheoError, returns it unchanged (no double-wrap).\n * - If value is a plain Error, wraps it as `INTERNAL_SERVER_ERROR` with\n * `cause` chain preserving the original.\n * - Other values (string, undefined, object) are coerced safely with a\n * meaningful message.\n *\n * Use at framework boundaries (route handler catch-all, middleware catch,\n * SDK egress) to ensure every error crossing the wire carries an envelope.\n */\n/**\n * `NotFoundError` — typed 404. A `TheoError` with code `NOT_FOUND`, so it\n * carries a stable `code` (not a bare status literal) and maps to HTTP 404 via\n * `envelopeCodeToStatus`. Throw it from a `defineRoute` handler for ergonomic\n * 404s (M7-1).\n */\nexport class NotFoundError extends TheoError {\n constructor(message = 'Not Found', meta?: Record<string, unknown>) {\n super({ code: 'NOT_FOUND', message, ...(meta !== undefined ? { meta } : {}) })\n }\n}\n\nexport function fromUnknown(value: unknown): TheoError {\n if (value instanceof TheoError) return value\n if (value instanceof Error) {\n return new TheoError({\n code: 'INTERNAL_SERVER_ERROR',\n message: value.message,\n cause: value,\n })\n }\n if (typeof value === 'string') {\n return new TheoError({ code: 'INTERNAL_SERVER_ERROR', message: value })\n }\n if (value === undefined || value === null) {\n return new TheoError({ code: 'INTERNAL_SERVER_ERROR', message: 'Unknown error' })\n }\n // Object / number / boolean / etc. — best-effort stringify\n return new TheoError({\n code: 'INTERNAL_SERVER_ERROR',\n message: `Non-Error value thrown: ${safeStringify(value)}`,\n cause: value,\n })\n}\n\n/**\n * Best-effort stringify of an unknown value for error message context.\n * JSON.stringify first (preserves shape for diagnostics); on cycle/BigInt/symbol\n * failure, signal explicitly instead of falling back to `[object Object]`.\n */\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (typeof value === 'bigint') return `${value.toString()}n`\n if (typeof value === 'symbol') return value.toString()\n try {\n return JSON.stringify(value)\n } catch {\n return '[unstringifiable value]'\n }\n}\n","/**\n * G5 T2.5 — server-side boundary translation per blueprint ADR D3.\n *\n * Translates ad-hoc Error class instances (FileTooLargeError,\n * AuthRequiredError, RouterConventionError, etc.) into the canonical\n * `TheoErrorEnvelope` shape at the wire boundary. This is the SINGLE\n * boundary translation point — class identities stay in place inside the\n * codebase (no invasive call-site rewrites), but the envelope is what\n * crosses to clients.\n *\n * Pure; no I/O. Lives in `core/contracts/` per architecture.md v3\n * invariant #3 (canonical home for shared client↔server types). This file\n * is the EXCEPTION-of-an-exception: it intentionally inspects Error names\n * by string instead of `instanceof` to avoid `core/contracts/` taking a\n * dependency on `server/`. The mapping table is small and grep-discoverable.\n */\n\nimport type { TheoErrorCode, TheoErrorEnvelope } from './error-envelope.js'\nimport { TheoError } from './theo-error.js'\n\n/**\n * Mapping from ad-hoc Error class name to envelope code. Add entries here\n * when a new ad-hoc Error is introduced anywhere in `theokit/server/`.\n * Build-time errors (Duplicate*, ActionScanError, InvalidPluginShapeError)\n * are NOT in this table by design — they never cross the wire boundary,\n * so their canonical shape is `INTERNAL_SERVER_ERROR` via the default branch.\n */\nconst ERROR_NAME_TO_CODE: ReadonlyMap<string, TheoErrorCode> = new Map<string, TheoErrorCode>([\n ['AuthRequiredError', 'UNAUTHORIZED'],\n ['FileTooLargeError', 'PAYLOAD_TOO_LARGE'],\n ['RequestBodyTooLargeError', 'PAYLOAD_TOO_LARGE'],\n ['BodyTooLargeError', 'PAYLOAD_TOO_LARGE'],\n // RouterConventionError reaches the wire only during dev-error overlay;\n // INTERNAL_SERVER_ERROR is appropriate, but we add a HintExt-shaped ext\n // with the migration guidance for the devtools display.\n ['RouterConventionError', 'INTERNAL_SERVER_ERROR'],\n\n // M80 — the agent errors, which this table contained NONE of.\n //\n // The consequence was concrete: a `GuardrailViolationError` — thrown when a prompt-injection or\n // PII guard BLOCKS — crossed as HTTP 500, indistinguishable from a real server failure. Retry\n // middleware then re-submitted the very input the guard had just rejected.\n //\n // The status codes say what actually happened: the request was refused (400), the caller has\n // spent its budget (429), or a human must approve before this proceeds (403). None of the three\n // is \"the server broke\", and none should be retried by a generic 5xx policy.\n ['GuardrailViolationError', 'BAD_REQUEST'],\n ['CostBudgetExceededError', 'TOO_MANY_REQUESTS'],\n ['InProcessApprovalRequiredError', 'FORBIDDEN'],\n])\n\ntype MetaExtractor = (err: Error) => Record<string, unknown> | null\n\n/**\n * Class-specific metadata extractors. Each function receives the raw Error\n * and returns an object merged into envelope.meta (excluding name/message\n * which are reserved).\n */\nconst META_EXTRACTORS: ReadonlyMap<string, MetaExtractor> = new Map<string, MetaExtractor>([\n [\n 'FileTooLargeError',\n (err) => {\n const e = err as Error & { truncatedFilenames?: string[]; maxFileSize?: number }\n return {\n truncatedFilenames: e.truncatedFilenames ?? [],\n maxFileSize: e.maxFileSize,\n }\n },\n ],\n [\n 'RouterConventionError',\n (err) => {\n const e = err as Error & { file?: string; suggestion?: string; migrationUrl?: string }\n return {\n file: e.file,\n suggestion: e.suggestion,\n migrationUrl: e.migrationUrl,\n }\n },\n ],\n [\n // M80 — so telemetry can count blocks PER GUARD without parsing the message. A count derived\n // from message text breaks the first time somebody improves the wording, and the improvement\n // looks harmless right up until the dashboard goes flat.\n //\n // Read from the class's own public fields rather than the SDK's `metadata`: that type is\n // provider-transport shaped (`provider`, `endpoint`, `statusCode`, `retryAfter`), and an\n // agent-domain fact does not belong in it.\n 'GuardrailViolationError',\n (err) => {\n const e = err as Error & { guardName?: string; phase?: string }\n return { guardName: e.guardName, phase: e.phase }\n },\n ],\n])\n\ntype ExtBuilder = (err: Error) => unknown\n\n/**\n * Class-specific ext (extension slot) builders. RouterConventionError ships a\n * HintExt-shaped `{ hint }` so devtools / dev overlay can render the actionable\n * migration tip directly.\n */\nconst EXT_BUILDERS: ReadonlyMap<string, ExtBuilder> = new Map<string, ExtBuilder>([\n [\n 'RouterConventionError',\n () => ({\n hint: 'Run `theokit migrate router` to convert dotted-basename routes to directory-nested form.',\n }),\n ],\n])\n\n/**\n * Translate any server-side Error instance into a canonical envelope.\n *\n * Pass-through behavior:\n * - `TheoError` instances return their `.envelope` unchanged.\n * - Plain `Error` with unknown name → `INTERNAL_SERVER_ERROR`.\n * - Non-Error values → wrapped via `TheoError.fromUnknown` semantics.\n *\n * Meta carries the source class `name` plus class-specific fields when an\n * extractor is registered. This keeps wire-side telemetry useful without\n * leaking implementation details.\n */\nexport function serverErrorToEnvelope(value: unknown): TheoErrorEnvelope {\n if (value instanceof TheoError) {\n return value.envelope\n }\n if (!(value instanceof Error)) {\n return {\n code: 'INTERNAL_SERVER_ERROR',\n message: typeof value === 'string' ? value : 'Unknown error',\n }\n }\n const name = value.name\n const code = ERROR_NAME_TO_CODE.get(name) ?? 'INTERNAL_SERVER_ERROR'\n const extractor = META_EXTRACTORS.get(name)\n const extra = extractor ? extractor(value) : null\n const meta: Record<string, unknown> = { name }\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n if (v !== undefined) meta[k] = v\n }\n }\n const extBuilder = EXT_BUILDERS.get(name)\n const ext = extBuilder ? extBuilder(value) : undefined\n return {\n code,\n message: value.message,\n cause: (value as Error & { cause?: unknown }).cause,\n meta,\n ext,\n }\n}\n"],"mappings":";;;;AAqCO,IAAM,YAAN,cAAwC,MAAM;AAAA,EACjC,OAAO;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAA8B;AACxC,UAAM,KAAK,SAAS,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,MAAS;AAChF,SAAK,OAAO,KAAK;AACjB,SAAK,OAAO,KAAK;AACjB,SAAK,MAAM,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAoC;AACtC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAQ,KAAqC;AAAA,MAC7C,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAkC;AAChC,UAAM,OAAO,KAAK,OAAO,aAAa,KAAK,IAAI,IAAI;AACnD,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAQ,KAAqC;AAAA,MAC7C;AAAA,MACA,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACF;AAQA,SAAS,aAAa,MAAoE;AAIxF,MAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,WAAO;AAAA,EACT;AACA,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,QAAI,MAAM,QAAS;AACnB,QAAI,CAAC,IAAI;AAAA,EACX;AACA,SAAO;AACT;;;AC1EA,IAAM,qBAAyD,oBAAI,IAA2B;AAAA,EAC5F,CAAC,qBAAqB,cAAc;AAAA,EACpC,CAAC,qBAAqB,mBAAmB;AAAA,EACzC,CAAC,4BAA4B,mBAAmB;AAAA,EAChD,CAAC,qBAAqB,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAIzC,CAAC,yBAAyB,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWjD,CAAC,2BAA2B,aAAa;AAAA,EACzC,CAAC,2BAA2B,mBAAmB;AAAA,EAC/C,CAAC,kCAAkC,WAAW;AAChD,CAAC;AASD,IAAM,kBAAsD,oBAAI,IAA2B;AAAA,EACzF;AAAA,IACE;AAAA,IACA,CAAC,QAAQ;AACP,YAAM,IAAI;AACV,aAAO;AAAA,QACL,oBAAoB,EAAE,sBAAsB,CAAC;AAAA,QAC7C,aAAa,EAAE;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA,CAAC,QAAQ;AACP,YAAM,IAAI;AACV,aAAO;AAAA,QACL,MAAM,EAAE;AAAA,QACR,YAAY,EAAE;AAAA,QACd,cAAc,EAAE;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQE;AAAA,IACA,CAAC,QAAQ;AACP,YAAM,IAAI;AACV,aAAO,EAAE,WAAW,EAAE,WAAW,OAAO,EAAE,MAAM;AAAA,IAClD;AAAA,EACF;AACF,CAAC;AASD,IAAM,eAAgD,oBAAI,IAAwB;AAAA,EAChF;AAAA,IACE;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AACF,CAAC;AAcM,SAAS,sBAAsB,OAAmC;AACvE,MAAI,iBAAiB,WAAW;AAC9B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC/C;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACnB,QAAM,OAAO,mBAAmB,IAAI,IAAI,KAAK;AAC7C,QAAM,YAAY,gBAAgB,IAAI,IAAI;AAC1C,QAAM,QAAQ,YAAY,UAAU,KAAK,IAAI;AAC7C,QAAM,OAAgC,EAAE,KAAK;AAC7C,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,UAAI,MAAM,OAAW,MAAK,CAAC,IAAI;AAAA,IACjC;AAAA,EACF;AACA,QAAM,aAAa,aAAa,IAAI,IAAI;AACxC,QAAM,MAAM,aAAa,WAAW,KAAK,IAAI;AAC7C,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AAAA,IACf,OAAQ,MAAsC;AAAA,IAC9C;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -2,7 +2,7 @@
2
2
  import "tsx/esm";
3
3
  import {
4
4
  getApprovalRegistry
5
- } from "./chunk-TDNNBLGW.js";
5
+ } from "./chunk-6GGWS7J3.js";
6
6
  import {
7
7
  dispatchCsrfWarn,
8
8
  enforceCsrf,
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  TheoError,
18
18
  serverErrorToEnvelope
19
- } from "./chunk-HGZL5EOI.js";
19
+ } from "./chunk-VQIUTCK2.js";
20
20
 
21
21
  // src/core/contracts/auth-error-guard.ts
22
22
  function isAuthRequiredError(err) {
@@ -1546,7 +1546,7 @@ function createRateLimiter(config, opts = {}) {
1546
1546
  return resultFromState(state, config);
1547
1547
  }
1548
1548
  throw new Error(
1549
- "createRateLimiter: async RateLimitStore implementations are not supported by this sync fa\xE7ade. Use the InMemoryStore default or build a custom middleware around the async store directly."
1549
+ "createRateLimiter: async RateLimitStore implementations are not supported by this sync facade. Use the InMemoryStore default or build a custom middleware around the async store directly."
1550
1550
  );
1551
1551
  };
1552
1552
  }
@@ -1922,4 +1922,4 @@ export {
1922
1922
  applySecurityHeaders,
1923
1923
  generateNonce
1924
1924
  };
1925
- //# sourceMappingURL=chunk-6VDYQ4I6.js.map
1925
+ //# sourceMappingURL=chunk-VTJMND23.js.map