stitchkit 0.90.4 → 0.90.5

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 (36) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/dist/agent-runtime-coding-tools.js +3 -3
  3. package/dist/agent-runtime-harness.js +4 -4
  4. package/dist/agent-runtime-sandbox.js +3 -3
  5. package/dist/agent-runtime.js +7 -7
  6. package/dist/cli.js +60 -17
  7. package/dist/{index-32vjke6q.js → index-1bnkzq95.js} +1 -1
  8. package/dist/{index-19ryv24q.js → index-83fafqw8.js} +3 -3
  9. package/dist/{index-y47z614h.js → index-fqg5mfk7.js} +145 -32
  10. package/dist/{index-6atvfjc1.js → index-s208wab5.js} +1 -1
  11. package/dist/{index-7t0wq6j5.js → index-tgh3ksfh.js} +5 -5
  12. package/dist/{index-kzxpsf8y.js → index-zsdgd1tz.js} +1 -1
  13. package/dist/index.js +7 -7
  14. package/dist/node.js +2 -2
  15. package/dist/observability/index.js +1 -1
  16. package/dist/remote.js +1 -1
  17. package/dist/server/index.js +6 -6
  18. package/dist/testing.js +2 -2
  19. package/dist/tool-invoker.js +5 -5
  20. package/dist/tools/cli-args.d.ts +10 -8
  21. package/dist/tools/cli-args.d.ts.map +1 -1
  22. package/dist/tools/cli-installer.d.ts +7 -2
  23. package/dist/tools/cli-installer.d.ts.map +1 -1
  24. package/dist/tools/cli-view.d.ts.map +1 -1
  25. package/dist/tools/cli.d.ts.map +1 -1
  26. package/dist/tools/connections/index.js +37 -4
  27. package/dist/tools/connections/mcp-envelope.d.ts +44 -0
  28. package/dist/tools/connections/mcp-envelope.d.ts.map +1 -0
  29. package/dist/tools/connections/mcp.d.ts.map +1 -1
  30. package/dist/tools.js +11 -11
  31. package/dist/tracking.js +1 -1
  32. package/llms-full.txt +78 -8
  33. package/package.json +1 -1
  34. package/dist/{index-8crm1srv.js → index-3yqgj323.js} +3 -3
  35. package/dist/{index-vcnfwrtr.js → index-8pjqv3zh.js} +6 -6
  36. package/dist/{index-db51n3xr.js → index-ra6txecz.js} +3 -3
@@ -6,6 +6,12 @@ import {
6
6
  withDefsDialect
7
7
  } from "../../index-fenaekmk.js";
8
8
  import"../../index-cby4ar3v.js";
9
+ import {
10
+ AppError
11
+ } from "../../index-scs3f1eg.js";
12
+ import {
13
+ safeJsonParse
14
+ } from "../../index-kzfs85xp.js";
9
15
  import {
10
16
  isRecord
11
17
  } from "../../index-77fekveh.js";
@@ -514,6 +520,34 @@ class McpHttpClient {
514
520
  }
515
521
  }
516
522
 
523
+ // src/tools/connections/mcp-envelope.ts
524
+ function unwrapMcpResult(result) {
525
+ if (!isRecord(result))
526
+ return result;
527
+ if (result.structuredContent !== undefined)
528
+ return result.structuredContent;
529
+ if (!Array.isArray(result.content))
530
+ return result;
531
+ const only = result.content.length === 1 ? result.content[0] : undefined;
532
+ if (!isRecord(only) || only.type !== "text" || typeof only.text !== "string")
533
+ return result;
534
+ try {
535
+ return safeJsonParse(only.text);
536
+ } catch {
537
+ return only.text;
538
+ }
539
+ }
540
+ var UPSTREAM_TOOL_ERROR = "UPSTREAM_TOOL_ERROR";
541
+ function mcpToolFailure(toolName, result) {
542
+ const payload = unwrapMcpResult(result);
543
+ if (isRecord(payload) && typeof payload.error === "string") {
544
+ const details = isRecord(payload.details) ? payload.details : undefined;
545
+ const message = typeof details?.message === "string" ? details.message : payload.error;
546
+ return new AppError(payload.error, message, 502, details);
547
+ }
548
+ return new AppError(UPSTREAM_TOOL_ERROR, `External MCP tool "${toolName}" returned an error`, 502, payload === undefined ? undefined : { upstream: payload });
549
+ }
550
+
517
551
  // src/tools/connections/runtime.ts
