@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.
- package/dist/bin/agent-serve.js +30 -23
- package/dist/channels/github/github-channel.d.ts +12 -0
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +67 -15
- package/dist/channels/github/types.d.ts +27 -1
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/origin/cursor-account.d.ts +22 -0
- package/dist/channels/origin/cursor-account.d.ts.map +1 -0
- package/dist/channels/origin/cursor-account.js +35 -0
- package/dist/channels/origin/events.d.ts +10 -0
- package/dist/channels/origin/events.d.ts.map +1 -0
- package/dist/channels/origin/events.js +27 -0
- package/dist/channels/origin/index.d.ts +29 -0
- package/dist/channels/origin/index.d.ts.map +1 -0
- package/dist/channels/origin/index.js +28 -0
- package/dist/channels/origin/origin-channel.d.ts +68 -0
- package/dist/channels/origin/origin-channel.d.ts.map +1 -0
- package/dist/channels/origin/origin-channel.js +567 -0
- package/dist/channels/origin/origin-webhook.d.ts +38 -0
- package/dist/channels/origin/origin-webhook.d.ts.map +1 -0
- package/dist/channels/origin/origin-webhook.js +151 -0
- package/dist/channels/origin/types.d.ts +152 -0
- package/dist/channels/origin/types.d.ts.map +1 -0
- package/dist/channels/origin/types.js +1 -0
- package/dist/channels/slack/doctor.d.ts +17 -1
- package/dist/channels/slack/doctor.d.ts.map +1 -1
- package/dist/channels/slack/doctor.js +186 -10
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.CVQxhV85.js → app.CW3KJh72.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BuymfBAo.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.QAPzJjql.js → VPLocalSearchBox.Bk6EWpPj.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CSxTCOFu.js → theme.Bz9AodBA.js} +2 -2
- package/dist/docs/assets/{example-agents_fsd.md.DPz9ezO4.js → example-agents_fsd.md.ZeGEpAw_.js} +2 -2
- package/dist/docs/assets/{example-agents_fsd.md.DPz9ezO4.lean.js → example-agents_fsd.md.ZeGEpAw_.lean.js} +1 -1
- package/dist/docs/assets/{example-agents_security-reviewer.md.Dkf1gyo6.js → example-agents_security-reviewer.md.DBL1TwtP.js} +2 -2
- package/dist/docs/assets/{example-agents_security-reviewer.md.Dkf1gyo6.lean.js → example-agents_security-reviewer.md.DBL1TwtP.lean.js} +1 -1
- package/dist/docs/assets/guides_convert-automation.md.BhMzTkE5.js +12 -0
- package/dist/docs/assets/guides_convert-automation.md.BhMzTkE5.lean.js +1 -0
- package/dist/docs/assets/{guides_github.md.B8QKtIpw.js → guides_github.md.CLLQJKRB.js} +4 -4
- package/dist/docs/assets/{guides_github.md.B8QKtIpw.lean.js → guides_github.md.CLLQJKRB.lean.js} +1 -1
- package/dist/docs/assets/index.md.DhRHS_-L.js +5 -0
- package/dist/docs/assets/{index.md.COeoSkcF.lean.js → index.md.DhRHS_-L.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.D_CCfG8R.js → reference_cli.md.Cl14Jfo3.js} +8 -2
- package/dist/docs/assets/{reference_cli.md.D_CCfG8R.lean.js → reference_cli.md.Cl14Jfo3.lean.js} +1 -1
- package/dist/docs/assets/scaffolding-agents.md.CrWSA0Ko.js +1 -0
- package/dist/docs/assets/{scaffolding-agents.md.mkc3B_ZW.lean.js → scaffolding-agents.md.CrWSA0Ko.lean.js} +1 -1
- package/dist/docs/assets/templates_agentic-owners.md.BkTLORaU.js +14 -0
- package/dist/docs/assets/templates_agentic-owners.md.BkTLORaU.lean.js +1 -0
- package/dist/docs/assets/templates_demo.md.Bgd6MBaZ.js +4 -0
- package/dist/docs/assets/templates_demo.md.Bgd6MBaZ.lean.js +1 -0
- package/dist/docs/assets/templates_pr-autofixer.md.DcmoeUNZ.js +8 -0
- package/dist/docs/assets/templates_pr-autofixer.md.DcmoeUNZ.lean.js +1 -0
- package/dist/docs/assets/templates_security-reviewer.md.C0yIUaYs.js +2 -0
- package/dist/docs/assets/templates_security-reviewer.md.C0yIUaYs.lean.js +1 -0
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/evals.html +4 -4
- package/dist/docs/example-agents/approval-buddy.html +4 -4
- package/dist/docs/example-agents/benny.html +4 -4
- package/dist/docs/example-agents/bugbot.html +4 -4
- package/dist/docs/example-agents/codebase-wiki.html +4 -4
- package/dist/docs/example-agents/codeowners-review.html +4 -4
- package/dist/docs/example-agents/concierge.html +4 -4
- package/dist/docs/example-agents/fsd.html +5 -5
- package/dist/docs/example-agents/index.html +4 -4
- package/dist/docs/example-agents/knowledge-base.html +4 -4
- package/dist/docs/example-agents/oncall.html +4 -4
- package/dist/docs/example-agents/security-reviewer.html +5 -5
- package/dist/docs/example-agents/slack-agent.html +4 -4
- package/dist/docs/example-agents/weather-agent.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/convert-automation.html +36 -0
- package/dist/docs/guides/github.html +7 -7
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +4 -4
- package/dist/docs/guides/opentelemetry.html +4 -4
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +12 -6
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +4 -4
- package/dist/docs/scaffolding-agents.html +5 -5
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +38 -0
- package/dist/docs/templates/demo.html +28 -0
- package/dist/docs/templates/pr-autofixer.html +32 -0
- package/dist/docs/templates/security-reviewer.html +26 -0
- package/dist/docs/templates/triage.html +5 -5
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/internal/cli-ax.d.ts +2 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +20 -0
- package/dist/internal/cli-slack.d.ts +2 -0
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +11 -2
- package/dist/internal/cursor-event-relay.d.ts +59 -11
- package/dist/internal/cursor-event-relay.d.ts.map +1 -1
- package/dist/internal/cursor-event-relay.js +133 -26
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +11 -2
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +1 -0
- package/dist/internal/handleAgentServeTrigger.d.ts +33 -6
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
- package/dist/internal/handleAgentServeTrigger.js +97 -19
- package/dist/internal/init-interview.d.ts +67 -0
- package/dist/internal/init-interview.d.ts.map +1 -0
- package/dist/internal/init-interview.js +300 -0
- package/dist/internal/init-project.d.ts +4 -0
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +40 -16
- package/dist/internal/mcp-endpoint.d.ts +7 -0
- package/dist/internal/mcp-endpoint.d.ts.map +1 -1
- package/dist/internal/mcp-endpoint.js +7 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +159 -57
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +20 -21
- package/dist/internal/session-links.d.ts +14 -0
- package/dist/internal/session-links.d.ts.map +1 -0
- package/dist/internal/session-links.js +69 -0
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +1 -0
- package/dist/playground/assets/index-ClbuaLpm.css +1 -0
- package/dist/playground/assets/{index-0oqXUkrR.js → index-SqkR13k_.js} +39 -39
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +19 -12
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +15 -0
- package/docs/example-agents/fsd.md +3 -0
- package/docs/example-agents/security-reviewer.md +3 -0
- package/docs/guides/convert-automation.md +176 -0
- package/docs/guides/github.md +6 -2
- package/docs/reference/cli.md +34 -10
- package/docs/scaffolding-agents.md +3 -0
- package/docs/templates/agentic-owners.md +97 -0
- package/docs/templates/demo.md +84 -0
- package/docs/templates/pr-autofixer.md +136 -0
- package/docs/templates/security-reviewer.md +89 -0
- package/package.json +9 -1
- package/skills/github/SKILL.md +4 -5
- package/src/bin/agent-serve.ts +13 -6
- package/src/channels/github/github-channel.ts +95 -18
- package/src/channels/github/types.ts +31 -0
- package/src/channels/origin/cursor-account.ts +64 -0
- package/src/channels/origin/events.ts +41 -0
- package/src/channels/origin/index.ts +29 -0
- package/src/channels/origin/origin-channel.ts +784 -0
- package/src/channels/origin/origin-webhook.ts +202 -0
- package/src/channels/origin/types.ts +186 -0
- package/src/channels/slack/doctor.ts +218 -5
- package/src/index.ts +3 -1
- package/src/internal/cli-ax.ts +23 -0
- package/src/internal/cli-slack.ts +11 -1
- package/src/internal/cursor-event-relay.ts +193 -31
- package/src/internal/discovery.ts +15 -5
- package/src/internal/distribution.ts +1 -0
- package/src/internal/handleAgentServeTrigger.ts +129 -19
- package/src/internal/init-interview.ts +384 -0
- package/src/internal/init-project.ts +70 -15
- package/src/internal/mcp-endpoint.ts +7 -0
- package/src/internal/server.ts +188 -58
- package/src/internal/session-engine.ts +5 -21
- package/src/internal/session-links.ts +88 -0
- package/src/internal/sessions-client.ts +1 -0
- package/src/types.ts +19 -12
- package/templates/agentic-owners/README.md +73 -0
- package/templates/agentic-owners/agent/agent.ts +15 -0
- package/templates/agentic-owners/agent/channels/github.ts +85 -0
- package/templates/agentic-owners/agent/instructions.md +34 -0
- package/templates/agentic-owners/agent/lib/config.ts +13 -0
- package/templates/agentic-owners/agent/lib/github.ts +241 -0
- package/templates/agentic-owners/agent/lib/owners/README.md +50 -0
- package/templates/agentic-owners/agent/lib/owners/constants.ts +22 -0
- package/templates/agentic-owners/agent/lib/owners/decision.ts +485 -0
- package/templates/agentic-owners/agent/lib/owners/handles.ts +54 -0
- package/templates/agentic-owners/agent/lib/owners/match.ts +177 -0
- package/templates/agentic-owners/agent/lib/owners/matching.ts +95 -0
- package/templates/agentic-owners/agent/lib/owners/parse.ts +589 -0
- package/templates/agentic-owners/agent/lib/owners/policyMode.ts +65 -0
- package/templates/agentic-owners/agent/lib/owners/prompt.ts +66 -0
- package/templates/agentic-owners/agent/lib/owners/prompts/base-review.md +105 -0
- package/templates/agentic-owners/agent/lib/owners/types.ts +45 -0
- package/templates/agentic-owners/agent/lib/review.ts +777 -0
- package/templates/agentic-owners/agent/tools/record_review.ts +69 -0
- package/templates/agentic-owners/evals/evals.config.ts +5 -0
- package/templates/agentic-owners/evals/owners.eval.ts +116 -0
- package/templates/agentic-owners/package.json +20 -0
- package/templates/agentic-owners/tsconfig.json +12 -0
- package/templates/demo/README.md +33 -0
- package/templates/demo/agent/agent.ts +15 -0
- package/templates/demo/agent/channels/github.ts +50 -0
- package/templates/demo/agent/channels/queue.ts +30 -0
- package/templates/demo/agent/instructions.md +8 -0
- package/templates/demo/agent/lib/collect.ts +78 -0
- package/templates/demo/agent/tools/record_demo.ts +40 -0
- package/templates/demo/evals/demo.eval.ts +33 -0
- package/templates/demo/evals/evals.config.ts +5 -0
- package/templates/demo/package.json +18 -0
- package/templates/demo/tsconfig.json +12 -0
- package/templates/pr-autofixer/README.md +44 -0
- package/templates/pr-autofixer/agent/agent.ts +22 -0
- package/templates/pr-autofixer/agent/channels/drive.ts +40 -0
- package/templates/pr-autofixer/agent/channels/github.ts +167 -0
- package/templates/pr-autofixer/agent/channels/slack.ts +17 -0
- package/templates/pr-autofixer/agent/hooks/bind-agent.ts +19 -0
- package/templates/pr-autofixer/agent/instructions.md +83 -0
- package/templates/pr-autofixer/agent/lib/affinity.ts +33 -0
- package/templates/pr-autofixer/agent/lib/drive-schemas.ts +15 -0
- package/templates/pr-autofixer/agent/lib/drive.ts +79 -0
- package/templates/pr-autofixer/agent/lib/merge-watch.ts +123 -0
- package/templates/pr-autofixer/agent/lib/pr-state.ts +54 -0
- package/templates/pr-autofixer/agent/lib/repos.ts +19 -0
- package/templates/pr-autofixer/agent/lib/start-drive.ts +122 -0
- package/templates/pr-autofixer/agent/lib/webhook-buffer.ts +225 -0
- package/templates/pr-autofixer/agent/lib/webhook-routing.ts +231 -0
- package/templates/pr-autofixer/agent/storage.ts +7 -0
- package/templates/pr-autofixer/agent/tools/drive_pr.ts +22 -0
- package/templates/pr-autofixer/evals/coordinator.eval.ts +16 -0
- package/templates/pr-autofixer/evals/evals.config.ts +5 -0
- package/templates/pr-autofixer/init.json +25 -0
- package/templates/pr-autofixer/package.json +18 -0
- package/templates/pr-autofixer/tsconfig.json +12 -0
- package/templates/security-reviewer/README.md +31 -0
- package/templates/security-reviewer/agent/agent.ts +15 -0
- package/templates/security-reviewer/agent/channels/github.ts +46 -0
- package/templates/security-reviewer/agent/instructions.md +22 -0
- package/templates/security-reviewer/agent/lib/repos.ts +5 -0
- package/templates/security-reviewer/agent/tools/post_findings.ts +72 -0
- package/templates/security-reviewer/evals/evals.config.ts +5 -0
- package/templates/security-reviewer/evals/review.eval.ts +53 -0
- package/templates/security-reviewer/init.json +25 -0
- package/templates/security-reviewer/package.json +18 -0
- package/templates/security-reviewer/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.BFpWSo6D.js +0 -1
- package/dist/docs/assets/index.md.COeoSkcF.js +0 -5
- package/dist/docs/assets/scaffolding-agents.md.mkc3B_ZW.js +0 -1
- 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":"AAAA;;GAEG;
|
|
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
|
|
20
|
-
"
|
|
21
|
-
|
|
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(
|
|
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
|
|
38
|
-
if (
|
|
39
|
-
const dir = join(packageRootDir(), "templates", "triage");
|
|
42
|
+
const entry = TEMPLATES[resolved];
|
|
43
|
+
if (entry === undefined) {
|
|
40
44
|
return {
|
|
41
|
-
ok:
|
|
42
|
-
name:
|
|
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:
|
|
49
|
-
|
|
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
|
|
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
|
|
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;
|
|
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"}
|