@nifrajs/core 2.11.0 → 2.12.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 (180) hide show
  1. package/dist/assurance.d.ts +61 -3
  2. package/dist/assurance.d.ts.map +1 -1
  3. package/dist/assurance.js +152 -5
  4. package/dist/assurance.js.map +1 -1
  5. package/dist/capabilities.d.ts +9 -1
  6. package/dist/capabilities.d.ts.map +1 -1
  7. package/dist/capabilities.js +5 -1
  8. package/dist/capabilities.js.map +1 -1
  9. package/dist/diff.d.ts +2 -1
  10. package/dist/diff.d.ts.map +1 -1
  11. package/dist/diff.js +3 -1
  12. package/dist/diff.js.map +1 -1
  13. package/dist/errors.d.ts +1 -1
  14. package/dist/errors.d.ts.map +1 -1
  15. package/dist/errors.js.map +1 -1
  16. package/dist/evidence.d.ts +89 -0
  17. package/dist/evidence.d.ts.map +1 -0
  18. package/dist/evidence.js +170 -0
  19. package/dist/evidence.js.map +1 -0
  20. package/dist/execution-policy.d.ts +23 -0
  21. package/dist/execution-policy.d.ts.map +1 -0
  22. package/dist/execution-policy.js +28 -0
  23. package/dist/execution-policy.js.map +1 -0
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/internal/route-assurance.d.ts +19 -0
  27. package/dist/internal/route-assurance.d.ts.map +1 -1
  28. package/dist/internal/route-assurance.js +38 -5
  29. package/dist/internal/route-assurance.js.map +1 -1
  30. package/dist/internal/route-execution.d.ts +18 -0
  31. package/dist/internal/route-execution.d.ts.map +1 -1
  32. package/dist/internal/route-execution.js +67 -1
  33. package/dist/internal/route-execution.js.map +1 -1
  34. package/dist/manifest.d.ts +5 -1
  35. package/dist/manifest.d.ts.map +1 -1
  36. package/dist/manifest.js +22 -4
  37. package/dist/manifest.js.map +1 -1
  38. package/dist/reflection.d.ts +5 -0
  39. package/dist/reflection.d.ts.map +1 -1
  40. package/dist/reflection.js +13 -4
  41. package/dist/reflection.js.map +1 -1
  42. package/dist/replay.d.ts +26 -0
  43. package/dist/replay.d.ts.map +1 -0
  44. package/dist/replay.js +63 -0
  45. package/dist/replay.js.map +1 -0
  46. package/dist/schema/standard.d.ts +2 -0
  47. package/dist/schema/standard.d.ts.map +1 -1
  48. package/dist/schema/standard.js +13 -0
  49. package/dist/schema/standard.js.map +1 -1
  50. package/dist/server/body.d.ts +49 -6
  51. package/dist/server/body.d.ts.map +1 -1
  52. package/dist/server/body.js +226 -8
  53. package/dist/server/body.js.map +1 -1
  54. package/dist/server/context.d.ts +20 -3
  55. package/dist/server/context.d.ts.map +1 -1
  56. package/dist/server/contract.d.ts +15 -3
  57. package/dist/server/contract.d.ts.map +1 -1
  58. package/dist/server/contract.js +22 -0
  59. package/dist/server/contract.js.map +1 -1
  60. package/dist/server/cookies.d.ts +26 -5
  61. package/dist/server/cookies.d.ts.map +1 -1
  62. package/dist/server/cookies.js +76 -9
  63. package/dist/server/cookies.js.map +1 -1
  64. package/dist/server/edge.d.ts.map +1 -1
  65. package/dist/server/edge.js +11 -0
  66. package/dist/server/edge.js.map +1 -1
  67. package/dist/server/header-case.d.ts +9 -0
  68. package/dist/server/header-case.d.ts.map +1 -0
  69. package/dist/server/header-case.js +54 -0
  70. package/dist/server/header-case.js.map +1 -0
  71. package/dist/server/headers.d.ts +8 -0
  72. package/dist/server/headers.d.ts.map +1 -0
  73. package/dist/server/headers.js +13 -0
  74. package/dist/server/headers.js.map +1 -0
  75. package/dist/server/node-outcome-hook.d.ts.map +1 -1
  76. package/dist/server/node-outcome-hook.js +7 -11
  77. package/dist/server/node-outcome-hook.js.map +1 -1
  78. package/dist/server/node-outcome.d.ts +8 -1
  79. package/dist/server/node-outcome.d.ts.map +1 -1
  80. package/dist/server/node-outcome.js +10 -3
  81. package/dist/server/node-outcome.js.map +1 -1
  82. package/dist/server/plugin.d.ts +66 -7
  83. package/dist/server/plugin.d.ts.map +1 -1
  84. package/dist/server/plugin.js +14 -10
  85. package/dist/server/plugin.js.map +1 -1
  86. package/dist/server/proto-guard.d.ts +30 -0
  87. package/dist/server/proto-guard.d.ts.map +1 -0
  88. package/dist/server/proto-guard.js +116 -0
  89. package/dist/server/proto-guard.js.map +1 -0
  90. package/dist/server/registry.d.ts +6 -2
  91. package/dist/server/registry.d.ts.map +1 -1
  92. package/dist/server/request-context.d.ts +24 -6
  93. package/dist/server/request-context.d.ts.map +1 -1
  94. package/dist/server/request-context.js +157 -30
  95. package/dist/server/request-context.js.map +1 -1
  96. package/dist/server/respond.d.ts +2 -2
  97. package/dist/server/respond.d.ts.map +1 -1
  98. package/dist/server/respond.js +34 -8
  99. package/dist/server/respond.js.map +1 -1
  100. package/dist/server/response-contract-lane.d.ts +1 -1
  101. package/dist/server/response-contract-lane.d.ts.map +1 -1
  102. package/dist/server/response-contract-lane.js +45 -13
  103. package/dist/server/response-contract-lane.js.map +1 -1
  104. package/dist/server/response-hooks.d.ts +10 -0
  105. package/dist/server/response-hooks.d.ts.map +1 -0
  106. package/dist/server/response-hooks.js +52 -0
  107. package/dist/server/response-hooks.js.map +1 -0
  108. package/dist/server/runtime-core.d.ts +12 -0
  109. package/dist/server/runtime-core.d.ts.map +1 -1
  110. package/dist/server/runtime-core.js +8 -0
  111. package/dist/server/runtime-core.js.map +1 -1
  112. package/dist/server/server-types.d.ts +60 -6
  113. package/dist/server/server-types.d.ts.map +1 -1
  114. package/dist/server/server.d.ts +80 -23
  115. package/dist/server/server.d.ts.map +1 -1
  116. package/dist/server/server.js +424 -213
  117. package/dist/server/server.js.map +1 -1
  118. package/dist/server/static-headers.d.ts +14 -3
  119. package/dist/server/static-headers.d.ts.map +1 -1
  120. package/dist/server/static-headers.js +28 -6
  121. package/dist/server/static-headers.js.map +1 -1
  122. package/dist/server/transport-lane.d.ts +8 -0
  123. package/dist/server/transport-lane.d.ts.map +1 -1
  124. package/dist/server/transport-lane.js +12 -8
  125. package/dist/server/transport-lane.js.map +1 -1
  126. package/dist/server/websocket.d.ts +3 -0
  127. package/dist/server/websocket.d.ts.map +1 -1
  128. package/dist/server/websocket.js +14 -0
  129. package/dist/server/websocket.js.map +1 -1
  130. package/dist/server.d.ts +2 -2
  131. package/dist/server.d.ts.map +1 -1
  132. package/dist/server.js +2 -2
  133. package/dist/server.js.map +1 -1
  134. package/dist/tool-catalog.d.ts +21 -0
  135. package/dist/tool-catalog.d.ts.map +1 -0
  136. package/dist/tool-catalog.js +16 -0
  137. package/dist/tool-catalog.js.map +1 -0
  138. package/dist/tool-contract.d.ts +238 -0
  139. package/dist/tool-contract.d.ts.map +1 -0
  140. package/dist/tool-contract.js +569 -0
  141. package/dist/tool-contract.js.map +1 -0
  142. package/package.json +26 -1
  143. package/src/assurance.ts +236 -6
  144. package/src/capabilities.ts +14 -1
  145. package/src/diff.ts +5 -2
  146. package/src/errors.ts +1 -0
  147. package/src/evidence.ts +319 -0
  148. package/src/execution-policy.ts +57 -0
  149. package/src/index.ts +1 -1
  150. package/src/internal/route-assurance.ts +67 -4
  151. package/src/internal/route-execution.ts +276 -1
  152. package/src/manifest.ts +27 -5
  153. package/src/reflection.ts +24 -4
  154. package/src/replay.ts +96 -0
  155. package/src/schema/standard.ts +16 -0
  156. package/src/server/body.ts +275 -7
  157. package/src/server/context.ts +23 -3
  158. package/src/server/contract.ts +43 -3
  159. package/src/server/cookies.ts +80 -10
  160. package/src/server/edge.ts +10 -0
  161. package/src/server/header-case.ts +54 -0
  162. package/src/server/headers.ts +11 -0
  163. package/src/server/node-outcome-hook.ts +6 -11
  164. package/src/server/node-outcome.ts +10 -2
  165. package/src/server/plugin.ts +87 -8
  166. package/src/server/proto-guard.ts +118 -0
  167. package/src/server/registry.ts +6 -2
  168. package/src/server/request-context.ts +242 -26
  169. package/src/server/respond.ts +35 -4
  170. package/src/server/response-contract-lane.ts +6 -17
  171. package/src/server/response-hooks.ts +51 -0
  172. package/src/server/runtime-core.ts +14 -0
  173. package/src/server/server-types.ts +66 -6
  174. package/src/server/server.ts +667 -287
  175. package/src/server/static-headers.ts +27 -3
  176. package/src/server/transport-lane.ts +19 -8
  177. package/src/server/websocket.ts +18 -2
  178. package/src/server.ts +7 -0
  179. package/src/tool-catalog.ts +40 -0
  180. package/src/tool-contract.ts +896 -0