518
552
  import { z } from "zod";
519
553
  async function withConnectionToken(params, body) {
@@ -608,10 +642,9 @@ async function mountMcpConnection(connection, instanceId, onSkipped) {
608
642
  return withConnectionToken({ instanceId, provider: connection.token, client, context }, async (token) => {
609
643
  await client.initialize(token, context.signal);
610
644
  const result = await client.request("tools/call", { name, arguments: context.input }, token, context.signal);
611
- if (isRecord(result) && result.isError === true) {
612
- throw new Error(`External MCP tool "${name}" returned an error`);
613
- }
614
- return result;
645
+ if (isRecord(result) && result.isError === true)
646
+ throw mcpToolFailure(name, result);
647
+ return context.source === "cli" ? unwrapMcpResult(result) : result;
615
648
  }).finally(() => client.teardown());
616
649
  }
617
650
  });
@@ -0,0 +1,44 @@
1
+ /**
2
+ * What a discovered MCP tool's answer is, per transport.
3
+ *
4
+ * `tools/call` returns an envelope — `{ content: [...], structuredContent? }` —
5
+ * and an agent mount needs exactly that: the parts are what a model is shown.
6
+ * The CLI transport is different in kind, because the handler's value is what
7
+ * gets printed, piped and aggregated. Handed the envelope, `--count-by status`
8
+ * groups the *parts* and answers `no record carries the field "status" —
9
+ * available: text, type`, and `--json` emits the answer as a JSON string nested
10
+ * inside `content[0].text`, so every consumer unwraps before anything works.
11
+ *
12
+ * So the CLI unwraps, and only the CLI. The order is the server's own order of
13
+ * preference: `structuredContent` is the answer when the server sent one; a lone
14
+ * text part is the answer when it parses as JSON, and its text when it does not.
15
+ * Anything else — several parts, an image, audio — is passed through whole,
16
+ * because picking one part out of many would be inventing an answer.
17
+ */
18
+ import { AppError } from '../../contract/errors.js';
19
+ export declare function unwrapMcpResult(result: unknown): unknown;
20
+ /**
21
+ * The class a relayed failure carries when the server sent no structured body.
22
+ *
23
+ * Not `INTERNAL_SERVER_ERROR`: nothing of ours broke. The honest statement is
24
+ * that the call failed upstream and we cannot say more than the server did.
25
+ */
26
+ export declare const UPSTREAM_TOOL_ERROR = "UPSTREAM_TOOL_ERROR";
27
+ /**
28
+ * Turn a failed `CallToolResult` into the error the caller can act on.
29
+ *
30
+ * The line this replaces threw a one-sentence `Error` and discarded the result,
31
+ * which cost three things at once: the code (so `exitCodes` had nothing to map
32
+ * and every remote failure exited `1`), the message the operator needed, and the
33
+ * error's own class — a plain `Error` is an *unexpected* error to the runner, so
34
+ * it printed a code frame of the framework bundle before the JSON failure and
35
+ * was then scrubbed to a bare `INTERNAL_SERVER_ERROR`.
36
+ *
37
+ * A structured `{ error, details }` body is the remote contract's own refusal
38
+ * and is relayed as one. Anything else keeps the framework's sentence and
39
+ * carries what the server did send — reporting less than we have is not caution.
40
+ * The status is 502 either way: whatever the code says, the failure happened
41
+ * upstream, and a consumer re-serving it over HTTP should say so.
42
+ */
43
+ export declare function mcpToolFailure(toolName: string, result: unknown): AppError;
44
+ //# sourceMappingURL=mcp-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-envelope.d.ts","sourceRoot":"","sources":["../../../src/tools/connections/mcp-envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAaxD;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAa1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/tools/connections/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,EACL,KAAK,0BAA0B,EAIhC,MAAM,WAAW,CAAC;AAGnB,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,SAAS,CAAC;AAQlE,gEAAgE;AAChE,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,mBAAmB,EAC/B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,0BAA0B,GACpC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAgElC"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/tools/connections/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAIhF,OAAO,EACL,KAAK,0BAA0B,EAIhC,MAAM,WAAW,CAAC;AAGnB,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,SAAS,CAAC;AAQlE,gEAAgE;AAChE,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,mBAAmB,EAC/B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,0BAA0B,GACpC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAqElC"}
package/dist/tools.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  buildToolManifest,
22
22
  describeToolCatalog,
