@cursor/july 0.1.94 → 0.1.95

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 (209) hide show
  1. package/dist/channels/github/github-channel.d.ts.map +1 -1
  2. package/dist/channels/github/github-channel.js +14 -2
  3. package/dist/channels/github/types.d.ts +18 -3
  4. package/dist/channels/github/types.d.ts.map +1 -1
  5. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  6. package/dist/channels/origin/origin-channel.js +11 -3
  7. package/dist/channels/origin/origin-webhook.d.ts +11 -1
  8. package/dist/channels/origin/origin-webhook.d.ts.map +1 -1
  9. package/dist/channels/origin/origin-webhook.js +23 -3
  10. package/dist/channels/origin/types.d.ts +8 -0
  11. package/dist/channels/origin/types.d.ts.map +1 -1
  12. package/dist/channels/slack/pr-ref.d.ts +7 -1
  13. package/dist/channels/slack/pr-ref.d.ts.map +1 -1
  14. package/dist/channels/slack/pr-ref.js +42 -23
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/ab.html +4 -4
  17. package/dist/docs/assets/{app.CFDEas4I.js → app.BBj0klBO.js} +1 -1
  18. package/dist/docs/assets/chunks/@localSearchIndexroot.oqPawjiD.js +1 -0
  19. package/dist/docs/assets/chunks/{VPLocalSearchBox.B1IIYpYS.js → VPLocalSearchBox.CUEXpL78.js} +1 -1
  20. package/dist/docs/assets/chunks/{theme.Ct4NSiLm.js → theme.DabmQnia.js} +2 -2
  21. package/dist/docs/assets/index.md.BoHaMdeZ.js +5 -0
  22. package/dist/docs/assets/{index.md.DRakGHFe.lean.js → index.md.BoHaMdeZ.lean.js} +1 -1
  23. package/dist/docs/assets/{reference_cli.md.Cw6_ICYG.js → reference_cli.md.BsMOxDvh.js} +3 -2
  24. package/dist/docs/assets/{reference_cli.md.Cw6_ICYG.lean.js → reference_cli.md.BsMOxDvh.lean.js} +1 -1
  25. package/dist/docs/assets/{reference_skills.md.8son6Hjm.js → reference_skills.md.BFW9retM.js} +3 -3
  26. package/dist/docs/assets/{templates_agentic-owners.md.DqtPdm6f.js → templates_agentic-owners.md.BZSH4N9z.js} +1 -1
  27. package/dist/docs/assets/{templates_demo.md.DhFcWN6j.js → templates_demo.md.BeQX9V3H.js} +1 -1
  28. package/dist/docs/assets/{templates_pr-autofixer.md.DU7dQpor.js → templates_pr-autofixer.md.x5zl6-GT.js} +2 -2
  29. package/dist/docs/assets/{templates_pr-autofixer.md.DU7dQpor.lean.js → templates_pr-autofixer.md.x5zl6-GT.lean.js} +1 -1
  30. package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.js +4 -0
  31. package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.lean.js +1 -0
  32. package/dist/docs/assets/{templates_security-reviewer.md.CTa7u_l1.js → templates_security-reviewer.md.lshxbCLK.js} +2 -2
  33. package/dist/docs/assets/{templates_security-reviewer.md.CTa7u_l1.lean.js → templates_security-reviewer.md.lshxbCLK.lean.js} +1 -1
  34. package/dist/docs/assets/{templates_triage.md.CVlpctKS.js → templates_triage.md.Co4UNzkZ.js} +3 -3
  35. package/dist/docs/assets/{templates_triage.md.CVlpctKS.lean.js → templates_triage.md.Co4UNzkZ.lean.js} +1 -1
  36. package/dist/docs/building-with-agents.html +4 -4
  37. package/dist/docs/concepts.html +4 -4
  38. package/dist/docs/deployment.html +4 -4
  39. package/dist/docs/evals.html +4 -4
  40. package/dist/docs/guides/agent-to-agent.html +4 -4
  41. package/dist/docs/guides/cloud-runtime.html +4 -4
  42. package/dist/docs/guides/convert-automation.html +4 -4
  43. package/dist/docs/guides/github.html +4 -4
  44. package/dist/docs/guides/human-in-the-loop.html +4 -4
  45. package/dist/docs/guides/mcp-oauth.html +4 -4
  46. package/dist/docs/guides/opentelemetry.html +4 -4
  47. package/dist/docs/guides/slack.html +4 -4
  48. package/dist/docs/guides/webhooks.html +4 -4
  49. package/dist/docs/hashmap.json +1 -1
  50. package/dist/docs/hillclimbing.html +4 -4
  51. package/dist/docs/index.html +6 -6
  52. package/dist/docs/index.md +3 -1
  53. package/dist/docs/llms-full.txt +90 -26
  54. package/dist/docs/llms.txt +1 -0
  55. package/dist/docs/quickstart.html +4 -4
  56. package/dist/docs/reference/agent-config.html +4 -4
  57. package/dist/docs/reference/artifacts.html +4 -4
  58. package/dist/docs/reference/channels.html +4 -4
  59. package/dist/docs/reference/cli.html +7 -6
  60. package/dist/docs/reference/cli.md +3 -1
  61. package/dist/docs/reference/connections.html +4 -4
  62. package/dist/docs/reference/hooks.html +4 -4
  63. package/dist/docs/reference/http-api.html +4 -4
  64. package/dist/docs/reference/instructions.html +4 -4
  65. package/dist/docs/reference/playground.html +4 -4
  66. package/dist/docs/reference/project-layout.html +4 -4
  67. package/dist/docs/reference/prompt.html +4 -4
  68. package/dist/docs/reference/schedules.html +4 -4
  69. package/dist/docs/reference/sessions.html +4 -4
  70. package/dist/docs/reference/skills.html +7 -7
  71. package/dist/docs/reference/subagents.html +4 -4
  72. package/dist/docs/reference/tools.html +4 -4
  73. package/dist/docs/scaffolding-agents.html +4 -4
  74. package/dist/docs/storage.html +4 -4
  75. package/dist/docs/templates/agentic-owners.html +7 -7
  76. package/dist/docs/templates/agentic-owners.md +1 -1
  77. package/dist/docs/templates/demo.html +6 -6
  78. package/dist/docs/templates/demo.md +3 -2
  79. package/dist/docs/templates/pr-autofixer.html +6 -6
  80. package/dist/docs/templates/pr-autofixer.md +7 -13
  81. package/dist/docs/templates/security-help.html +30 -0
  82. package/dist/docs/templates/security-help.md +65 -0
  83. package/dist/docs/templates/security-reviewer.html +6 -6
  84. package/dist/docs/templates/security-reviewer.md +1 -2
  85. package/dist/docs/templates/triage.html +7 -7
  86. package/dist/docs/templates/triage.md +2 -6
  87. package/dist/docs/troubleshooting.html +4 -4
  88. package/dist/files-backends/cursor-hosted.d.ts +6 -2
  89. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  90. package/dist/files-backends/cursor-hosted.js +2 -2
  91. package/dist/files.d.ts +2 -0
  92. package/dist/files.d.ts.map +1 -1
  93. package/dist/files.js +5 -0
  94. package/dist/internal/cli-deploy.d.ts.map +1 -1
  95. package/dist/internal/cli-deploy.js +135 -6
  96. package/dist/internal/conversation-mirror.d.ts +82 -0
  97. package/dist/internal/conversation-mirror.d.ts.map +1 -0
  98. package/dist/internal/conversation-mirror.js +251 -0
  99. package/dist/internal/deferred-channel-session.d.ts +20 -0
  100. package/dist/internal/deferred-channel-session.d.ts.map +1 -0
  101. package/dist/internal/deferred-channel-session.js +62 -0
  102. package/dist/internal/deploy-client.d.ts +13 -1
  103. package/dist/internal/deploy-client.d.ts.map +1 -1
  104. package/dist/internal/deploy-client.js +11 -1
  105. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  106. package/dist/internal/deploy-manifest.js +11 -5
  107. package/dist/internal/discovery.d.ts.map +1 -1
  108. package/dist/internal/discovery.js +22 -2
  109. package/dist/internal/framework-storage-selection.d.ts +32 -16
  110. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  111. package/dist/internal/framework-storage-selection.js +51 -17
  112. package/dist/internal/hosted-admission-context.d.ts +20 -0
  113. package/dist/internal/hosted-admission-context.d.ts.map +1 -0
  114. package/dist/internal/hosted-admission-context.js +31 -0
  115. package/dist/internal/hosted-delivery-protocol.d.ts +5 -0
  116. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  117. package/dist/internal/hosted-delivery-protocol.js +33 -1
  118. package/dist/internal/hosted-delivery.d.ts +4 -2
  119. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  120. package/dist/internal/hosted-delivery.js +75 -35
  121. package/dist/internal/hosted-managed-automation.d.ts +30 -0
  122. package/dist/internal/hosted-managed-automation.d.ts.map +1 -0
  123. package/dist/internal/hosted-managed-automation.js +58 -0
  124. package/dist/internal/review-comments.d.ts.map +1 -1
  125. package/dist/internal/review-comments.js +10 -98
  126. package/dist/internal/scm/pr-url.d.ts +14 -0
  127. package/dist/internal/scm/pr-url.d.ts.map +1 -0
  128. package/dist/internal/scm/pr-url.js +65 -0
  129. package/dist/internal/sdk-runner.d.ts +14 -0
  130. package/dist/internal/sdk-runner.d.ts.map +1 -1
  131. package/dist/internal/sdk-runner.js +41 -2
  132. package/dist/internal/server.d.ts.map +1 -1
  133. package/dist/internal/server.js +10 -2
  134. package/dist/internal/session-engine.d.ts.map +1 -1
  135. package/dist/internal/session-engine.js +9 -0
  136. package/dist/playground/assets/index-CF7hUDnQ.css +1 -0
  137. package/dist/playground/assets/{index-B3JCyigB.js → index-CZA1uEWA.js} +48 -48
  138. package/dist/playground/index.html +2 -2
  139. package/dist/storage-backends/cursor-hosted.d.ts +7 -2
  140. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  141. package/dist/storage-backends/cursor-hosted.js +2 -2
  142. package/docs/README.md +3 -1
  143. package/docs/reference/cli.md +3 -1
  144. package/docs/templates/agentic-owners.md +1 -1
  145. package/docs/templates/demo.md +3 -2
  146. package/docs/templates/pr-autofixer.md +7 -13
  147. package/docs/templates/security-help.md +70 -0
  148. package/docs/templates/security-reviewer.md +1 -2
  149. package/docs/templates/triage.md +2 -6
  150. package/package.json +1 -1
  151. package/src/channels/github/github-channel.ts +23 -8
  152. package/src/channels/github/types.ts +19 -2
  153. package/src/channels/origin/origin-channel.ts +13 -1
  154. package/src/channels/origin/origin-webhook.ts +27 -3
  155. package/src/channels/origin/types.ts +8 -0
  156. package/src/channels/slack/pr-ref.ts +56 -25
  157. package/src/files-backends/cursor-hosted.ts +9 -3
  158. package/src/files.ts +11 -0
  159. package/src/internal/cli-deploy.ts +171 -7
  160. package/src/internal/conversation-mirror.ts +330 -0
  161. package/src/internal/deferred-channel-session.ts +61 -0
  162. package/src/internal/deploy-client.ts +24 -1
  163. package/src/internal/deploy-manifest.ts +10 -5
  164. package/src/internal/discovery.ts +25 -2
  165. package/src/internal/framework-storage-selection.ts +61 -19
  166. package/src/internal/hosted-admission-context.ts +37 -0
  167. package/src/internal/hosted-delivery-protocol.ts +44 -1
  168. package/src/internal/hosted-delivery.ts +95 -40
  169. package/src/internal/hosted-managed-automation.ts +72 -0
  170. package/src/internal/review-comments.ts +10 -113
  171. package/src/internal/scm/pr-url.ts +95 -0
  172. package/src/internal/sdk-runner.ts +57 -2
  173. package/src/internal/server.ts +10 -0
  174. package/src/internal/session-engine.ts +12 -0
  175. package/src/storage-backends/cursor-hosted.ts +10 -3
  176. package/templates/agentic-owners/README.md +1 -1
  177. package/templates/agentic-owners/agent/agent.ts +0 -10
  178. package/templates/agentic-owners/agent/channels/github.ts +5 -14
  179. package/templates/agentic-owners/agent/lib/config.ts +0 -8
  180. package/templates/agentic-owners/agent/lib/review.ts +2 -15
  181. package/templates/agentic-owners/agent/tools/record_review.ts +2 -4
  182. package/templates/demo/agent/agent.ts +0 -10
  183. package/templates/pr-autofixer/README.md +0 -2
  184. package/templates/pr-autofixer/agent/agent.ts +0 -11
  185. package/templates/pr-autofixer/agent/channels/slack.ts +0 -7
  186. package/templates/pr-autofixer/agent/lib/pr-state.ts +5 -17
  187. package/templates/pr-autofixer/agent/lib/repos.ts +0 -1
  188. package/templates/security-help/README.md +2 -2
  189. package/templates/security-help/agent/agent.ts +1 -2
  190. package/templates/security-help/agent/channels/slack.ts +0 -3
  191. package/templates/security-help/agent/instructions.md +9 -10
  192. package/templates/security-help/agent/skills/access-request.md +1 -1
  193. package/templates/security-help/agent/skills/faq.md +31 -0
  194. package/templates/security-help/agent/skills/security-playbooks.md +1 -1
  195. package/templates/security-help/package.json +1 -2
  196. package/templates/security-reviewer/agent/agent.ts +0 -10
  197. package/templates/triage/agent/agent.ts +0 -10
  198. package/templates/triage/agent/channels/queue.ts +1 -1
  199. package/templates/triage/agent/channels/webhook.ts +1 -3
  200. package/dist/docs/assets/chunks/@localSearchIndexroot.DU3U2Ij2.js +0 -1
  201. package/dist/docs/assets/index.md.DRakGHFe.js +0 -5
  202. package/dist/playground/assets/index-D9N7-q97.css +0 -1
  203. package/templates/security-help/agent/knowledge/faq/approvals.md +0 -5
  204. package/templates/security-help/agent/knowledge/faq/channels.md +0 -6
  205. package/templates/security-help/agent/knowledge/faq/phishing.md +0 -10
  206. package/templates/security-help/agent/skills/security-first-pass.md +0 -15
  207. /package/dist/docs/assets/{reference_skills.md.8son6Hjm.lean.js → reference_skills.md.BFW9retM.lean.js} +0 -0
  208. /package/dist/docs/assets/{templates_agentic-owners.md.DqtPdm6f.lean.js → templates_agentic-owners.md.BZSH4N9z.lean.js} +0 -0
  209. /package/dist/docs/assets/{templates_demo.md.DhFcWN6j.lean.js → templates_demo.md.BeQX9V3H.lean.js} +0 -0
