stitchkit 0.13.0 → 0.14.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.
package/dist/cli.js CHANGED
@@ -4,9 +4,9 @@ import {
4
4
  emitResult,
5
5
  parseCliArgs,
6
6
  pollUntilDone
7
- } from "./index-91b3n95r.js";
7
+ } from "./index-2adzh3ct.js";
8
8
  import"./index-0ed3bx43.js";
9
- import"./index-fq89tdex.js";
9
+ import"./index-ktn76xz0.js";
10
10
  import"./index-tm7dqzxc.js";
11
11
  export {
12
12
  pollUntilDone,
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/contract/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,2CAA2C;QAC3C,IAAI,EAAE,MAAM,CAAC;QACb,8BAA8B;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gCAAgC;QAChC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,0BAA0B;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM;aAEZ,MAAM,EAAE,MAAM;aACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;aACjC,IAAI,CAAC,EAAE,MAAM;gBAJb,IAAI,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,MAAM,EACA,MAAM,GAAE,MAAY,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA,EACjC,IAAI,CAAC,EAAE,MAAM,YAAA;IAM/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,QAAQ;IAIxC,MAAM,IAAI,aAAa;CAUxB;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,OAAO,SAAc,GAAG,KAAK,CAErD;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAEpF;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,OAAO,SAAiB,GAAG,KAAK,CAE5D;AAED,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,OAAO,SAAc,GAAG,KAAK,CAEtD;AAED,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,OAAO,SAAa,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAEvF;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,OAAO,SAAsB,GAAG,KAAK,CAEhE;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;CAUE,CAAC;AAEnC,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAE/D,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,eAAe,CAEvE;AAED,+FAA+F;AAC/F,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,KAAK,CAOP"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/contract/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,2CAA2C;QAC3C,IAAI,EAAE,MAAM,CAAC;QACb,8BAA8B;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gCAAgC;QAChC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,0BAA0B;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAcD;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM;aAEZ,MAAM,EAAE,MAAM;aACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;aACjC,IAAI,CAAC,EAAE,MAAM;gBAJb,IAAI,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,MAAM,EACA,MAAM,GAAE,MAAY,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA,EACjC,IAAI,CAAC,EAAE,MAAM,YAAA;IAU/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,QAAQ;IAIxC,MAAM,IAAI,aAAa;CAUxB;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,OAAO,SAAc,GAAG,KAAK,CAErD;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAEpF;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,OAAO,SAAiB,GAAG,KAAK,CAE5D;AAED,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,OAAO,SAAc,GAAG,KAAK,CAEtD;AAED,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,OAAO,SAAa,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAEvF;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,OAAO,SAAsB,GAAG,KAAK,CAEhE;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;CAUE,CAAC;AAEnC,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAE/D,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,eAAe,CAEvE;AAED,+FAA+F;AAC/F,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,KAAK,CAOP"}
@@ -14,7 +14,7 @@ import {
14
14
  paginatedSchema,
15
15
  rateLimited,
16
16
  unauthorized
17
- } from "../index-eq29zkrx.js";
17
+ } from "../index-yzac2zbh.js";
18
18
  export {
19
19
  unauthorized,
20
20
  rateLimited,
@@ -7,7 +7,7 @@ import {
7
7
  isWithinDir,
8
8
  normalizeError,
9
9
  validateHandlerOutput
10
- } from "./index-fq89tdex.js";
10
+ } from "./index-ktn76xz0.js";
11
11
  import {
12
12
  isRecord,
13
13
  isUnsafeKey,
@@ -5,7 +5,7 @@ import {
5
5
  isWithinDir,
6
6
  normalizeError,
7
7
  validateHandlerOutput
8
- } from "./index-fq89tdex.js";
8
+ } from "./index-ktn76xz0.js";
9
9
  import {
10
10
  extractIp,
11
11
  getClientInfo,
@@ -1,4 +1,6 @@
1
1
  // src/contract/errors.ts
2
+ var APP_ERROR_BRAND = Symbol.for("stitchkit.AppError");
3
+
2
4
  class AppError extends Error {
3
5
  code;
4
6
  status;
@@ -11,9 +13,10 @@ class AppError extends Error {
11
13
  this.details = details;
12
14
  this.hint = hint;
13
15
  this.name = "AppError";
16
+ Object.defineProperty(this, APP_ERROR_BRAND, { value: true });
14
17
  }
15
18
  static is(err) {
16
- return err instanceof AppError;
19
+ return typeof err === "object" && err !== null && APP_ERROR_BRAND in err;
17
20
  }
18
21
  toJSON() {
19
22
  return {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  forbidden,
3
3
  unauthorized
4
- } from "./index-fq89tdex.js";
4
+ } from "./index-ktn76xz0.js";
5
5
  import {
6
6
  isRecord,
7
7
  isUnsafeKey,
@@ -27,6 +27,8 @@ function defineContract(meta, endpoints) {
27
27
  return { meta, endpoints };
28
28
  }
29
29
  // src/contract/errors.ts
30
+ var APP_ERROR_BRAND = Symbol.for("stitchkit.AppError");
31
+
30
32
  class AppError extends Error {
31
33
  code;
32
34
  status;
@@ -39,9 +41,10 @@ class AppError extends Error {
39
41
  this.details = details;
40
42
  this.hint = hint;
41
43
  this.name = "AppError";
44
+ Object.defineProperty(this, APP_ERROR_BRAND, { value: true });
42
45
  }
43
46
  static is(err) {
44
- return err instanceof AppError;
47
+ return typeof err === "object" && err !== null && APP_ERROR_BRAND in err;
45
48
  }
46
49
  toJSON() {
47
50
  return {
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  paginatedSchema,
15
15
  rateLimited,
16
16
  unauthorized
17
- } from "./index-eq29zkrx.js";
17
+ } from "./index-yzac2zbh.js";
18
18
 
19
19
  // src/internal/http-input.ts
20
20
  function inputIsQuery(method) {
package/dist/node.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  createImplement,
4
4
  createSocketIOServer,
5
5
  implement
6
- } from "./index-kb7wxdq0.js";
6
+ } from "./index-6k6y7wat.js";
7
7
  import {
8
8
  AppError,
9
9
  appError,
@@ -13,7 +13,7 @@ import {
13
13
  notFound,
14
14
  rateLimited,
15
15
  unauthorized
16
- } from "./index-fq89tdex.js";
16
+ } from "./index-ktn76xz0.js";
17
17
  import"./index-fwqnkc90.js";
18
18
  import"./index-tm7dqzxc.js";
19
19
  // src/server/node.ts
@@ -12,7 +12,7 @@ import {
12
12
  socketIoLane,
13
13
  staticRoute,
14
14
  webSocketLane
15
- } from "../index-kb7wxdq0.js";
15
+ } from "../index-6k6y7wat.js";
16
16
  import {
17
17
  createAuthHook,
18
18
  createBearerResolver,
@@ -25,7 +25,7 @@ import {
25
25
  signJwt,
26
26
  verifyJwt,
27
27
  verifyPkce
28
- } from "../index-msmy8ydw.js";
28
+ } from "../index-yv93m4yr.js";
29
29
  import {
30
30
  jsonSchemaFields,
31
31
  toJsonSchema
@@ -42,7 +42,7 @@ import {
42
42
  notFound,
43
43
  rateLimited,
44
44
  unauthorized
45
- } from "../index-fq89tdex.js";
45
+ } from "../index-ktn76xz0.js";
46
46
  import {
47
47
  extractIp,
48
48
  generateTraceId,
package/dist/tools.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  inputIsQuery,
3
3
  signJwt,
4
4
  verifyPkce
5
- } from "./index-msmy8ydw.js";
5
+ } from "./index-yv93m4yr.js";
6
6
  import {
7
7
  coerceJsonArgs,
8
8
  collectTools,
@@ -15,14 +15,14 @@ import {
15
15
  pollUntil,
16
16
  readCapped,
17
17
  toolResultFromError
18
- } from "./index-91b3n95r.js";
18
+ } from "./index-2adzh3ct.js";
19
19
  import {
20
20
  toJsonSchema
21
21
  } from "./index-0ed3bx43.js";
22
22
  import {
23
23
  AppError,
24
24
  isWithinDir
25
- } from "./index-fq89tdex.js";
25
+ } from "./index-ktn76xz0.js";
26
26
  import {
27
27
  isRecord,
28
28
  typedEntries
package/llms-full.txt CHANGED
@@ -2142,6 +2142,12 @@ if (ctx.input.title.length > 200) badRequest('Title too long', { max: 200 })
2142
2142
  Each helper has a `never` return type — TypeScript knows execution stops, so the
2143
2143
  code after it is correctly narrowed.
2144
2144
 
2145
+ You can subclass `AppError` for a domain error model (`class FeatureLocked extends
2146
+ AppError`). `AppError.is(err)` identifies any instance — a direct one, a subclass,
2147
+ even a copy from another bundle chunk or realm — by a global brand rather than
2148
+ `instanceof`, so a domain error keeps its `code` / `details` / `hint` on every
2149
+ transport (HTTP, MCP, agent). → ADR 0032.
2150
+
2145
2151
  ### The error envelope
2146
2152
 
2147
2153
  `AppError.toJSON()` renders the public envelope every transport returns:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stitchkit",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Contract-first backend framework — one defineContract() into an HTTP API, MCP tools, AI-agent tools and a typed client. Bun and Node.",
5
5
  "keywords": [
6
6
  "bun",