@@ -40,15 +40,45 @@ export interface AdmissionController {
40
40
 
41
41
  export interface ServerOptions {
42
42
  /**
43
- * Max request body size (bytes), enforced **only when a route declares a body schema** - the cap
44
- * lives in the schema-validated read path. Default 1_000_000.
43
+ * Max request body size (bytes), the default transport cap for every route. Default 1_000_000.
44
+ * A route can choose a finite `schema.bodyLimit` of its own; an explicit `'unlimited'` route
45
+ * requires `schema.bodyLimitReason` and is intended only for a separately bounded streaming or
46
+ * upload integration.
45
47
  *
46
- * A route WITHOUT a body schema (raw body, file upload, BYO-validation) that reads `c.req` directly
47
- * is not auto-bounded - use **`c.boundedBody(maxBytes?)`** / **`c.boundedJson(maxBytes?)`**, which
48
- * apply this same cap (override per route by passing `maxBytes` - larger for an upload endpoint,
49
- * smaller to tighten one).
48
+ * Framework readers (the body-schema lane, `c.boundedJson`) enforce the cap when they read. A
49
+ * route WITHOUT a body schema (raw body, file upload, BYO-validation) is covered too: direct
50
+ * `c.req` reads (`json()`, `arrayBuffer()`, the raw `body` stream, ...) are capped in place -
51
+ * lazily, nothing is buffered until code actually reads - and answer 413 past the limit.
52
+ * `c.boundedBody(n)` states its own explicit per-read limit, above or below the route's cap.
50
53
  */
51
54
  readonly maxBodyBytes?: number
55
+ /**
56
+ * Prototype-poisoning policy for JSON bodies (the schema path and `c.boundedJson`). An own
57
+ * `__proto__` key, or a `constructor` carrying a `prototype`, is the payload shape that turns a
58
+ * later innocent merge/assign into prototype pollution. `"reject"` (default) answers the same
59
+ * flat 400 as malformed JSON; `"strip"` removes the offending keys and continues; `"ignore"`
60
+ * parses as-is (only for routes that never merge body input into other objects). Clean payloads
61
+ * pay a substring pre-scan only - the deep walk runs solely on suspect text.
62
+ */
63
+ readonly protoPoisoning?: "reject" | "strip" | "ignore"
64
+ /**
65
+ * Declare that every `Request` reaching `app.fetch` was framed by a runtime HTTP parser, so its
66
+ * `Content-Length` is an exact transport boundary rather than a hint. Set this ONLY when the
67
+ * runtime's own request object is handed through untouched with no adapter in between to mark it -
68
+ * a bare `export default app` on an edge runtime. Every supported ingress already marks itself:
69
+ * `listen()` on Bun, `toFetchHandler(app)` on Workers/edge, `@nifrajs/deno`, and `@nifrajs/node`
70
+ * (which reads exact bytes and never needs the mark). Reach for this option only for an ingress
71
+ * nifra does not ship an adapter for.
72
+ *
73
+ * Left off (default), the JSON body lane copies the body out and enforces the cap on DELIVERED
74
+ * bytes, because an unmarked request may have been rebuilt by an adapter that kept a caller's
75
+ * `content-length` while decoding a payload of a different size. That check costs an extra pass
76
+ * over the body, which is why an edge deployment that cannot be lied to may opt out of it.
77
+ *
78
+ * Do not set this on an app whose `fetch` is also called with `Request`s assembled from
79
+ * untrusted input.
80
+ */
81
+ readonly trustBodyFraming?: boolean
52
82
  /** Max inbound WebSocket message size (bytes) when `listen()`ing on Bun - frames over this are rejected
53
83
  * by the runtime before reaching your handler (so a huge frame can't be JSON-parsed into memory).
54
84
  * Default: `maxBodyBytes` (1 MB). */
@@ -91,6 +121,21 @@ export interface ServerOptions {
91
121
  readonly onCapabilityUse?: (event: CapabilityUseEvent) => void
92
122
  /** Structured logger for framework events (redacts secrets). Default: JSON to stderr. */
93
123
  readonly logger?: Logger
124
+ /**
125
+ * How much of an unhandled error reaches the log for a 500. Never reaches the client either way -
126
+ * the response is always a bare `internal_error`.
127
+ *
128
+ * - `"full"` (default) - `name`, the error's own text as `detail`, and `stack`.
129
+ * - `"message"` - `name` and `detail`, no stack.
130
+ * - `"none"` - `name` only.
131
+ *
132
+ * An error's text can quote the input that produced it, which is how request data ends up in a log
133
+ * sink. The framework's answer is the redacting logger rather than blanket suppression: pass
134
+ * `logger: jsonLogger({ valuePatterns: commonSecretPatterns })` to scrub tokens, JWTs, and emails
135
+ * out of `detail` and `stack` while keeping the diagnosis. Reach for `"none"` when the sink itself
136
+ * is the thing you don't trust.
137
+ */
138
+ readonly errorLogDetail?: "full" | "message" | "none"
94
139
  /**
95
140
  * App-wide fallback fired when a route **without its own `onValidationError`** fails body/query
96
141
  * validation. Same contract as the per-route hook (`(issues, ctx, kind) => Response | repaired-value |
@@ -101,6 +146,21 @@ export interface ServerOptions {
101
146
  readonly onValidationError?: RouteSchema["onValidationError"]
102
147
  }
103
148
 
149
+ /** A fetch-compatible handler used by {@link Server.mountFetch}. */
150
+ export type FetchHandler<Env = unknown> = (
151
+ request: Request,
152
+ platform?: Platform<Env>,
153
+ ) => MaybePromise<Response>
154
+
155
+ /** Options for a legacy fetch-handler mount. */
156
+ export interface MountFetchOptions {
157
+ /** Remove the mount prefix before invoking the legacy handler. Default: false. */
158
+ readonly stripPrefix?: boolean
159
+ }
160
+
161
+ /** A callback awaited after the Bun server has drained and stopped. */
162
+ export type StopHook = () => MaybePromise<void>
163
+
104
164
  /**
105
165
  * MCP tool safety hints, surfaced in `tools/list`, that tell an agent how risky a `.tool()` call is - so it
106
166
  * can decide whether to auto-invoke or confirm first. All optional; an omitted hint means "unknown". Mirrors