@cursor/july 0.1.55 → 0.1.61

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 (261) hide show
  1. package/dist/bin/agent-serve.js +30 -23
  2. package/dist/channels/github/github-channel.d.ts +12 -0
  3. package/dist/channels/github/github-channel.d.ts.map +1 -1
  4. package/dist/channels/github/github-channel.js +67 -15
  5. package/dist/channels/github/types.d.ts +27 -1
  6. package/dist/channels/github/types.d.ts.map +1 -1
  7. package/dist/channels/origin/cursor-account.d.ts +22 -0
  8. package/dist/channels/origin/cursor-account.d.ts.map +1 -0
  9. package/dist/channels/origin/cursor-account.js +35 -0
  10. package/dist/channels/origin/events.d.ts +10 -0
  11. package/dist/channels/origin/events.d.ts.map +1 -0
  12. package/dist/channels/origin/events.js +27 -0
  13. package/dist/channels/origin/index.d.ts +29 -0
  14. package/dist/channels/origin/index.d.ts.map +1 -0
  15. package/dist/channels/origin/index.js +28 -0
  16. package/dist/channels/origin/origin-channel.d.ts +68 -0
  17. package/dist/channels/origin/origin-channel.d.ts.map +1 -0
  18. package/dist/channels/origin/origin-channel.js +567 -0
  19. package/dist/channels/origin/origin-webhook.d.ts +38 -0
  20. package/dist/channels/origin/origin-webhook.d.ts.map +1 -0
  21. package/dist/channels/origin/origin-webhook.js +151 -0
  22. package/dist/channels/origin/types.d.ts +152 -0
  23. package/dist/channels/origin/types.d.ts.map +1 -0
  24. package/dist/channels/origin/types.js +1 -0
  25. package/dist/channels/slack/doctor.d.ts +17 -1
  26. package/dist/channels/slack/doctor.d.ts.map +1 -1
  27. package/dist/channels/slack/doctor.js +186 -10
  28. package/dist/docs/404.html +2 -2
  29. package/dist/docs/ab.html +4 -4
  30. package/dist/docs/assets/{app.CVQxhV85.js → app.CW3KJh72.js} +1 -1
  31. package/dist/docs/assets/chunks/@localSearchIndexroot.BuymfBAo.js +1 -0
  32. package/dist/docs/assets/chunks/{VPLocalSearchBox.QAPzJjql.js → VPLocalSearchBox.Bk6EWpPj.js} +1 -1
  33. package/dist/docs/assets/chunks/{theme.CSxTCOFu.js → theme.Bz9AodBA.js} +2 -2
  34. package/dist/docs/assets/{example-agents_fsd.md.DPz9ezO4.js → example-agents_fsd.md.ZeGEpAw_.js} +2 -2
  35. package/dist/docs/assets/{example-agents_fsd.md.DPz9ezO4.lean.js → example-agents_fsd.md.ZeGEpAw_.lean.js} +1 -1
  36. package/dist/docs/assets/{example-agents_security-reviewer.md.Dkf1gyo6.js → example-agents_security-reviewer.md.DBL1TwtP.js} +2 -2
  37. package/dist/docs/assets/{example-agents_security-reviewer.md.Dkf1gyo6.lean.js → example-agents_security-reviewer.md.DBL1TwtP.lean.js} +1 -1
  38. package/dist/docs/assets/guides_convert-automation.md.BhMzTkE5.js +12 -0
  39. package/dist/docs/assets/guides_convert-automation.md.BhMzTkE5.lean.js +1 -0
  40. package/dist/docs/assets/{guides_github.md.B8QKtIpw.js → guides_github.md.CLLQJKRB.js} +4 -4
  41. package/dist/docs/assets/{guides_github.md.B8QKtIpw.lean.js → guides_github.md.CLLQJKRB.lean.js} +1 -1
  42. package/dist/docs/assets/index.md.DhRHS_-L.js +5 -0
  43. package/dist/docs/assets/{index.md.COeoSkcF.lean.js → index.md.DhRHS_-L.lean.js} +1 -1
  44. package/dist/docs/assets/{reference_cli.md.D_CCfG8R.js → reference_cli.md.Cl14Jfo3.js} +8 -2
  45. package/dist/docs/assets/{reference_cli.md.D_CCfG8R.lean.js → reference_cli.md.Cl14Jfo3.lean.js} +1 -1
  46. package/dist/docs/assets/scaffolding-agents.md.CrWSA0Ko.js +1 -0
  47. package/dist/docs/assets/{scaffolding-agents.md.mkc3B_ZW.lean.js → scaffolding-agents.md.CrWSA0Ko.lean.js} +1 -1
  48. package/dist/docs/assets/templates_agentic-owners.md.BkTLORaU.js +14 -0
  49. package/dist/docs/assets/templates_agentic-owners.md.BkTLORaU.lean.js +1 -0
  50. package/dist/docs/assets/templates_demo.md.Bgd6MBaZ.js +4 -0
  51. package/dist/docs/assets/templates_demo.md.Bgd6MBaZ.lean.js +1 -0
  52. package/dist/docs/assets/templates_pr-autofixer.md.DcmoeUNZ.js +8 -0
  53. package/dist/docs/assets/templates_pr-autofixer.md.DcmoeUNZ.lean.js +1 -0
  54. package/dist/docs/assets/templates_security-reviewer.md.C0yIUaYs.js +2 -0
  55. package/dist/docs/assets/templates_security-reviewer.md.C0yIUaYs.lean.js +1 -0
  56. package/dist/docs/building-with-agents.html +4 -4
  57. package/dist/docs/concepts.html +5 -5
  58. package/dist/docs/deployment.html +4 -4
  59. package/dist/docs/evals.html +4 -4
  60. package/dist/docs/example-agents/approval-buddy.html +4 -4
  61. package/dist/docs/example-agents/benny.html +4 -4
  62. package/dist/docs/example-agents/bugbot.html +4 -4
  63. package/dist/docs/example-agents/codebase-wiki.html +4 -4
  64. package/dist/docs/example-agents/codeowners-review.html +4 -4
  65. package/dist/docs/example-agents/concierge.html +4 -4
  66. package/dist/docs/example-agents/fsd.html +5 -5
  67. package/dist/docs/example-agents/index.html +4 -4
  68. package/dist/docs/example-agents/knowledge-base.html +4 -4
  69. package/dist/docs/example-agents/oncall.html +4 -4
  70. package/dist/docs/example-agents/security-reviewer.html +5 -5
  71. package/dist/docs/example-agents/slack-agent.html +4 -4
  72. package/dist/docs/example-agents/weather-agent.html +4 -4
  73. package/dist/docs/guides/agent-to-agent.html +4 -4
  74. package/dist/docs/guides/cloud-runtime.html +4 -4
  75. package/dist/docs/guides/convert-automation.html +36 -0
  76. package/dist/docs/guides/github.html +7 -7
  77. package/dist/docs/guides/human-in-the-loop.html +4 -4
  78. package/dist/docs/guides/mcp-oauth.html +4 -4
  79. package/dist/docs/guides/opentelemetry.html +4 -4
  80. package/dist/docs/guides/slack.html +4 -4
  81. package/dist/docs/guides/webhooks.html +4 -4
  82. package/dist/docs/hashmap.json +1 -1
  83. package/dist/docs/hillclimbing.html +4 -4
  84. package/dist/docs/index.html +6 -6
  85. package/dist/docs/quickstart.html +4 -4
  86. package/dist/docs/reference/agent-config.html +4 -4
  87. package/dist/docs/reference/artifacts.html +4 -4
  88. package/dist/docs/reference/channels.html +4 -4
  89. package/dist/docs/reference/cli.html +12 -6
  90. package/dist/docs/reference/connections.html +4 -4
  91. package/dist/docs/reference/hooks.html +4 -4
  92. package/dist/docs/reference/http-api.html +4 -4
  93. package/dist/docs/reference/instructions.html +4 -4
  94. package/dist/docs/reference/playground.html +4 -4
  95. package/dist/docs/reference/project-layout.html +4 -4
  96. package/dist/docs/reference/prompt.html +4 -4
  97. package/dist/docs/reference/schedules.html +4 -4
  98. package/dist/docs/reference/sessions.html +4 -4
  99. package/dist/docs/reference/skills.html +4 -4
  100. package/dist/docs/reference/subagents.html +4 -4
  101. package/dist/docs/reference/tools.html +4 -4
  102. package/dist/docs/scaffolding-agents.html +5 -5
  103. package/dist/docs/storage.html +4 -4
  104. package/dist/docs/templates/agentic-owners.html +38 -0
  105. package/dist/docs/templates/demo.html +28 -0
  106. package/dist/docs/templates/pr-autofixer.html +32 -0
  107. package/dist/docs/templates/security-reviewer.html +26 -0
  108. package/dist/docs/templates/triage.html +5 -5
  109. package/dist/docs/troubleshooting.html +4 -4
  110. package/dist/index.d.ts +3 -3
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +2 -2
  113. package/dist/internal/cli-ax.d.ts +2 -0
  114. package/dist/internal/cli-ax.d.ts.map +1 -1
  115. package/dist/internal/cli-ax.js +20 -0
  116. package/dist/internal/cli-slack.d.ts +2 -0
  117. package/dist/internal/cli-slack.d.ts.map +1 -1
  118. package/dist/internal/cli-slack.js +11 -2
  119. package/dist/internal/cursor-event-relay.d.ts +59 -11
  120. package/dist/internal/cursor-event-relay.d.ts.map +1 -1
  121. package/dist/internal/cursor-event-relay.js +133 -26
  122. package/dist/internal/discovery.d.ts.map +1 -1
  123. package/dist/internal/discovery.js +11 -2
  124. package/dist/internal/distribution.d.ts.map +1 -1
  125. package/dist/internal/distribution.js +1 -0
  126. package/dist/internal/handleAgentServeTrigger.d.ts +33 -6
  127. package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
  128. package/dist/internal/handleAgentServeTrigger.js +97 -19
  129. package/dist/internal/init-interview.d.ts +67 -0
  130. package/dist/internal/init-interview.d.ts.map +1 -0
  131. package/dist/internal/init-interview.js +300 -0
  132. package/dist/internal/init-project.d.ts +4 -0
  133. package/dist/internal/init-project.d.ts.map +1 -1
  134. package/dist/internal/init-project.js +40 -16
  135. package/dist/internal/mcp-endpoint.d.ts +7 -0
  136. package/dist/internal/mcp-endpoint.d.ts.map +1 -1
  137. package/dist/internal/mcp-endpoint.js +7 -0
  138. package/dist/internal/server.d.ts.map +1 -1
  139. package/dist/internal/server.js +159 -57
  140. package/dist/internal/session-engine.d.ts.map +1 -1
  141. package/dist/internal/session-engine.js +20 -21
  142. package/dist/internal/session-links.d.ts +14 -0
  143. package/dist/internal/session-links.d.ts.map +1 -0
  144. package/dist/internal/session-links.js +69 -0
  145. package/dist/internal/sessions-client.d.ts.map +1 -1
  146. package/dist/internal/sessions-client.js +1 -0
  147. package/dist/playground/assets/index-ClbuaLpm.css +1 -0
  148. package/dist/playground/assets/{index-0oqXUkrR.js → index-SqkR13k_.js} +39 -39
  149. package/dist/playground/index.html +2 -2
  150. package/dist/types.d.ts +19 -12
  151. package/dist/types.d.ts.map +1 -1
  152. package/docs/README.md +15 -0
  153. package/docs/example-agents/fsd.md +3 -0
  154. package/docs/example-agents/security-reviewer.md +3 -0
  155. package/docs/guides/convert-automation.md +176 -0
  156. package/docs/guides/github.md +6 -2
  157. package/docs/reference/cli.md +34 -10
  158. package/docs/scaffolding-agents.md +3 -0
  159. package/docs/templates/agentic-owners.md +97 -0
  160. package/docs/templates/demo.md +84 -0
  161. package/docs/templates/pr-autofixer.md +136 -0
  162. package/docs/templates/security-reviewer.md +89 -0
  163. package/package.json +9 -1
  164. package/skills/github/SKILL.md +4 -5
  165. package/src/bin/agent-serve.ts +13 -6
  166. package/src/channels/github/github-channel.ts +95 -18
  167. package/src/channels/github/types.ts +31 -0
  168. package/src/channels/origin/cursor-account.ts +64 -0
  169. package/src/channels/origin/events.ts +41 -0
  170. package/src/channels/origin/index.ts +29 -0
  171. package/src/channels/origin/origin-channel.ts +784 -0
  172. package/src/channels/origin/origin-webhook.ts +202 -0
  173. package/src/channels/origin/types.ts +186 -0
  174. package/src/channels/slack/doctor.ts +218 -5
  175. package/src/index.ts +3 -1
  176. package/src/internal/cli-ax.ts +23 -0
  177. package/src/internal/cli-slack.ts +11 -1
  178. package/src/internal/cursor-event-relay.ts +193 -31
  179. package/src/internal/discovery.ts +15 -5
  180. package/src/internal/distribution.ts +1 -0
  181. package/src/internal/handleAgentServeTrigger.ts +129 -19
  182. package/src/internal/init-interview.ts +384 -0
  183. package/src/internal/init-project.ts +70 -15
  184. package/src/internal/mcp-endpoint.ts +7 -0
  185. package/src/internal/server.ts +188 -58
  186. package/src/internal/session-engine.ts +5 -21
  187. package/src/internal/session-links.ts +88 -0
  188. package/src/internal/sessions-client.ts +1 -0
  189. package/src/types.ts +19 -12
  190. package/templates/agentic-owners/README.md +73 -0
  191. package/templates/agentic-owners/agent/agent.ts +15 -0
  192. package/templates/agentic-owners/agent/channels/github.ts +85 -0
  193. package/templates/agentic-owners/agent/instructions.md +34 -0
  194. package/templates/agentic-owners/agent/lib/config.ts +13 -0
  195. package/templates/agentic-owners/agent/lib/github.ts +241 -0
  196. package/templates/agentic-owners/agent/lib/owners/README.md +50 -0
  197. package/templates/agentic-owners/agent/lib/owners/constants.ts +22 -0
  198. package/templates/agentic-owners/agent/lib/owners/decision.ts +485 -0
  199. package/templates/agentic-owners/agent/lib/owners/handles.ts +54 -0
  200. package/templates/agentic-owners/agent/lib/owners/match.ts +177 -0
  201. package/templates/agentic-owners/agent/lib/owners/matching.ts +95 -0
  202. package/templates/agentic-owners/agent/lib/owners/parse.ts +589 -0
  203. package/templates/agentic-owners/agent/lib/owners/policyMode.ts +65 -0
  204. package/templates/agentic-owners/agent/lib/owners/prompt.ts +66 -0
  205. package/templates/agentic-owners/agent/lib/owners/prompts/base-review.md +105 -0
  206. package/templates/agentic-owners/agent/lib/owners/types.ts +45 -0
  207. package/templates/agentic-owners/agent/lib/review.ts +777 -0
  208. package/templates/agentic-owners/agent/tools/record_review.ts +69 -0
  209. package/templates/agentic-owners/evals/evals.config.ts +5 -0
  210. package/templates/agentic-owners/evals/owners.eval.ts +116 -0
  211. package/templates/agentic-owners/package.json +20 -0
  212. package/templates/agentic-owners/tsconfig.json +12 -0
  213. package/templates/demo/README.md +33 -0
  214. package/templates/demo/agent/agent.ts +15 -0
  215. package/templates/demo/agent/channels/github.ts +50 -0
  216. package/templates/demo/agent/channels/queue.ts +30 -0
  217. package/templates/demo/agent/instructions.md +8 -0
  218. package/templates/demo/agent/lib/collect.ts +78 -0
  219. package/templates/demo/agent/tools/record_demo.ts +40 -0
  220. package/templates/demo/evals/demo.eval.ts +33 -0
  221. package/templates/demo/evals/evals.config.ts +5 -0
  222. package/templates/demo/package.json +18 -0
  223. package/templates/demo/tsconfig.json +12 -0
  224. package/templates/pr-autofixer/README.md +44 -0
  225. package/templates/pr-autofixer/agent/agent.ts +22 -0
  226. package/templates/pr-autofixer/agent/channels/drive.ts +40 -0
  227. package/templates/pr-autofixer/agent/channels/github.ts +167 -0
  228. package/templates/pr-autofixer/agent/channels/slack.ts +17 -0
  229. package/templates/pr-autofixer/agent/hooks/bind-agent.ts +19 -0
  230. package/templates/pr-autofixer/agent/instructions.md +83 -0
  231. package/templates/pr-autofixer/agent/lib/affinity.ts +33 -0
  232. package/templates/pr-autofixer/agent/lib/drive-schemas.ts +15 -0
  233. package/templates/pr-autofixer/agent/lib/drive.ts +79 -0
  234. package/templates/pr-autofixer/agent/lib/merge-watch.ts +123 -0
  235. package/templates/pr-autofixer/agent/lib/pr-state.ts +54 -0
  236. package/templates/pr-autofixer/agent/lib/repos.ts +19 -0
  237. package/templates/pr-autofixer/agent/lib/start-drive.ts +122 -0
  238. package/templates/pr-autofixer/agent/lib/webhook-buffer.ts +225 -0
  239. package/templates/pr-autofixer/agent/lib/webhook-routing.ts +231 -0
  240. package/templates/pr-autofixer/agent/storage.ts +7 -0
  241. package/templates/pr-autofixer/agent/tools/drive_pr.ts +22 -0
  242. package/templates/pr-autofixer/evals/coordinator.eval.ts +16 -0
  243. package/templates/pr-autofixer/evals/evals.config.ts +5 -0
  244. package/templates/pr-autofixer/init.json +25 -0
  245. package/templates/pr-autofixer/package.json +18 -0
  246. package/templates/pr-autofixer/tsconfig.json +12 -0
  247. package/templates/security-reviewer/README.md +31 -0
  248. package/templates/security-reviewer/agent/agent.ts +15 -0
  249. package/templates/security-reviewer/agent/channels/github.ts +46 -0
  250. package/templates/security-reviewer/agent/instructions.md +22 -0
  251. package/templates/security-reviewer/agent/lib/repos.ts +5 -0
  252. package/templates/security-reviewer/agent/tools/post_findings.ts +72 -0
  253. package/templates/security-reviewer/evals/evals.config.ts +5 -0
  254. package/templates/security-reviewer/evals/review.eval.ts +53 -0
  255. package/templates/security-reviewer/init.json +25 -0
  256. package/templates/security-reviewer/package.json +18 -0
  257. package/templates/security-reviewer/tsconfig.json +12 -0
  258. package/dist/docs/assets/chunks/@localSearchIndexroot.BFpWSo6D.js +0 -1
  259. package/dist/docs/assets/index.md.COeoSkcF.js +0 -5
  260. package/dist/docs/assets/scaffolding-agents.md.mkc3B_ZW.js +0 -1
  261. package/dist/playground/assets/index-tHCjJxv4.css +0 -1
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Template `init.json`: questions `init` asks, and string replacements
3
+ * it applies while copying the scaffold.
4
+ */
5
+ export declare const TEMPLATE_INIT_FILE = "init.json";
6
+ export interface TemplateQuestion {
7
+ id: string;
8
+ prompt: string;
9
+ hint?: string;
10
+ placeholder?: string;
11
+ default?: string;
12
+ choices?: readonly string[];
13
+ parse?: "owner-repo-list";
14
+ }
15
+ export interface TemplateReplace {
16
+ file: string;
17
+ find: string;
18
+ answer: string;
19
+ as?: "json-array" | "first";
20
+ template?: string;
21
+ }
22
+ export interface TemplateInitSpec {
23
+ questions: TemplateQuestion[];
24
+ replace: TemplateReplace[];
25
+ }
26
+ export declare function posixRel(rel: string): string;
27
+ export declare function isTemplateMetaPath(rel: string): boolean;
28
+ export declare function templateFileHasReplacements(spec: TemplateInitSpec, rel: string): boolean;
29
+ export declare function loadTemplateInitSpec(templateDir: string): Promise<TemplateInitSpec | undefined>;
30
+ export declare function parseTemplateInitSpec(value: unknown): TemplateInitSpec;
31
+ export declare function parseInitVars(flags: readonly string[] | undefined): Record<string, string>;
32
+ export type ParseAnswersResult = {
33
+ ok: true;
34
+ answers: Record<string, string>;
35
+ } | {
36
+ ok: false;
37
+ error: string;
38
+ };
39
+ export type RunTemplateInitResult = {
40
+ ok: true;
41
+ spec?: TemplateInitSpec;
42
+ answers?: Record<string, string>;
43
+ } | {
44
+ ok: false;
45
+ error: string;
46
+ };
47
+ /** Load `init.json`, apply `--var`, and prompt on a TTY. */
48
+ export declare function runTemplateInit(input: {
49
+ templateDir: string;
50
+ vars?: readonly string[];
51
+ interactive: boolean;
52
+ }): Promise<RunTemplateInitResult>;
53
+ export declare function parseTemplateAnswers(spec: TemplateInitSpec, raw: Record<string, string>): ParseAnswersResult;
54
+ export interface CollectAnswersInput {
55
+ spec: TemplateInitSpec;
56
+ vars?: Record<string, string>;
57
+ interactive: boolean;
58
+ ask?: (question: TemplateQuestion) => Promise<string>;
59
+ out?: (text: string) => void;
60
+ }
61
+ export declare function collectTemplateAnswers(input: CollectAnswersInput): Promise<ParseAnswersResult>;
62
+ export declare function applyInitReplacements(contents: string, rel: string, spec: TemplateInitSpec, answers: Record<string, string>): string;
63
+ export declare function promptTemplateQuestion(question: TemplateQuestion, options?: {
64
+ input?: NodeJS.ReadableStream;
65
+ output?: NodeJS.WritableStream;
66
+ }): Promise<string>;
67
+ //# sourceMappingURL=init-interview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-interview.d.ts","sourceRoot":"","sources":["../../src/internal/init-interview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Template `init.json`: questions `init` asks, and string replacements
3
+ * it applies while copying the scaffold.
4
+ */
5
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
7
+ return new (P || (P = Promise))(function (resolve, reject) {
8
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
9
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
10
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
11
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
12
+ });
13
+ };
14
+ import { readFile } from "node:fs/promises";
15
+ import { join } from "node:path";
16
+ import { createInterface } from "node:readline";
17
+ import { parseCursorGithubRepoScope } from "../channels/github/cursor-account.js";
18
+ import { describeError } from "./describe-error.js";
19
+ export const TEMPLATE_INIT_FILE = "init.json";
20
+ export function posixRel(rel) {
21
+ return rel.replaceAll("\\", "/");
22
+ }
23
+ export function isTemplateMetaPath(rel) {
24
+ const normalized = posixRel(rel);
25
+ const top = normalized.split("/")[0];
26
+ if (top === "overlays") {
27
+ return true;
28
+ }
29
+ return (normalized === TEMPLATE_INIT_FILE ||
30
+ normalized.endsWith(`/${TEMPLATE_INIT_FILE}`));
31
+ }
32
+ export function templateFileHasReplacements(spec, rel) {
33
+ const file = posixRel(rel);
34
+ return spec.replace.some((rule) => posixRel(rule.file) === file);
35
+ }
36
+ export function loadTemplateInitSpec(templateDir) {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ try {
39
+ const text = yield readFile(join(templateDir, TEMPLATE_INIT_FILE), "utf8");
40
+ return parseTemplateInitSpec(JSON.parse(text));
41
+ }
42
+ catch (error) {
43
+ if (error.code === "ENOENT") {
44
+ return undefined;
45
+ }
46
+ throw error;
47
+ }
48
+ });
49
+ }
50
+ export function parseTemplateInitSpec(value) {
51
+ if (!isRecord(value) || !Array.isArray(value.questions)) {
52
+ throw new Error(`${TEMPLATE_INIT_FILE} must have a questions array`);
53
+ }
54
+ const questions = value.questions.map((item, index) => parseQuestion(item, index));
55
+ const replace = Array.isArray(value.replace)
56
+ ? value.replace.map((item, index) => parseReplace(item, index))
57
+ : [];
58
+ return { questions, replace };
59
+ }
60
+ export function parseInitVars(flags) {
61
+ const vars = {};
62
+ if (flags === undefined) {
63
+ return vars;
64
+ }
65
+ for (const flag of flags) {
66
+ const eq = flag.indexOf("=");
67
+ if (eq <= 0) {
68
+ throw new Error(`--var must be id=value (got ${JSON.stringify(flag)})`);
69
+ }
70
+ vars[flag.slice(0, eq)] = flag.slice(eq + 1);
71
+ }
72
+ return vars;
73
+ }
74
+ /** Load `init.json`, apply `--var`, and prompt on a TTY. */
75
+ export function runTemplateInit(input) {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ try {
78
+ const spec = yield loadTemplateInitSpec(input.templateDir);
79
+ if (spec === undefined) {
80
+ return { ok: true };
81
+ }
82
+ const collected = yield collectTemplateAnswers({
83
+ spec,
84
+ vars: parseInitVars(input.vars),
85
+ interactive: input.interactive,
86
+ });
87
+ if (!collected.ok) {
88
+ return collected;
89
+ }
90
+ return { ok: true, spec, answers: collected.answers };
91
+ }
92
+ catch (error) {
93
+ return { ok: false, error: describeError(error) };
94
+ }
95
+ });
96
+ }
97
+ export function parseTemplateAnswers(spec, raw) {
98
+ var _a;
99
+ const answers = {};
100
+ for (const question of spec.questions) {
101
+ if (!(question.id in raw)) {
102
+ continue;
103
+ }
104
+ const parsed = parseQuestionValue(question, (_a = raw[question.id]) !== null && _a !== void 0 ? _a : "");
105
+ if (!parsed.ok) {
106
+ return parsed;
107
+ }
108
+ answers[question.id] = parsed.value;
109
+ }
110
+ return { ok: true, answers };
111
+ }
112
+ export function collectTemplateAnswers(input) {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ var _a, _b, _c, _d;
115
+ const vars = (_a = input.vars) !== null && _a !== void 0 ? _a : {};
116
+ const answers = {};
117
+ const ask = (_b = input.ask) !== null && _b !== void 0 ? _b : promptTemplateQuestion;
118
+ const out = (_c = input.out) !== null && _c !== void 0 ? _c : ((text) => process.stdout.write(text));
119
+ for (const question of input.spec.questions) {
120
+ if (question.id in vars) {
121
+ const parsed = parseQuestionValue(question, (_d = vars[question.id]) !== null && _d !== void 0 ? _d : "");
122
+ if (!parsed.ok) {
123
+ return parsed;
124
+ }
125
+ answers[question.id] = parsed.value;
126
+ continue;
127
+ }
128
+ if (!input.interactive) {
129
+ continue;
130
+ }
131
+ for (;;) {
132
+ const line = yield ask(question);
133
+ const value = line.trim() === "" && question.default !== undefined
134
+ ? question.default
135
+ : line;
136
+ const parsed = parseQuestionValue(question, value);
137
+ if (parsed.ok) {
138
+ answers[question.id] = parsed.value;
139
+ break;
140
+ }
141
+ out(`${parsed.error}\n`);
142
+ }
143
+ }
144
+ return { ok: true, answers };
145
+ });
146
+ }
147
+ export function applyInitReplacements(contents, rel, spec, answers) {
148
+ const file = posixRel(rel);
149
+ let next = contents;
150
+ for (const rule of spec.replace) {
151
+ if (posixRel(rule.file) !== file) {
152
+ continue;
153
+ }
154
+ const value = formatReplaceValue(rule, answers);
155
+ if (value === undefined) {
156
+ continue;
157
+ }
158
+ if (!next.includes(rule.find)) {
159
+ throw new Error(`${TEMPLATE_INIT_FILE}: ${rule.find} not found in ${rel}`);
160
+ }
161
+ next = replaceLiteral(next, rule.find, value);
162
+ }
163
+ return next;
164
+ }
165
+ export function promptTemplateQuestion(question_1) {
166
+ return __awaiter(this, arguments, void 0, function* (question, options = {}) {
167
+ var _a, _b;
168
+ const input = (_a = options.input) !== null && _a !== void 0 ? _a : process.stdin;
169
+ const output = (_b = options.output) !== null && _b !== void 0 ? _b : process.stdout;
170
+ const rl = createInterface({ input, output });
171
+ const suffix = promptSuffix(question);
172
+ try {
173
+ if (question.hint !== undefined) {
174
+ output.write(` ${question.hint}\n`);
175
+ }
176
+ return yield new Promise((resolve) => {
177
+ rl.question(`${question.prompt}${suffix} `, resolve);
178
+ });
179
+ }
180
+ finally {
181
+ rl.close();
182
+ }
183
+ });
184
+ }
185
+ function replaceLiteral(haystack, find, value) {
186
+ return haystack.replaceAll(find, () => value);
187
+ }
188
+ function promptSuffix(question) {
189
+ if (question.choices !== undefined && question.choices.length > 0) {
190
+ return ` [${question.choices.join("/")}]`;
191
+ }
192
+ if (question.default !== undefined) {
193
+ return ` [${question.default}]`;
194
+ }
195
+ if (question.placeholder !== undefined) {
196
+ return ` (${question.placeholder})`;
197
+ }
198
+ return "";
199
+ }
200
+ function parseQuestionValue(question, raw) {
201
+ const trimmed = raw.trim();
202
+ if (trimmed === "") {
203
+ return { ok: false, error: `${question.id} is required.` };
204
+ }
205
+ if (question.choices !== undefined && question.choices.length > 0) {
206
+ if (!question.choices.includes(trimmed)) {
207
+ return {
208
+ ok: false,
209
+ error: `${question.id} must be one of ${question.choices.join(", ")}.`,
210
+ };
211
+ }
212
+ return { ok: true, value: trimmed };
213
+ }
214
+ if (question.parse === "owner-repo-list") {
215
+ try {
216
+ const scope = parseCursorGithubRepoScope(trimmed.split(",").map((repo) => repo.trim()));
217
+ return { ok: true, value: scope.repos.join(", ") };
218
+ }
219
+ catch (error) {
220
+ return { ok: false, error: describeError(error) };
221
+ }
222
+ }
223
+ return { ok: true, value: trimmed };
224
+ }
225
+ function formatReplaceValue(rule, answers) {
226
+ const raw = answers[rule.answer];
227
+ if (raw === undefined || raw === "") {
228
+ return undefined;
229
+ }
230
+ const parts = raw.split(",").map((part) => part.trim());
231
+ let value = raw;
232
+ if (rule.as === "json-array") {
233
+ value = `[${parts.map((part) => JSON.stringify(part)).join(", ")}]`;
234
+ }
235
+ else if (rule.as === "first") {
236
+ const first = parts[0];
237
+ if (first === undefined || first === "") {
238
+ return undefined;
239
+ }
240
+ value = first;
241
+ }
242
+ if (rule.template !== undefined) {
243
+ return replaceLiteral(rule.template, "{{value}}", value);
244
+ }
245
+ return value;
246
+ }
247
+ function parseQuestion(value, index) {
248
+ if (!isRecord(value) || typeof value.id !== "string" || value.id === "") {
249
+ throw new Error(`${TEMPLATE_INIT_FILE} questions[${index}] needs an id`);
250
+ }
251
+ if (typeof value.prompt !== "string" || value.prompt === "") {
252
+ throw new Error(`${TEMPLATE_INIT_FILE} questions[${value.id}] needs a prompt`);
253
+ }
254
+ const question = {
255
+ id: value.id,
256
+ prompt: value.prompt,
257
+ };
258
+ if (typeof value.hint === "string") {
259
+ question.hint = value.hint;
260
+ }
261
+ if (typeof value.placeholder === "string") {
262
+ question.placeholder = value.placeholder;
263
+ }
264
+ if (typeof value.default === "string") {
265
+ question.default = value.default;
266
+ }
267
+ if (Array.isArray(value.choices)) {
268
+ question.choices = value.choices.map((choice) => String(choice));
269
+ }
270
+ if (value.parse === "owner-repo-list") {
271
+ question.parse = "owner-repo-list";
272
+ }
273
+ return question;
274
+ }
275
+ function parseReplace(value, index) {
276
+ if (!isRecord(value) ||
277
+ typeof value.file !== "string" ||
278
+ value.file === "" ||
279
+ typeof value.find !== "string" ||
280
+ value.find === "" ||
281
+ typeof value.answer !== "string" ||
282
+ value.answer === "") {
283
+ throw new Error(`${TEMPLATE_INIT_FILE} replace[${index}] needs file, find, and answer`);
284
+ }
285
+ const rule = {
286
+ file: value.file,
287
+ find: value.find,
288
+ answer: value.answer,
289
+ };
290
+ if (value.as === "json-array" || value.as === "first") {
291
+ rule.as = value.as;
292
+ }
293
+ if (typeof value.template === "string") {
294
+ rule.template = value.template;
295
+ }
296
+ return rule;
297
+ }
298
+ function isRecord(value) {
299
+ return typeof value === "object" && value !== null && !Array.isArray(value);
300
+ }
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Scaffold a minimal agent-serve project (`agent-serve init`).
3
3
  */