@@ -9,37 +9,25 @@ const PR_STATE_QUERY = `
9
9
  }
10
10
  `;
11
11
 
12
- export async function queryPullRequest<T>(input: {
12
+ export async function fetchPrState(input: {
13
13
  github: HostGitHubClient;
14
14
  pr: GithubPrRef;
15
- query: string;
16
- }): Promise<T | undefined> {
15
+ }): Promise<string | undefined> {
17
16
  try {
18
17
  const octokit = await input.github.getOctokit();
19
18
  const data = await octokit.graphql<{
20
- repository?: { pullRequest?: T | null } | null;
21
- }>(input.query, {
19
+ repository?: { pullRequest?: { state?: string } | null } | null;
20
+ }>(PR_STATE_QUERY, {
22
21
  owner: input.pr.owner,
23
22
  repo: input.pr.repo,
24
23
  number: input.pr.number,
25
24
  });
26
- return data.repository?.pullRequest ?? undefined;
25
+ return data.repository?.pullRequest?.state;
27
26
  } catch {
28
27
  return undefined;
29
28
  }
30
29
  }
31
30
 
32
- export async function fetchPrState(input: {
33
- github: HostGitHubClient;
34
- pr: GithubPrRef;
35
- }): Promise<string | undefined> {
36
- const node = await queryPullRequest<{ state?: string }>({
37
- ...input,
38
- query: PR_STATE_QUERY,
39
- });
40
- return node?.state;
41
- }
42
-
43
31
  export function isTerminalPrState(
44
32
  state: string | undefined
45
33
  ): state is "CLOSED" | "MERGED" {
@@ -1,4 +1,3 @@
1
- /** Repos Cursor relays SCM events for. Replace with your `owner/repo` list. */
2
1
  export const GITHUB_REPOS: readonly string[] = ["owner/repo"];
3
2
 
4
3
  export function githubRepos(): readonly string[] {
@@ -1,6 +1,6 @@
1
1
  # Security help
2
2
 
3
- Answers security questions in Slack from your FAQ files and takes a first
3
+ Answers security questions in Slack from your skills and takes a first
4
4
  look when someone pastes a GitHub pull request.
5
5
 
6
6
  ```bash
@@ -27,7 +27,7 @@ one in the playground.
27
27
 
28
28
  - `agent/lib/repos.ts`: repos it may read
29
29
  - `agent/channels/slack.ts`: channel ids to watch (`watch`)
30
- - `agent/knowledge/faq/`: answers for your company
30
+ - `agent/skills/faq.md`: answers for your company
31
31
  - `agent/skills/`: how to look at a PR, a leak, or an access ask
32
32
  - `agent/instructions.md`: routing
33
33
 
@@ -2,8 +2,7 @@ import { defineAgent } from "@cursor/july";
2
2
 
3
3
  export default defineAgent({
4
4
  name: "Security Help",
5
- description:
6
- "Answers security questions in Slack and takes a first look at a GitHub pull request.",
5
+ // Not DEFAULT_MODEL (grok-4.5).
7
6
  model: {
8
7
  id: "grok-4.6",
9
8
  params: [
@@ -56,9 +56,6 @@ const handleSlack: SlackMessageHandler = async (ctx, message) => {
56
56
 
57
57
  export default slackChannel({
58
58
  envPrefix: "SECURITY_HELP",
59
- policy: {
60
- blockExternals: true,
61
- },
62
59
  engagement: {
63
60
  channelPosts:
64
61
  watch.length === 0
@@ -1,20 +1,19 @@
1
1
  # Security help
2
2
 
3
- Answer security questions in Slack from the FAQ and skills.
3
+ Answer security questions in Slack from the skills.
4
4
  If you do not know, say so and ask a human.
5
5
 
6
- Open the skill or FAQ for the ask. Those files are under `agent/skills/` and `agent/knowledge/faq/`.
6
+ Open the skill for the ask.
7
7
 
8
- | If the ask is about | Open |
8
+ | If the ask is about | Skill |
9
9
  | --- | --- |
10
- | A GitHub pull request | `agent/skills/security-pr-first-pass.md` |
11
- | An access request | `agent/skills/access-request.md` |
12
- | A leak, alert, or incident | `agent/skills/security-playbooks.md` |
13
- | Who can approve, privacy, or policy | `agent/knowledge/faq/approvals.md` |
14
- | Phishing text, email, or a call | `agent/knowledge/faq/phishing.md` |
15
- | Which team or channel owns a request | `agent/knowledge/faq/channels.md` |
16
- | Another security question | `agent/skills/security-first-pass.md` |
10
+ | A GitHub pull request | security-pr-first-pass |
11
+ | An access request | access-request |
12
+ | A leak, alert, or incident | security-playbooks |
13
+ | Who can approve, privacy, phishing, or which channel | faq |
17
14
 
18
15
  A pull request earlier in the thread is not this one.
19
16
 
17
+ If this looks like production secrets out, an exploit, customer data out, malware, or an account takeover, they should stop it now and wait for a human.
18
+
20
19
  If you say an incident is over or a system is safe, show why. Looking at a pull request is not that.
@@ -4,7 +4,7 @@ description: use when Slack has an access request or request number
4
4
 
5
5
  # Access request
6
6
 
7
- This skill is the access request. SaaS or identity-group asks go to the team named in `agent/knowledge/faq/channels.md`.
7
+ This skill is the access request. SaaS or identity-group asks go to the team named in faq.
8
8
 
9
9
  Say what they asked for, why, and how long it lasts, from the request.
10
10
  Do not invent a grant that is not on the request.
@@ -0,0 +1,31 @@
1
+ ---
2
+ description: use for company answers on approvals, phishing, and which channel owns a request
3
+ ---
4
+
5
+ # Company FAQ
6
+
7
+ If a section does not name an owner or team, say you do not know and ask a human.
8
+
9
+ ## Approvals
10
+
11
+ Who can say yes depends on the request. If this file does not name an owner, ask a human for that topic.
12
+
13
+ Privacy questions (training, retention, where prompts sit) go to a privacy or security person.
14
+
15
+ ## Channels
16
+
17
+ `#security` is for security questions and phishing reports.
18
+
19
+ Name the channel that owns SaaS access, identity groups, laptops, and billing.
20
+ Until you do, say you do not know which team owns that request.
21
+
22
+ ## Phishing
23
+
24
+ `#security` is where phishing and unexpected texts, emails, or calls go.
25
+ If the thread is already about that, keep it there.
26
+
27
+ Leave the original message alone. Do not reply, click, or send a 2FA code on it.
28
+ Confirm unknown texts or calls over Slack or in person before acting.
29
+
30
+ If an account looks compromised, they should lock it now and wait for a human.
31
+ If security already gave a verdict in-thread, follow that.
@@ -6,7 +6,7 @@ description: use when Slack looks like a leak, alert, access, privacy, or incide
6
6
 
7
7
  If a production secret is already out, revoke or rotate it at the place that issued it, or turn it off there.
8
8
 
9
- For other alerts, follow the FAQ or runbook under `agent/knowledge/`.
9
+ For other alerts, follow faq.
10
10
  Do not call it safe without a human.
11
11
 
12
12
  If you cannot see who is affected, skip that.
@@ -8,8 +8,7 @@
8
8
  "dev": "agent-sdk dev"
9
9
  },
10
10
  "dependencies": {
11
- "@cursor/july": "latest",
12
- "zod": "^3.25.0"
11
+ "@cursor/july": "latest"
13
12
  },
14
13
  "devDependencies": {
15
14
  "@types/node": "^22.14.0",
@@ -1,18 +1,8 @@
1
- import { homedir } from "node:os";
2
- import { join } from "node:path";
3
1
  import { defineAgent } from "@cursor/july";
4
2
 
5
3
  export default defineAgent({
6
- model: {
7
- id: "grok-4.5",
8
- params: [
9
- { id: "effort", value: "high" },
10
- { id: "fast", value: "true" },
11
- ],
12
- },
13
4
  tools: ["read", "grep"],
14
5
  local: {
15
6
  sandbox: true,
16
- cwd: join(homedir(), ".cache", "agent-serve", "security-reviewer"),
17
7
  },
18
8
  });
@@ -1,18 +1,8 @@
1
- import { homedir } from "node:os";
2
- import { join } from "node:path";
3
1
  import { defineAgent } from "@cursor/july";
4
2
 
5
3
  export default defineAgent({
6
- model: {
7
- id: "grok-4.5",
8
- params: [
9
- { id: "effort", value: "high" },
10
- { id: "fast", value: "true" },
11
- ],
12
- },
13
4
  tools: ["read", "grep", "glob", "ls"],
14
5
  local: {
15
6
  sandbox: true,
16
- cwd: join(homedir(), ".cache", "agent-serve", "triage"),
17
7
  },
18
8
  });
@@ -25,7 +25,7 @@ export default defineChannel({
25
25
  const options = {
26
26
  continuationToken: parsed.issue.identifier,
27
27
  admission: "coalesce" as const,
28
- ...(parsed.issue.title === "" ? {} : { title: parsed.issue.title }),
28
+ title: parsed.issue.title === "" ? undefined : parsed.issue.title,
29
29
  };
30
30
  const prompt = formatQueuePrompt(parsed.issue);
31
31
  if (isTrackerWebhook(body)) {
@@ -35,9 +35,7 @@ export default defineChannel({
35
35
  send(formatQueuePrompt(parsed.issue), {
36
36
  continuationToken: parsed.issue.identifier,
37
37
  admission: "coalesce",
38
- ...(parsed.issue.title === ""
39
- ? {}
40
- : { title: parsed.issue.title }),
38
+ title: parsed.issue.title === "" ? undefined : parsed.issue.title,
41
39
  })
42
40
  );
43
41
  return Response.json({