@inkeep/agents-work-apps 0.0.0-dev-20260224165929 → 0.0.0-dev-20260224170656

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/env.d.ts CHANGED
@@ -14,11 +14,11 @@ declare const envSchema: z.ZodObject<{
14
14
  pentest: "pentest";
15
15
  }>>;
16
16
  LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
17
- error: "error";
18
17
  trace: "trace";
19
18
  debug: "debug";
20
19
  info: "info";
21
20
  warn: "warn";
21
+ error: "error";
22
22
  }>>;
23
23
  INKEEP_AGENTS_RUN_DATABASE_URL: z.ZodOptional<z.ZodString>;
24
24
  INKEEP_AGENTS_MANAGE_UI_URL: z.ZodOptional<z.ZodString>;
@@ -44,7 +44,7 @@ declare const envSchema: z.ZodObject<{
44
44
  declare const env: {
45
45
  NODE_ENV: "development" | "production" | "test";
46
46
  ENVIRONMENT: "development" | "production" | "test" | "pentest";
47
- LOG_LEVEL: "error" | "trace" | "debug" | "info" | "warn";
47
+ LOG_LEVEL: "trace" | "debug" | "info" | "warn" | "error";
48
48
  INKEEP_AGENTS_RUN_DATABASE_URL?: string | undefined;
49
49
  INKEEP_AGENTS_MANAGE_UI_URL?: string | undefined;
50
50
  GITHUB_APP_ID?: string | undefined;
@@ -4,10 +4,10 @@ import "./routes/setup.js";
4
4
  import "./routes/tokenExchange.js";
5
5
  import { WebhookVerificationResult, verifyWebhookSignature } from "./routes/webhooks.js";
6
6
  import { Hono } from "hono";
7
- import * as hono_types6 from "hono/types";
7
+ import * as hono_types0 from "hono/types";
8
8
 
9
9
  //#region src/github/index.d.ts
10
- declare function createGithubRoutes(): Hono<hono_types6.BlankEnv, hono_types6.BlankSchema, "/">;
11
- declare const githubRoutes: Hono<hono_types6.BlankEnv, hono_types6.BlankSchema, "/">;
10
+ declare function createGithubRoutes(): Hono<hono_types0.BlankEnv, hono_types0.BlankSchema, "/">;
11
+ declare const githubRoutes: Hono<hono_types0.BlankEnv, hono_types0.BlankSchema, "/">;
12
12
  //#endregion
13
13
  export { GenerateInstallationAccessTokenResult, GenerateTokenError, GenerateTokenResult, GitHubAppConfig, InstallationAccessToken, InstallationInfo, LookupInstallationError, LookupInstallationForRepoResult, LookupInstallationResult, WebhookVerificationResult, clearConfigCache, createAppJwt, createGithubRoutes, determineStatus, fetchInstallationDetails, fetchInstallationRepositories, generateInstallationAccessToken, getGitHubAppConfig, getGitHubAppName, getStateSigningSecret, getWebhookSecret, githubRoutes, isGitHubAppConfigured, isGitHubAppNameConfigured, isStateSigningConfigured, isWebhookConfigured, lookupInstallationForRepo, validateGitHubAppConfigOnStartup, validateGitHubInstallFlowConfigOnStartup, validateGitHubWebhookConfigOnStartup, verifyWebhookSignature };
@@ -1,7 +1,7 @@
1
- import * as hono0 from "hono";
1
+ import * as hono1 from "hono";
2
2
 
3
3
  //#region src/github/mcp/auth.d.ts
4
- declare const githubMcpAuth: () => hono0.MiddlewareHandler<{
4
+ declare const githubMcpAuth: () => hono1.MiddlewareHandler<{
5
5
  Variables: {
6
6
  toolId: string;
7
7
  };
@@ -1,11 +1,11 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types5 from "hono/types";
2
+ import * as hono_types9 from "hono/types";
3
3
 
4
4
  //#region src/github/mcp/index.d.ts
5
5
  declare const app: Hono<{
6
6
  Variables: {
7
7
  toolId: string;
8
8
  };
9
- }, hono_types5.BlankSchema, "/">;
9
+ }, hono_types9.BlankSchema, "/">;
10
10
  //#endregion
11
11
  export { app as default };
@@ -1,7 +1,7 @@
1
1
  import runDbClient_default from "../../db/runDbClient.js";
2
2
  import { githubMcpAuth } from "./auth.js";
3
3
  import { ReactionContentSchema } from "./schemas.js";
4
- import { commitFileChanges, commitNewFile, createIssueCommentReaction, createPullRequestReviewCommentReaction, deleteIssueCommentReaction, deletePullRequestReviewCommentReaction, fetchBranchChangedFiles, fetchComments, fetchPrFileDiffs, fetchPrFiles, fetchPrInfo, formatFileDiff, generatePrMarkdown, getGitHubClientFromRepo, listIssueCommentReactions, listPullRequestReviewCommentReactions, visualizeUpdateOperations } from "./utils.js";
4
+ import { commitFileChanges, commitNewFile, createIssueCommentReaction, createPullRequestReviewCommentReaction, deleteIssueCommentReaction, deletePullRequestReviewCommentReaction, fetchBranchChangedFiles, fetchComments, fetchPrFileDiffs, fetchPrFiles, fetchPrInfo, formatFileDiff, generatePrMarkdown, getGitHubClientFromRepo, listIssueCommentReactions, listIssueReactions, listPullRequestReviewCommentReactions, visualizeUpdateOperations } from "./utils.js";
5
5
  import { z } from "@hono/zod-openapi";
6
6
  import { getMcpToolRepositoryAccessWithDetails } from "@inkeep/agents-core";
7
7
  import { Hono } from "hono";
@@ -666,13 +666,17 @@ const getServer = async (toolId) => {
666
666
  };
667
667
  }
668
668
  });