4
+ import { type TemplateInitSpec } from "./init-interview.js";
4
5
  export interface InitProjectOptions {
5
6
  /** Directory to create (created if missing). */
6
7
  dir: string;
@@ -11,6 +12,9 @@ export interface InitProjectOptions {
11
12
  templateDir?: string;
12
13
  overlayDir?: string;
13
14
  templateName?: string;
15
+ /** Answers collected from `init.json` / `--var`. */
16
+ answers?: Record<string, string>;
17
+ initSpec?: TemplateInitSpec;
14
18
  }
15
19
  export type InitFileAction = "create" | "exist";
16
20
  export interface InitFileEntry {
@@ -1 +1 @@
1
- {"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"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"}
@@ -15,16 +15,21 @@ import { existsSync, readFileSync } from "node:fs";
15
15
  import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
16
16
  import { basename, dirname, join, relative, resolve } from "node:path";
17
17
  import { CLI_COMMAND_NAME, PACKAGE_NAME, packageRootDir, packageVersion, } from "./distribution.js";
18
+ import { applyInitReplacements, isTemplateMetaPath, loadTemplateInitSpec, posixRel, templateFileHasReplacements, } from "./init-interview.js";
18
19
  import { makePalette, stdoutPalette, } from "./terminal-style.js";
19
- const TRIAGE_OVERLAYS = {
20
- "triage-linear": "linear",
21
- "triage-jira": "jira",
20
+ const TEMPLATES = {
21
+ "agentic-owners": { dir: "agentic-owners" },
22
+ demo: { dir: "demo" },
23
+ "pr-autofixer": { dir: "pr-autofixer" },
24
+ "security-reviewer": { dir: "security-reviewer" },
25
+ "triage-linear": { dir: "triage", overlay: "linear" },
26
+ "triage-jira": { dir: "triage", overlay: "jira" },
22
27
  };
23
28
  function canonicalTemplateName(name) {
24
29
  return name === "triage" ? "triage-linear" : name;
25
30
  }
26
31
  export function availableTemplates() {
27
- return Object.keys(TRIAGE_OVERLAYS).sort();
32
+ return Object.keys(TEMPLATES).sort();
28
33
  }
29
34
  export function resolveTemplate(name) {
30
35
  if (!/^[a-z][a-z0-9-]*$/.test(name)) {
@@ -34,19 +39,21 @@ export function resolveTemplate(name) {
34
39
  };
35
40
  }
36
41
  const resolved = canonicalTemplateName(name);
37
- const overlay = TRIAGE_OVERLAYS[resolved];
38
- if (overlay !== undefined) {
39
- const dir = join(packageRootDir(), "templates", "triage");
42
+ const entry = TEMPLATES[resolved];
43
+ if (entry === undefined) {
40
44
  return {
41
- ok: true,
42
- name: resolved,
43
- dir,
44
- overlayDir: join(dir, "overlays", overlay),
45
+ ok: false,
46
+ message: `unknown template "${name}" (available: ${availableTemplates().join(", ")})`,
45
47
  };
46
48
  }
49
+ const dir = join(packageRootDir(), "templates", entry.dir);
47
50
  return {
48
- ok: false,
49
- message: `unknown template "${name}" (available: ${availableTemplates().join(", ")})`,
51
+ ok: true,
52
+ name: resolved,
53
+ dir,
54
+ overlayDir: entry.overlay === undefined
55
+ ? undefined
56
+ : join(dir, "overlays", entry.overlay),
50
57
  };
51
58
  }
52
59
  /**
@@ -121,7 +128,7 @@ const SCAFFOLD_EMPTY_DIRS = [
121
128
  ];
122
129
  export function initProject(options) {
123
130
  return __awaiter(this, void 0, void 0, function* () {
124
- var _a, _b, _c;
131
+ var _a, _b, _c, _d, _e;
125
132
  const rootDir = resolve(options.dir);
126
133
  const projectName = basename(rootDir);
127
134
  const name = (_a = options.name) !== null && _a !== void 0 ? _a : projectName;
@@ -150,6 +157,8 @@ export function initProject(options) {
150
157
  const overlaySet = new Set(overlayPaths);
151
158
  const corePaths = (yield listTemplateFiles(templateDir)).filter((rel) => !overlaySet.has(rel));
152
159
  const templateName = (_c = options.templateName) !== null && _c !== void 0 ? _c : basename(templateDir);
160
+ const initSpec = (_d = options.initSpec) !== null && _d !== void 0 ? _d : (yield loadTemplateInitSpec(templateDir));
161
+ const answers = (_e = options.answers) !== null && _e !== void 0 ? _e : {};
153
162
  for (const rel of corePaths) {
154
163
  yield writeTemplateFile({
155
164
  write,
@@ -157,6 +166,8 @@ export function initProject(options) {
157
166
  rel,
158
167
  projectName,
159
168
  templateName,
169
+ initSpec,
170
+ answers,
160
171
  });
161
172
  }
162
173
  if (overlayDir !== undefined) {
@@ -167,6 +178,8 @@ export function initProject(options) {
167
178
  rel,
168
179
  projectName,
169
180
  templateName,
181
+ initSpec,
182
+ answers,
170
183
  });
171
184
  }
172
185
  }
@@ -280,8 +293,8 @@ function listTemplateFiles(root) {
280
293
  });
281
294
  return entries
282
295
  .filter((entry) => entry.isFile())
283
- .map((entry) => relative(root, join(entry.parentPath, entry.name)))
284
- .filter((rel) => rel.split(/[\\/]/)[0] !== "overlays")
296
+ .map((entry) => posixRel(relative(root, join(entry.parentPath, entry.name))))
297
+ .filter((rel) => !isTemplateMetaPath(rel))
285
298
  .sort();
286
299
  });
287
300
  }
@@ -296,6 +309,11 @@ function writeTemplateFile(input) {
296
309
  yield input.write(input.rel, `${JSON.stringify(packageJson, null, 2)}\n`);
297
310
  return;
298
311
  }
312
+ if (input.initSpec !== undefined &&
313
+ templateFileHasReplacements(input.initSpec, input.rel)) {
314
+ yield input.write(input.rel, applyInitReplacements(yield readFile(source, "utf8"), input.rel, input.initSpec, input.answers));
315
+ return;
316
+ }
299
317
  yield input.write(input.rel, yield readFile(source));
300
318
  });
301
319
  }
@@ -582,8 +600,14 @@ export function printInitGuide() {
582
600
 
583
601
  Scaffold a project, then open the playground:
584
602
  npx ${PACKAGE_NAME} init ./my-agent # installs deps + links agent-sdk onto PATH
603
+ npx ${PACKAGE_NAME} init ./my-demo --template demo # record a PR walkthrough
604
+ npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
585
605
  npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
586
606
  npx ${PACKAGE_NAME} init ./my-triage --template triage-jira # comment on Jira issues
607
+ npx ${PACKAGE_NAME} init ./my-owners --template agentic-owners # review PRs via owners policies
608
+ npx ${PACKAGE_NAME} init ./pr-autofixer --template pr-autofixer # fix PRs on a cloud VM
609
+ # TTY asks for GitHub repos. Scripts pass --var:
610
+ # --var repos=acme/widgets,acme/api
587
611
  cd ./my-agent && agent-sdk dev # or: npx ${PACKAGE_NAME} dev
588
612
 
589
613
  Recommended loop once the project exists (from the project directory):
@@ -42,6 +42,13 @@ interface ConnectableMcpServer {
42
42
  * transport per POST, JSON response mode, spec-compliant 405 on other
43
43
  * methods. Shared by the per-agent MCP endpoint and the Cursor account
44
44
  * bridge so the subtle transport/error plumbing exists once.
45
+ *
46
+ * Origin MCP in `backend/server/src/origin/mcp/originMcpHttpHandler.ts`
47
+ * is not a 1:1 copy: it races `request.signal` so a tool that ignores abort
48
+ * cannot hang, while this helper has no such backstop and still leaks an
49
+ * unsettled promise. backend/server cannot import `@cursor/july` internals,
50
+ * so Origin diverges on purpose. Do not extract a shared package, and do
51
+ * not port the abort race here, in that stack.
45
52
  */
46
53
  export declare function handleStatelessMcpRequest(args: {
47
54
  request: Request;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-endpoint.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AAOzH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AACvE,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAUtD,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvE;AAED,yEAAyE;AACzE,UAAU,oBAAoB;IAC5B,OAAO,CAAC,SAAS,EAAE,wCAAwC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,oBAAoB,CAAC;IACxC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyCpB;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAMpE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,gBAAgB,CAanB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,gBAAgB,CAyBnB"}
1
+ {"version":3,"file":"mcp-endpoint.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AAOzH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AACvE,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAUtD,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvE;AAED,yEAAyE;AACzE,UAAU,oBAAoB;IAC5B,OAAO,CAAC,SAAS,EAAE,wCAAwC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,oBAAoB,CAAC;IACxC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyCpB;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAMpE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,gBAAgB,CAanB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,gBAAgB,CAyBnB"}
@@ -49,6 +49,13 @@ const DEFAULT_WAIT_SECONDS = 50;
49
49
  * transport per POST, JSON response mode, spec-compliant 405 on other
50
50
  * methods. Shared by the per-agent MCP endpoint and the Cursor account
51
51
  * bridge so the subtle transport/error plumbing exists once.
52
+ *
53
+ * Origin MCP in `backend/server/src/origin/mcp/originMcpHttpHandler.ts`
54
+ * is not a 1:1 copy: it races `request.signal` so a tool that ignores abort
55
+ * cannot hang, while this helper has no such backstop and still leaks an
56
+ * unsettled promise. backend/server cannot import `@cursor/july` internals,
57
+ * so Origin diverges on purpose. Do not extract a shared package, and do
58
+ * not port the abort race here, in that stack.
52
59
  */
53
60
  export function handleStatelessMcpRequest(args) {
54
61
  return __awaiter(this, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6BH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAOhB,YAAY,EACb,MAAM,aAAa,CAAC;AA6GrB,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,iBAAiB,CAAC;AAwBzB,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAaD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAyvB3B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAOhB,YAAY,EACb,MAAM,aAAa,CAAC;AAgHrB,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAwBpE,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAaD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAywB3B"}