23
23
  mountAgent
24
- } from "./index-19ryv24q.js";
24
+ } from "./index-83fafqw8.js";
25
25
  import"./index-7rkhw9ec.js";
26
26
  import {
27
27
  argumentsDigest
@@ -37,7 +37,7 @@ import {
37
37
  } from "./index-4fpa9dy2.js";
38
38
  import {
39
39
  createToolInvoker
40
- } from "./index-7t0wq6j5.js";
40
+ } from "./index-tgh3ksfh.js";
41
41
  import {
42
42
  WaitTimeoutError,
43
43
  createCli,
@@ -46,22 +46,22 @@ import {
46
46
  fetchPinnedDocument,
47
47
  readCapped,
48
48
  runWaitOperation
49
- } from "./index-y47z614h.js";
49
+ } from "./index-fqg5mfk7.js";
50
50
  import"./index-sbdmyz75.js";
51
51
  import {
52
52
  collectToolSurface
53
- } from "./index-kzxpsf8y.js";
53
+ } from "./index-zsdgd1tz.js";
54
54
  import {
55
55
  collectTools,
56
56
  createToolRunner,
57
57
  formatToolError
58
- } from "./index-32vjke6q.js";
58
+ } from "./index-1bnkzq95.js";
59
59
  import {
60
60
  ToolExecutionControlError,
61
61
  executeToolMethod,
62
62
  isToolExecutionControlError,
63
63
  toolResultFromError
64
- } from "./index-vcnfwrtr.js";
64
+ } from "./index-8pjqv3zh.js";
65
65
  import {
66
66
  getRequestContext,
67
67
  getTraceId,
@@ -78,17 +78,12 @@ import {
78
78
  ManagedFilePathSchema,
79
79
  ManagedFileRefSchema
80
80
  } from "./index-6k1937bx.js";
81
- import {
82
- AppError,
83
- STITCH_ERROR_STATUS
84
- } from "./index-scs3f1eg.js";
85
81
  import {
86
82
  resolvePropagationContext
87
83
  } from "./index-zcgf3gqf.js";
88
84
  import {
89
85
  coerceJsonArgs
90
86
  } from "./index-7zbps32p.js";
91
- import"./index-kzfs85xp.js";
92
87
  import {
93
88
  createRuntimeToolFactory,
94
89
  defineRuntimeTool
@@ -105,6 +100,11 @@ import {
105
100
  validateMcpRoundPolicy
106
101
  } from "./index-fenaekmk.js";
107
102
  import"./index-cby4ar3v.js";
103
+ import {
104
+ AppError,
105
+ STITCH_ERROR_STATUS
106
+ } from "./index-scs3f1eg.js";
107
+ import"./index-kzfs85xp.js";
108
108
  import {
109
109
  isRecord
110
110
  } from "./index-77fekveh.js";
package/dist/tracking.js CHANGED
@@ -5,8 +5,8 @@ import {
5
5
  defineContract
6
6
  } from "./index-kazec06k.js";
7
7
  import"./index-6k1937bx.js";
8
- import"./index-scs3f1eg.js";
9
8
  import"./index-zcgf3gqf.js";
9
+ import"./index-scs3f1eg.js";
10
10
  import"./index-kzfs85xp.js";
11
11
  import"./index-77fekveh.js";
12
12
 
package/llms-full.txt CHANGED
@@ -7489,9 +7489,12 @@ same Zod schema an HTTP or MCP call does.
7489
7489
  | `--quiet` | Suppress non-essential stderr output |
7490
7490
  | `--dry-run` | Print the resolved call without executing |
7491
7491
  | `--help`, `-h` | Usage — top-level or per-command flag table |
7492
+ | `--help <text>` | List only the commands matching a substring |
7492
7493
  | `--count-by <field>` | Count records per distinct value — see [Aggregate views](#aggregate-views) |
7493
7494
  | `--sum <f> [--by <g>]`| Total a numeric field, optionally grouped |
7494
- | `--top <n> --by <f>` | Keep only the n largest groups |
7495
+ | `--sort <field>` | Order records by a field, largest first |
7496
+ | `--ascending` | Flip `--sort` to smallest first |
7497
+ | `--top <n>` | Keep the n leading entries of the view asked for |
7495
7498
  | `--table <a,b>` | Render named fields as an aligned table |
7496
7499
 
7497
7500
  stdout carries the result; structured errors and progress go to stderr. With
@@ -7502,6 +7505,34 @@ diagnostics remain ordinary stderr text. This keeps stdout pipeable and
7502
7505
  `VALIDATION_ERROR → 1`, `UNAUTHORIZED → 2`, `FORBIDDEN → 3`, `NOT_FOUND → 4`,
7503
7506
  …) — override per app with `exitCodes`.
7504
7507
 
7508
+ ### A narrower question than "all of them"
7509
+
7510
+ On a discovered surface `--help` is the only way to learn what exists, and that
7511
+ can be two hundred commands. At that size the list stops being an answer: it
7512
+ scrolls past a person and costs an agent the same context an unfiltered result
7513
+ would. So there is a question between "one command" and "all of them":
7514
+
7515
+ ```bash
7516
+ myapp --help broadcast # also: -h broadcast · help broadcast · --help=broadcast
7517
+ ```
7518
+
7519
+ ```
7520
+ Commands matching "broadcast" (3 of 205):
7521
+ broadcast_send Send a broadcast to every subscriber
7522
+ broadcast_cancel Stop a running broadcast
7523
+ announce_publish Publish an announcement as a broadcast
7524
+ ```
7525
+
7526
+ The description is searched as well as the name, because the word someone knows
7527
+ is often in the sentence rather than the name — `announce_publish` above is
7528
+ matched that way. The count says what was left out.
7529
+
7530
+ **No match is an exit code**, not an empty success: `0` over an empty list reads
7531
+ as "there are none", which is a different statement from "none of these". It
7532
+ exits with whatever `NOT_FOUND` maps to (`4` by default). Bare `--help` is
7533
+ unchanged, and `--help=false` still means what it always did — the reserved
7534
+ boolean's negation — so one value never carries two meanings.
7535
+
7505
7536
  ## Application global options
7506
7537
 
7507
7538
  `--json` and friends above are the framework's. An application usually has
@@ -7632,9 +7663,20 @@ myapp item_list --top 5 --by status # same view, written the other way ro
7632
7663
  myapp item_list --table id,status # the one human-facing shape
7633
7664
  ```
7634
7665
 
7635
- `--by` always names the **grouping** field, in every form it appears in, so the
7636
- grammar has one meaning rather than two. Groups are ordered largest first, which
7637
- is what makes `--top` a defined slice rather than an arbitrary one.
7666
+ Two words, one each: **`--by` groups, `--sort` orders.** That leaves `--top` a
7667
+ single meaning everywhere *the n leading entries of the view you asked for* —
7668
+ so the question a CLI actually gets asked composes out of the parts:
7669
+
7670
+ ```bash
7671
+ myapp item_list --top 5 --sort messages --table id,messages # the five biggest, as a table
7672
+ myapp item_list --sort messages --top 5 --json # the same five, as records
7673
+ myapp item_list --sort name --ascending # ordered the other way
7674
+ ```
7675
+
7676
+ Groups come back largest first for the same reason. A record that carries no
7677
+ value for the sort field sorts **last in both directions**: it is not the
7678
+ smallest, it is not on the scale at all, and letting it lead an ascending list
7679
+ would answer a question nobody asked.
7638
7680
 
7639
7681
  Three rules worth knowing before you rely on them:
7640
7682
 
@@ -7646,6 +7688,8 @@ Three rules worth knowing before you rely on them:
7646
7688
  over an object with two array fields, is refused rather than guessed.
7647
7689
  - **Without a view flag the output is byte-for-byte what it was.** The flags are
7648
7690
  reserved CLI behaviour like `--json`; they never reach a tool argument.
7691
+ - **Ordering and grouping do not mix.** `--sort` with `--by`, `--count-by` or
7692
+ `--sum` is refused rather than given a second meaning.
7649
7693
 
7650
7694
  A failed call still reports its own error and exit code. An aggregate over an
7651
7695
  error is not an answer to the question that was asked.
@@ -7725,8 +7769,12 @@ import {
7725
7769
  // otherwise everyone who already installed it never receives the fix.
7726
7770
  assertCliPublishable(previous, next)
7727
7771
 
7728
- // Serving: one generated script per target, no JSON on the wire.
7729
- renderCliInstaller({ manifest, asset: selectCliBuildAsset(manifest, target)!, binaryName: 'myapp' })
7772
+ // Serving: omit `asset` and one script covers every published target, selecting
7773
+ // by uname at run time otherwise that dispatch is the last hand-written piece
7774
+ // of the install path, and every publisher writes the same x86_64 → x64 table.
7775
+ renderCliInstaller({ manifest, binaryName: 'myapp' })
7776
+ // Or pin one target explicitly:
7777
+ renderCliInstaller({ manifest, asset: selectCliBuildAsset(manifest, target), binaryName: 'myapp' })
7730
7778
 
7731
7779
  // Checking: bounded, at most once per interval, silent on any failure.
7732
7780
  const check = await checkCliUpdate({ manifestUrl, currentVersion, lastCheckedAt })
@@ -7772,6 +7820,28 @@ One unconvertible schema no longer takes the connection down with it. The tool
7772
7820
  is skipped and **named** (`onSkippedTool`, or a stderr line by default), so a
7773
7821
  surface of two hundred tools is not lost to one.
7774
7822
 
7823
+ **A remote refusal keeps its code.** A failed `tools/call` used to become a
7824
+ one-sentence `Error` with the result discarded, which cost three things at once:
7825
+ the code (so `exitCodes` had nothing to map and every remote failure exited `1`),
7826
+ the message the operator needed, and the error's own class — a plain `Error` is
7827
+ an *unexpected* error to the runner, so it printed a code frame of the framework
7828
+ bundle before the JSON failure and was then scrubbed to `INTERNAL_SERVER_ERROR`.
7829
+ A structured `{ error, details }` body is now relayed as the contract error it
7830
+ is, on every transport; anything else fails as `UPSTREAM_TOOL_ERROR` carrying
7831
+ what the server did send. Not `INTERNAL_SERVER_ERROR`, because nothing of ours
7832
+ broke.
7833
+
7834
+ **On the CLI a discovered command prints the answer, not the envelope.**
7835
+ `tools/call` returns `{ content: [...], structuredContent? }`, and an agent mount
7836
+ needs exactly that — the parts are what a model is shown. The CLI is different in
7837
+ kind, because the handler's value is what gets printed, piped and aggregated:
7838
+ handed the envelope, `--count-by status` groups the *content parts* and answers
7839
+ `no record carries the field "status" — available: text, type`. So the CLI
7840
+ transport unwraps, and only it: `structuredContent` when the server sent one, a
7841
+ lone text part when it parses as JSON, its text when it does not. Several parts,
7842
+ an image or audio pass through whole — picking one of many would be inventing an
7843
+ answer.
7844
+
7775
7845
 
7776
7846
  ## Auth parity
7777
7847
 
@@ -17224,11 +17294,11 @@ SDK nor the `ai` peer.
17224
17294
  | `CliBuildAssetSchema` / `CliBuildAsset` | schema / _type_ | one download; `size` and `sha256` describe the **decompressed** bytes |
17225
17295
  | `CliBuildTargetSchema` / `CliBuildTarget` | schema / _type_ | `{ platform, arch }` |
17226
17296
  | `CliBuildStampSchema` / `CliBuildStamp` | schema / _type_ | the version/commit/build time carried inside a binary |
17227
- | `CliInstallerConfig` | _type_ | manifest, asset, binary name and default install directory |
17297
+ | `CliInstallerConfig` | _type_ | manifest, binary name, default install directory, and an optional `asset` — omit it for one script that selects the target by `uname` |
17228
17298
  | `CliUpdateCheckConfig` / `CliUpdateCheck` | _type_ | check inputs, and its four answers — `skipped`, `current`, `outdated`, `unknown` |
17229
17299
  | `CliUpdateApplyConfig` / `AppliedCliUpdate` | _type_ | apply inputs and the replaced path, byte count and digest |
17230
17300
  | `CliProfileStore` / `CliProfileStoreConfig` / `ResolvedCliProfile` | _type_ | the profile store, its directory/schema/hint config, and one resolution |
17231
- | `CliResultView` | _type_ | the requested aggregate — `count`, `sum` or `table` |
17301
+ | `CliResultView` | _type_ | the requested view — `count`, `sum`, or `records` (ordered and/or table-rendered) |
17232
17302
  | `CliViewOutput` | _type_ | a JSON value, or the one human-facing text shape |
17233
17303
  | `CliGlobalOptionsParse` | _type_ | `{ argv, globals }` returned by `extractCliGlobalOptions` |
17234
17304
  | `CliArgvRoute` | _type_ | `{ command, commandArgv, topLevelHelp, version, error? }` returned by `routeCliArgv` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stitchkit",
3
- "version": "0.90.4",
3
+ "version": "0.90.5",
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",
@@ -18,13 +18,13 @@ import {
18
18
  probeAgentProcessSandbox,
19
19
  refuseMissingCodingPath
20
20
  } from "./index-gte38nbm.js";
21
+ import {
22
+ defineRuntimeTool
23
+ } from "./index-8z9we758.js";
21
24
  import {
22
25
  conflict,
23
26
  forbidden
24
27
  } from "./index-scs3f1eg.js";
25
- import {
26
- defineRuntimeTool
27
- } from "./index-8z9we758.js";
28
28
 
29
29
  // src/agent-runtime/coding-tool-contract.ts
30
30
  import { z } from "zod";
@@ -7,20 +7,20 @@ import {
7
7
  normalizeError,
8
8
  validateDeclaredOutput
9
9
  } from "./index-2hryh65w.js";
10
+ import {
11
+ coerceJsonArgs
12
+ } from "./index-7zbps32p.js";
13
+ import {
14
+ objectShapeKeys
15
+ } from "./index-fenaekmk.js";
10
16
  import {
11
17
  AppError,
12
18
  STITCH_ERROR_STATUS,
13
19
  isStitchErrorCode
14
20
  } from "./index-scs3f1eg.js";
15
- import {
16
- coerceJsonArgs
17
- } from "./index-7zbps32p.js";
18
21
  import {
19
22
  isUnsafeKey
20
23
  } from "./index-kzfs85xp.js";
21
- import {
22
- objectShapeKeys
23
- } from "./index-fenaekmk.js";
24
24
  import {
25
25
  isRecord
26
26
  } from "./index-77fekveh.js";
@@ -47,14 +47,14 @@ import {
47
47
  joinRoutePath,
48
48
  parseTrailingWildcard
49
49
  } from "./index-kazec06k.js";
50
+ import {
51
+ resolveTraceContext
52
+ } from "./index-zcgf3gqf.js";
50
53
  import {
51
54
  AppError,
52
55
  badRequest,
53
56
  forbidden
54
57
  } from "./index-scs3f1eg.js";
55
- import {
56
- resolveTraceContext
57
- } from "./index-zcgf3gqf.js";
58
58
  import {
59
59
  isUnsafeKey,
60
60
  safeJsonParse