669
- server.tool("add-comment-reaction", `Add a reaction to a comment on a pull request. Supports general pull request comments and inline PR review comments. ${getAvailableRepositoryString(repositoryAccess)}`, {
669
+ server.tool("add-reaction", `Add a reaction to a pull request body, a general PR comment, or an inline PR review comment. ${getAvailableRepositoryString(repositoryAccess)}`, {
670
670
  owner: z.string().describe("Repository owner name"),
671
671
  repo: z.string().describe("Repository name"),
672
- comment_id: z.number().describe("The ID of the comment to react to"),
673
- comment_type: z.enum(["issue_comment", "review_comment"]).describe("The type of comment: \"issue_comment\" for general pull request comments, \"review_comment\" for inline PR review comments"),
672
+ target_id: z.number().describe("The target to react to: a comment ID for issue_comment/review_comment, or the pull request number for pull_request"),
673
+ target_type: z.enum([
674
+ "pull_request",
675
+ "issue_comment",
676
+ "review_comment"
677
+ ]).describe("The type of target: \"pull_request\" for the PR body itself, \"issue_comment\" for general pull request comments, \"review_comment\" for inline PR review comments"),
674
678
  reaction: ReactionContentSchema.describe("The reaction emoji to add: +1, -1, laugh, hooray, confused, heart, rocket, or eyes")
675
- }, async ({ owner, repo, comment_id, comment_type, reaction }) => {
679
+ }, async ({ owner, repo, target_id, target_type, reaction }) => {
676
680
  try {
677
681
  let githubClient;
678
682
  try {
@@ -686,9 +690,23 @@ const getServer = async (toolId) => {
686
690
  isError: true
687
691
  };
688
692
  }
693
+ let result;
694
+ if (target_type === "pull_request") {
695
+ const { data } = await githubClient.rest.reactions.createForIssue({
696
+ owner,
697
+ repo,
698
+ issue_number: target_id,
699
+ content: reaction
700
+ });
701
+ result = {
702
+ id: data.id,
703
+ content: data.content
704
+ };
705
+ } else if (target_type === "issue_comment") result = await createIssueCommentReaction(githubClient, owner, repo, target_id, reaction);
706
+ else result = await createPullRequestReviewCommentReaction(githubClient, owner, repo, target_id, reaction);
689
707
  return { content: [{
690
708
  type: "text",
691
- text: `Successfully added ${reaction} reaction to ${comment_type} comment ${comment_id} in ${owner}/${repo}\n\nReaction ID: ${(comment_type === "issue_comment" ? await createIssueCommentReaction(githubClient, owner, repo, comment_id, reaction) : await createPullRequestReviewCommentReaction(githubClient, owner, repo, comment_id, reaction)).id}`
709
+ text: `Successfully added ${reaction} reaction to ${target_type === "pull_request" ? `PR #${target_id}` : `${target_type} ${target_id}`} in ${owner}/${repo}\n\nReaction ID: ${result.id}`
692
710
  }] };
693
711
  } catch (error) {
694
712
  if (error instanceof Error && "status" in error) {
@@ -696,21 +714,21 @@ const getServer = async (toolId) => {
696
714
  if (apiError.status === 404) return {
697
715
  content: [{
698
716
  type: "text",
699
- text: `Comment ${comment_id} not found in ${owner}/${repo}.`
717
+ text: `Target ${target_id} (${target_type}) not found in ${owner}/${repo}.`
700
718
  }],
701
719
  isError: true
702
720
  };
703
721
  if (apiError.status === 422) return {
704
722
  content: [{
705
723
  type: "text",
706
- text: `Invalid reaction. Ensure the reaction type is valid and the comment exists.`
724
+ text: `Invalid reaction. Ensure the reaction type is valid and the target exists.`
707
725
  }],
708
726
  isError: true
709
727
  };
710
728
  if (apiError.status === 403) return {
711
729
  content: [{
712
730
  type: "text",
713
- text: `Access denied when adding reaction to comment ${comment_id} in ${owner}/${repo}. Your GitHub App may not have sufficient permissions to create reactions.`
731
+ text: `Access denied when adding reaction to ${target_type} ${target_id} in ${owner}/${repo}. Your GitHub App may not have sufficient permissions to create reactions.`
714
732
  }],
715
733
  isError: true
716
734
  };
@@ -724,13 +742,17 @@ const getServer = async (toolId) => {
724
742
  };
725
743
  }
726
744
  });
727
- server.tool("remove-comment-reaction", `Remove a reaction from a comment on a pull request. Requires the reaction ID (returned when adding a reaction or available from comment data). ${getAvailableRepositoryString(repositoryAccess)}`, {
745
+ server.tool("remove-reaction", `Remove a reaction from a pull request body, a general PR comment, or an inline PR review comment. Requires the reaction ID (returned when adding a reaction or from list-reactions). ${getAvailableRepositoryString(repositoryAccess)}`, {
728
746
  owner: z.string().describe("Repository owner name"),
729
747
  repo: z.string().describe("Repository name"),
730
- comment_id: z.number().describe("The ID of the comment the reaction belongs to"),
731
- comment_type: z.enum(["issue_comment", "review_comment"]).describe("The type of comment: \"issue_comment\" for general pull request comments, \"review_comment\" for inline PR review comments"),
748
+ target_id: z.number().describe("The target the reaction belongs to: a comment ID for issue_comment/review_comment, or the pull request number for pull_request"),
749
+ target_type: z.enum([
750
+ "pull_request",
751
+ "issue_comment",
752
+ "review_comment"
753
+ ]).describe("The type of target: \"pull_request\" for the PR body itself, \"issue_comment\" for general pull request comments, \"review_comment\" for inline PR review comments"),
732
754
  reaction_id: z.number().describe("The ID of the reaction to remove")
733
- }, async ({ owner, repo, comment_id, comment_type, reaction_id }) => {
755
+ }, async ({ owner, repo, target_id, target_type, reaction_id }) => {
734
756
  try {
735
757
  let githubClient;
736
758
  try {
@@ -744,18 +766,24 @@ const getServer = async (toolId) => {
744
766
  isError: true
745
767
  };
746
768
  }
747
- if (comment_type === "issue_comment") await deleteIssueCommentReaction(githubClient, owner, repo, comment_id, reaction_id);
748
- else await deletePullRequestReviewCommentReaction(githubClient, owner, repo, comment_id, reaction_id);
769
+ if (target_type === "pull_request") await githubClient.rest.reactions.deleteForIssue({
770
+ owner,
771
+ repo,
772
+ issue_number: target_id,
773
+ reaction_id
774
+ });
775
+ else if (target_type === "issue_comment") await deleteIssueCommentReaction(githubClient, owner, repo, target_id, reaction_id);
776
+ else await deletePullRequestReviewCommentReaction(githubClient, owner, repo, target_id, reaction_id);
749
777
  return { content: [{
750
778
  type: "text",
751
- text: `Successfully removed reaction ${reaction_id} from ${comment_type} comment ${comment_id} in ${owner}/${repo}`
779
+ text: `Successfully removed reaction ${reaction_id} from ${target_type === "pull_request" ? `PR #${target_id}` : `${target_type} ${target_id}`} in ${owner}/${repo}`
752
780
  }] };
753
781
  } catch (error) {
754
782
  if (error instanceof Error && "status" in error) {
755
783
  if (error.status === 404) return {
756
784
  content: [{
757
785
  type: "text",
758
- text: `Comment ${comment_id} or reaction ${reaction_id} not found in ${owner}/${repo}.`
786
+ text: `Target ${target_id} (${target_type}) or reaction ${reaction_id} not found in ${owner}/${repo}.`
759
787
  }],
760
788
  isError: true
761
789
  };
@@ -769,12 +797,16 @@ const getServer = async (toolId) => {
769
797
  };
770
798
  }
771
799
  });
772
- server.tool("list-comment-reactions", `List all reactions on a comment, including each reaction's ID (needed for removal). Supports both general issue/PR comments and inline PR review comments. ${getAvailableRepositoryString(repositoryAccess)}`, {
800
+ server.tool("list-reactions", `List all reactions on a pull request body, a general PR comment, or an inline PR review comment. Returns each reaction's ID (needed for removal). ${getAvailableRepositoryString(repositoryAccess)}`, {
773
801
  owner: z.string().describe("Repository owner name"),
774
802
  repo: z.string().describe("Repository name"),
775
- comment_id: z.number().describe("The ID of the comment to list reactions for"),
776
- comment_type: z.enum(["issue_comment", "review_comment"]).describe("The type of comment: \"issue_comment\" for general pull request comments, \"review_comment\" for inline PR review comments")
777
- }, async ({ owner, repo, comment_id, comment_type }) => {
803
+ target_id: z.number().describe("The target to list reactions for: a comment ID for issue_comment/review_comment, or the pull request number for pull_request"),
804
+ target_type: z.enum([
805
+ "pull_request",
806
+ "issue_comment",
807
+ "review_comment"
808
+ ]).describe("The type of target: \"pull_request\" for the PR body itself, \"issue_comment\" for general pull request comments, \"review_comment\" for inline PR review comments")
809
+ }, async ({ owner, repo, target_id, target_type }) => {
778
810
  try {
779
811
  let githubClient;
780
812
  try {
@@ -788,22 +820,26 @@ const getServer = async (toolId) => {
788
820
  isError: true
789
821
  };
790
822
  }
791
- const reactions = comment_type === "issue_comment" ? await listIssueCommentReactions(githubClient, owner, repo, comment_id) : await listPullRequestReviewCommentReactions(githubClient, owner, repo, comment_id);
823
+ let reactions = [];
824
+ if (target_type === "pull_request") reactions = await listIssueReactions(githubClient, owner, repo, target_id);
825
+ else if (target_type === "issue_comment") reactions = await listIssueCommentReactions(githubClient, owner, repo, target_id);
826
+ else reactions = await listPullRequestReviewCommentReactions(githubClient, owner, repo, target_id);
827
+ const label = target_type === "pull_request" ? `PR #${target_id}` : `${target_type} ${target_id}`;
792
828
  if (reactions.length === 0) return { content: [{
793
829
  type: "text",
794
- text: `No reactions found on ${comment_type} comment ${comment_id} in ${owner}/${repo}.`
830
+ text: `No reactions found on ${label} in ${owner}/${repo}.`
795
831
  }] };
796
832
  const formatted = reactions.map((r) => `• ${r.content} by @${r.user} (reaction_id: ${r.id})`).join("\n");
797
833
  return { content: [{
798
834
  type: "text",
799
- text: `Found ${reactions.length} reaction(s) on ${comment_type} comment ${comment_id} in ${owner}/${repo}:\n\n${formatted}`
835
+ text: `Found ${reactions.length} reaction(s) on ${label} in ${owner}/${repo}:\n\n${formatted}`
800
836
  }] };
801
837
  } catch (error) {
802
838
  if (error instanceof Error && "status" in error) {
803
839
  if (error.status === 404) return {
804
840
  content: [{
805
841
  type: "text",
806
- text: `Comment ${comment_id} not found in ${owner}/${repo}.`
842
+ text: `Target ${target_id} (${target_type}) not found in ${owner}/${repo}.`
807
843
  }],
808
844
  isError: true
809
845
  };
@@ -254,6 +254,7 @@ interface ReactionDetail {
254
254
  }
255
255
  declare function listIssueCommentReactions(octokit: Octokit, owner: string, repo: string, commentId: number): Promise<ReactionDetail[]>;
256
256
  declare function listPullRequestReviewCommentReactions(octokit: Octokit, owner: string, repo: string, commentId: number): Promise<ReactionDetail[]>;
257
+ declare function listIssueReactions(octokit: Octokit, owner: string, repo: string, issueNumber: number): Promise<ReactionDetail[]>;
257
258
  declare function formatFileDiff(pullRequestNumber: number, files: ChangedFile[], includeContents?: boolean): Promise<string>;
258
259
  //#endregion
259
- export { CommitData, LLMUpdateOperation, PullCommit, ReactionDetail, applyOperation, applyOperations, commitFileChanges, commitNewFile, createIssueCommentReaction, createPullRequestReviewCommentReaction, deleteIssueCommentReaction, deletePullRequestReviewCommentReaction, fetchBranchChangedFiles, fetchComments, fetchCommitDetails, fetchPrCommits, fetchPrFileDiffs, fetchPrFiles, fetchPrInfo, formatFileDiff, generatePrMarkdown, getFilePathsInRepo, getGitHubClientFromInstallationId, getGitHubClientFromRepo, listIssueCommentReactions, listPullRequestReviewCommentReactions, validateLineNumbers, visualizeUpdateOperations };
260
+ export { CommitData, LLMUpdateOperation, PullCommit, ReactionDetail, applyOperation, applyOperations, commitFileChanges, commitNewFile, createIssueCommentReaction, createPullRequestReviewCommentReaction, deleteIssueCommentReaction, deletePullRequestReviewCommentReaction, fetchBranchChangedFiles, fetchComments, fetchCommitDetails, fetchPrCommits, fetchPrFileDiffs, fetchPrFiles, fetchPrInfo, formatFileDiff, generatePrMarkdown, getFilePathsInRepo, getGitHubClientFromInstallationId, getGitHubClientFromRepo, listIssueCommentReactions, listIssueReactions, listPullRequestReviewCommentReactions, validateLineNumbers, visualizeUpdateOperations };
@@ -758,6 +758,21 @@ async function listPullRequestReviewCommentReactions(octokit, owner, repo, comme
758
758
  });
759
759
  return reactions;
760
760
  }
761
+ async function listIssueReactions(octokit, owner, repo, issueNumber) {
762
+ const reactions = [];
763
+ for await (const response of octokit.paginate.iterator(octokit.rest.reactions.listForIssue, {
764
+ owner,
765
+ repo,
766
+ issue_number: issueNumber,
767
+ per_page: 100
768
+ })) for (const r of response.data) reactions.push({
769
+ id: r.id,
770
+ content: r.content,
771
+ user: r.user?.login ?? "unknown",
772
+ createdAt: r.created_at
773
+ });
774
+ return reactions;
775
+ }
761
776
  async function formatFileDiff(pullRequestNumber, files, includeContents = false) {
762
777
  let output = `## File Patches for PR #${pullRequestNumber}\n\n`;
763
778
  output += `Found ${files.length} file(s) matching the requested paths.\n\n`;
@@ -780,4 +795,4 @@ async function formatFileDiff(pullRequestNumber, files, includeContents = false)
780
795
  }
781
796
 
782
797
  //#endregion
783
- export { applyOperation, applyOperations, commitFileChanges, commitNewFile, createIssueCommentReaction, createPullRequestReviewCommentReaction, deleteIssueCommentReaction, deletePullRequestReviewCommentReaction, fetchBranchChangedFiles, fetchComments, fetchCommitDetails, fetchPrCommits, fetchPrFileDiffs, fetchPrFiles, fetchPrInfo, formatFileDiff, generatePrMarkdown, getFilePathsInRepo, getGitHubClientFromInstallationId, getGitHubClientFromRepo, listIssueCommentReactions, listPullRequestReviewCommentReactions, validateLineNumbers, visualizeUpdateOperations };
798
+ export { applyOperation, applyOperations, commitFileChanges, commitNewFile, createIssueCommentReaction, createPullRequestReviewCommentReaction, deleteIssueCommentReaction, deletePullRequestReviewCommentReaction, fetchBranchChangedFiles, fetchComments, fetchCommitDetails, fetchPrCommits, fetchPrFileDiffs, fetchPrFiles, fetchPrInfo, formatFileDiff, generatePrMarkdown, getFilePathsInRepo, getGitHubClientFromInstallationId, getGitHubClientFromRepo, listIssueCommentReactions, listIssueReactions, listPullRequestReviewCommentReactions, validateLineNumbers, visualizeUpdateOperations };
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types3 from "hono/types";
2
+ import * as hono_types5 from "hono/types";
3
3
 
4
4
  //#region src/github/routes/setup.d.ts
5
- declare const app: Hono<hono_types3.BlankEnv, hono_types3.BlankSchema, "/">;
5
+ declare const app: Hono<hono_types5.BlankEnv, hono_types5.BlankSchema, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types1 from "hono/types";
2
+ import * as hono_types7 from "hono/types";
3
3
 
4
4
  //#region src/github/routes/tokenExchange.d.ts
5
- declare const app: Hono<hono_types1.BlankEnv, hono_types1.BlankSchema, "/">;
5
+ declare const app: Hono<hono_types7.BlankEnv, hono_types7.BlankSchema, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,5 +1,5 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types0 from "hono/types";
2
+ import * as hono_types3 from "hono/types";
3
3
 
4
4
  //#region src/github/routes/webhooks.d.ts
5
5
  interface WebhookVerificationResult {
@@ -7,6 +7,6 @@ interface WebhookVerificationResult {
7
7
  error?: string;
8
8
  }
9
9
  declare function verifyWebhookSignature(payload: string, signature: string | undefined, secret: string): WebhookVerificationResult;
10
- declare const app: Hono<hono_types0.BlankEnv, hono_types0.BlankSchema, "/">;
10
+ declare const app: Hono<hono_types3.BlankEnv, hono_types3.BlankSchema, "/">;
11
11
  //#endregion
12
12
  export { WebhookVerificationResult, app as default, verifyWebhookSignature };
@@ -8,10 +8,10 @@ import { AgentOption } from "../modals.js";
8
8
  * Called on every @mention and /inkeep command — caching avoids redundant DB queries.
9
9
  */
10
10
  declare function findCachedUserMapping(tenantId: string, slackUserId: string, teamId: string, clientId?: string): Promise<{
11
+ slackUserId: string;
11
12
  id: string;
12
13
  createdAt: string;
13
14
  updatedAt: string;
14
- slackUserId: string;
15
15
  tenantId: string;
16
16
  clientId: string;
17
17
  slackTeamId: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkeep/agents-work-apps",
3
- "version": "0.0.0-dev-20260224165929",
3
+ "version": "0.0.0-dev-20260224170656",
4
4
  "description": "First party integrations for Inkeep Agents",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -33,7 +33,7 @@
33
33
  "jose": "^6.1.0",
34
34
  "minimatch": "^10.1.1",
35
35
  "slack-block-builder": "^2.8.0",
36
- "@inkeep/agents-core": "0.0.0-dev-20260224165929"
36
+ "@inkeep/agents-core": "0.0.0-dev-20260224170656"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@hono/zod-openapi": "^1.1.5",